在Verilog中将整数分配给reg

时间:2010-10-17 00:44:23

标签: verilog

我的Verilog代码存在问题。基本上,它不会让我做Y = 3'di声明。基本上,我希望Y等于i。我很确定问题是i。那么,有没有办法在Verilog中做到这一点?此外,W是一个8位输入(换句话说,W[7:0])。

for (i = 7; i >= 0; i = i - 1)
begin
    if(W[i]) Y=3'di;
end

感谢。

3 个答案:

答案 0 :(得分:10)

您可以使用括号选择位。

for (i = 7; i >= 0; i = i - 1)
begin
    if(W[i]) Y = i[2:0];
end

但如果i被声明为整数,则甚至不需要。然而,在Y中会有很多位自动匹配,您只需要LSB。

答案 1 :(得分:2)

您可能希望在此处使用case声明:

case (1'b1)
  W[0]: Y=3'd0;
  W[1]: Y=3'd1;
  W[2]: Y=3'd2;
  W[3]: Y=3'd3;
  W[4]: Y=3'd4;
  W[5]: Y=3'd5;
  W[6]: Y=3'd6;
  W[7]: Y=3'd7;
  default: Y=3'd0; // to avoid inferring a latch when W==8'd0
endcase

这使得优先级对您的代码的读者更加明显。

答案 2 :(得分:0)

我发现使用状态机做“for-loop”例程更好。 像这样:

module yourthing(clk, W, i, Y)
input clk;
input [7:0] W;
output [2:0] Y;
reg [2:0] i;  

always@(posedge clk) begin  
  if(reset) begin  
   i = 3'd7;
   Y = 3'd0;
  end

  else begin
    case(i)
      3'd7 : begin
               if(W[i]) Y = i;
               i = 3'd6;
             end
      3'd6 : begin
               if(W[i]) Y = i;
               i = 3'd5;
             end
      3'd5 : begin
               if(W[i]) Y = i;
               i = 3'd4;
             end
      3'd4 : begin
               if(W[i]) Y = i;
               i = 3'd3;
             end
      3'd3 : begin
               if(W[i]) Y = i;
               i = 3'd2;
             end
      3'd2 : begin
               if(W[i]) Y = i;
               i = 3'd1;
             end
      3'd1 : begin
               if(W[i]) Y = i;
               i = 3'd0;
             end
      3'd0 : begin
               if(W[i]) Y = i;
               i = 3'd7;
             end
    endcase
  end
endmodule

希望这会有所帮助......