Verilog :在矢量中分配一根电线高电平而将电线定为低电平?



在FPGA上,而不是使用寄存器,例如;

module FooReg(output wire o_foo, input wire [1:0] i_address);
parameter FOO_MSB = 3;
reg [FOO_MSB:0] r_data = 0;
assign o_foo = r_data[FOO_MSB]; // OUTPUT HEAD OF FOO
always @(*)
begin
r_data            = 0;        // RESET DATA VECTOR
r_data[i_address] = 1'b1;     // SET ADDRESSED ELEMENT OF VECTOR
end
endmodule // FooReg

但是有没有办法仅使用 NET 实现相同的功能?

例如;

module FooNet(output wire o_foo, input wire [1:0] i_address);
parameter FOO_MSB = 3;
wire [FOO_MSB:0] w_data = (w_data[i_address] is 1'b1) BUT REST ARE 1'b0; // <------
assign o_foo = w_data[FOO_MSB]; // OUTPUT HEAD OF FOO
endmodule // FooNet

如果答案很明显,请原谅我....但是在我的实际 verilog 中,数据可以是 256 位宽并使用 8 位或更大的地址,如果可以单独布线完成,我试图避免占用存储,并且我仍在学习使用 FPGA...(我纠正说,无论如何,这都是组合逻辑,所以无论如何都是等价的,因为我误解了"reg"的重要性,我很感激。

您没有使用/制作寄存器!

reg关键字具有误导性。这并不意味着您创建一个或多个寄存器 如果您在 always 部分中分配给变量,则需要 'reg' 关键字。

仅当您遵循标准寄存器模板always @(posedge clk) ....时,才能实例化寄存器。

请注意,在System Verilog中,名称wirereg将替换为关键字"logic",您仍然可以使用与使用过的完全相同的语法。

我使用"//>>>"标记为您的代码添加了注释

reg [FOO_MSB:0] r_data = 0;
assign o_foo = r_data[FOO_MSB]; // OUTPUT HEAD OF FOO
//>>> The section below generates a combinatorial circuit 
//>>> and as such you only get logic or wires out of this.
always @(*)
begin
//>>> No you are NOT resetting a register here
//>>> Your setting a vector (a bundle of wires) wire to all zeros 
r_data            = 0;        // RESET REGISTER
//>>> One of the wires is not zero but one
r_data[i_address] = 1'b1;     // SET REQUESTED BIT
end
endmodule // FooRegister //>>> And change the name because no registers are made here :-) 

另见这篇文章

最新更新