verilog为if / else生成

时间:2014-01-08 16:14:48

标签: verilog

我试着写一些像(在verilog中)的代码:

parameter N = 128;

   if (encoder_in[0] == 1) begin
 23     binary_out = 1; 
 24    end else if (encoder_in[1] == 1) begin
 25     binary_out = 2; 
 26    end else if (encoder_in[2] == 1) begin
 27     binary_out = 3; 
 28    end else if (encoder_in[3] == 1) begin
 29     binary_out = 4; 
 30    end else if (encoder_in[4] == 1) begin
 31     binary_out = 5; 
 32    end else if (encoder_in[5] == 1) begin
 33     binary_out = 6; 
 34    end else if (encoder_in[6] == 1) begin
 35     binary_out = 7; 
 36    end else if (encoder_in[7] == 1) begin
 37     binary_out = 8; 
......
......
 36    end else if (encoder_in[127] == 1) begin
 37     binary_out = 8; 
       end

我希望我可以将N更改为我想要的任何值,它仍然有效。 “生成”会在这里运作吗?那样:

parameter N = 128;

if (encoder_in[0] == 1) begin
binary_out = 1; 
generate for (i=1; i<N; i=i+1) begin
   end else if (encoder_in[i] == 1) begin
   binary_out = i+1; 
end endgenarate

end

如果没有,我该怎么办? 非常感谢!

1 个答案:

答案 0 :(得分:5)

生成块不能在另一个语句中使用。我仍在寻找IEEE std 1800-2012中的确切参考。

如果你想要一个LSB​​具有更高优先级的解码器,那么下面的工作将不使用生成块:

parameter N = 128;
integer i;
...
always @* begin
    binary_out = 0; // default value
    ...
    for(i=N-1; i>=0; i=i-1) begin
        if (encoder_in[i]==1'b1) begin
            binary_out = i+1;
        end
    end
end

请注意,这是使用倒计时循环。计数将优先考虑MSB。