首页 > 解决方案 > 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”的重要性,对此我很感激。)

标签: verilogfpga

解决方案


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

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

如果您遵循标准注册模板,您只需实例化一个注册always @(posedge clk) ....

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

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

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 :-) 

另见这篇文章


推荐阅读