1

我想在一个块内使用if-elsefor循环。always我不希望那些if-else被一次又一次地执行,所以我不想总是与posedge clkor连接negedge clk

我希望它们只被执行一次。我不仅想模拟,而且还想在 Spartan Board 上进行合成。

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

    else

    end
4

2 回答 2

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 ;
于 2012-07-01T08:50:32.360 回答
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 语句只计算一次。它是硬件,它总是会计算。但是你可以在计算一次后保持输出稳定。您仍在尝试编写软件功能并将其放入硬件中,而不是描述可以解决您问题的硬件。我看不出你会以这种方式得到一个像样的设计。当然,您将能够制作一些小部件并合成它们(最终),但是完整的设计?

于 2012-07-02T02:45:14.313 回答