我正在尝试在Verilog中的代码中使用时间延迟。在我正在制作的文件中,我有一个always块,其中包含一个case语句,并且case值的多个部分都应包含延迟。 我尝试用一个简单的LED程序测试它。我在一行中写了延迟,但是似乎没有用!没有延迟发生。这里发生了什么??? 该行是: for(i = 0; i <= 100000000; i = i + 1)@(摆姿势时钟); 而且,如何在随机位置添加延迟?
这是我的代码,这是一个简单的代码,旨在测试延迟:
module testni (clk, keypad, led1, led2);
input [0:6] keypad;
input clk;
output reg led1=1;
output reg led2=1;
integer i;
always@(keypad) begin
led1=0;
for(i=0;i<=100000000;i=i+1) @(posedge clk);
led2=0;
end
endmodule
我正在尝试执行此操作:先执行一条语句,然后等待2秒钟,然后再执行另一条语句。这不应该等待2s然后关闭led2吗???但就我而言,它们一直都处于关闭状态。
答案 0 :(得分:1)
大多数FPGA综合工具都希望您将硬件描述为状态机。这意味着每个时钟周期[{@(posedge clk)
]都会查看当前状态和其他输入,然后确定下一个状态和输出。像这样
module testni (
input clk,
input [0:6] keypad,
output reg led1,
output reg led2
);
reg [31:0] counter;
integer state;
parameter IDLE = 0, COUNTING = 1;
always@(posedge clk) begin
case(state)
IDLE: begin
led1 <= 1; led2 <= 1;
counter = 0 ;
if (keypad) STATE <= COUNTING;
end
COUNTING: begin
led1 <= 0;
counter <= counter + 1;
if (counter > 100000000) begin
led2 = 0;
STATE <= IDLE;
end
default: STATE <= IDLE;
endcase
endmodule
请注意,始终块的开始处只有一个@(posedge clk)
。