我想在一个块内使用if-else
和for
循环。always
我不希望那些if-else
被一次又一次地执行,所以我不想总是与posedge clk
or连接negedge clk
。
我希望它们只被执行一次。我不仅想模拟,而且还想在 Spartan Board 上进行合成。
always @ (**what I should add here**)
begin
if(condition)
else
end
我想在一个块内使用if-else
和for
循环。always
我不希望那些if-else
被一次又一次地执行,所以我不想总是与posedge clk
or连接negedge clk
。
我希望它们只被执行一次。我不仅想模拟,而且还想在 Spartan Board 上进行合成。
always @ (**what I should add here**)
begin
if(condition)
else
end
对于模拟执行某些事情,一旦你可以使用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 ;
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 语句只计算一次。它是硬件,它总是会计算。但是你可以在计算一次后保持输出稳定。您仍在尝试编写软件功能并将其放入硬件中,而不是描述可以解决您问题的硬件。我看不出你会以这种方式得到一个像样的设计。当然,您将能够制作一些小部件并合成它们(最终),但是完整的设计?