Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog 写10位解码器的好方法是什么?_Verilog - Fatal编程技术网

Verilog 写10位解码器的好方法是什么?

Verilog 写10位解码器的好方法是什么?,verilog,Verilog,我正在尝试写一个10位二进制到热解码器 对于4位解码器,它相对简单,如下所示。然而,对于10位,有没有更聪明的方法来代替编写1000行代码 module decoder(in,out); input [3:0] in; output [15:0] out; // input enable; reg [15:0] out; always @(in) begin casez(in) 4'h1: out=16'b00

我正在尝试写一个10位二进制到热解码器

对于4位解码器,它相对简单,如下所示。然而,对于10位,有没有更聪明的方法来代替编写1000行代码

module decoder(in,out);
   input [3:0] in;
   output [15:0] out;
//   input       enable;
   reg [15:0]        out;

   always @(in) begin
      casez(in) 
        4'h1: out=16'b0000000000000001;
        4'h2: out=16'b0000000000000011;
        4'h3: out=16'b0000000000000111;
        4'h4: out=16'b0000000000001111;
        4'h5: out=16'b0000000000011111;
        4'h6: out=16'b0000000000111111;
        4'h7: out=16'b0000000001111111;
        4'h8: out=16'b0000000011111111;
        4'h9: out=16'b0000000111111111;
        4'hA: out=16'b0000001111111111;
        4'hB: out=16'b0000011111111111;
        4'hC: out=16'b0000111111111111;
        4'hD: out=16'b0001111111111111;
        4'hE: out=16'b0011111111111111;
        4'hF: out=16'b0111111111111111;
       default: out=16'h0000;
      endcase
     end

endmodule

是的,您可以通过使用可展开的for循环使该模块完全参数化。如果循环索引仍然小于二进制输入信号,则该循环将检查
out
信号的每一位

代码如下所示:

module decoder #(
  parameter IN_W  = 10,
  parameter OUT_W = 1 << IN_W
)
(
  input      [IN_W-1:0]    in,
  output reg [OUT_W-1:0]   out
);

  integer i;

  always @* begin
    // Use an unrollable loop.
    for (i = 0; i < OUT_W; i++) begin
      // (in < i) returns a 1-bit value
      out[i] = (in < i);
    end
  end

endmodule
模块解码器#(
_W=10中的参数,

参数OUT_W=1 Hi Silicon1602感谢您的回复。但是,该代码仅由系统verilog支持。它不能被合成。对于verilog,将“i”移动到always之外,使其位于模块
整数i;always@(*)(i=0…
我个人更喜欢
OUT[i]=(in
这更清楚地表明,
在我的坏习惯中,我习惯于在SystemVerilog中编写RTL,忘记了索引的声明必须发生在for循环之外。我根据Oldfart的建议修复了我的RTL。(我还在
(in
中包含了他的编码风格建议)不应该
参数OUT\u W=2@MatthewTaylor是的,你是对的。我的意思是把
1