verilog - 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
如果答案很明显,请原谅....但在我的 ACTUAL verilog 中,数据可以是 256 位宽并使用 8 位或更大的地址进行寻址,如果可以单独布线,我会尽量避免占用存储空间而且我仍在学习使用 FPGA……(我纠正说这无论如何都是组合逻辑,所以无论如何在引擎盖下都是等效的,因为我误解了“reg”的重要性,对此我很感激。)
解决方案
您没有使用/制作寄存器!
reg
关键字具有误导性。这并不意味着您创建一个或多个寄存器 如果您在 always 部分中分配给变量,则需要“reg”关键字。
如果您遵循标准注册模板,您只需实例化一个注册always @(posedge clk) ....
。
请注意,在 System Verilog 中,名称wire
和reg
替换为关键字“逻辑”,您仍然可以使用与您使用的完全相同的语法。
我使用“//>>>”标记为您的代码添加了注释
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 :-)
另见这篇文章
推荐阅读
- css - 更具体的选择器解析更快吗?
- javascript - 如果函数默认参数值等于不纯函数,可以吗?
- c# - 调用 web api Android 时加载程序不显示
- sql-server - 到了收盘时间时,我如何关闭拍卖?
- pandas - 熊猫在时间戳中添加增量以打破关系,保留原始顺序
- ios - 从当前视图控制器打开相册(UIImagePickerController)
- sql - 如果您在 SQL Server 中的括号中的操作上调用舍入,是否有效?
- javascript - React/Next.js 如何在按钮单击时获取其他元素事件目标值
- javascript - Javascript 事件不适用于日期时间选择器
- sql - 根据第一列的不同值计算列的不同值