在always块中使用if-else和for循环

时间:2012-06-30 17:15:45

标签: verilog

我想在if-else块中使用foralways循环。我不希望这些if-else一次又一次地执行,所以我不想总是与posedge clknegedge clk连接。

我希望他们只执行一次。我不仅想模拟,而且想要合成Spartan Board。

always @ (**what I should add here**)
    begin
    if(condition)

    else

    end

2 个答案:

答案 0 :(得分:3)

一旦你可以使用initial进行模拟以执行某些事情,但这不是可综合的:

reg x;

initial begin
  if(condition) begin
    x = 1'b0 ;
  end
  else begin
    x = 1'b1 ;
  end
end

回答一般问题always @(**what I should add here**)大多数现代verilog模拟器允许使用*当任何右侧参数改变任何选择条件时触发块(总是开始结束)逻辑。

always @* begin
  if(condition)
    x =  y ;
  else
    x = ~y ;
end

旧的模拟器会要求您在列表中列出需要触发的变量。 always @(condition, y)

如果只选择了1个变量,则线路类型上的分配可能会更好,但这不能仅限于“执行一次”,但可能是您问题的合适选择。虽然

不确定FPGA的适用性
wire [3:0] x ; //4 bit wire
//(condition) ? value if true : value if false ;
assign x = (condition) ? 4'b1010 : 4'b0100 ;

答案 1 :(得分:1)

module oneShot(in, out, enable, reset);
    input in;
    input enable;
    input reset;
    output reg out;

    reg once_only;
    always @ (posedge enable) begin
          if (reset) begin
                once_only <= 0;
          end              
          else if (once_only == 0) begin
                out <= calc_out; // or whatever processing you want
                once_only <= 1;
          end
    end

    always @(*) begin
          // calculate ouput here always
          calc_out = 1 +  7 +100+ in;
    end
endmodule

你不能让那些if语句只计算一次。这是硬件,它总是会计算。但是你可以在计算一次后保持输出稳定。您仍在尝试编写软件功能并将其放入硬件而不是描述可以解决问题的硬件。我看不出你会以这种方式获得一个体面的设计。当然你可以制作一些小块并合成它们(最终),但是完整的设计??