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