Verilog 写10位解码器的好方法是什么?
我正在尝试写一个10位二进制到热解码器 对于4位解码器,它相对简单,如下所示。然而,对于10位,有没有更聪明的方法来代替编写1000行代码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
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