无法在Verilog中创建时间延迟

时间:2019-01-12 02:25:19

标签: verilog delay

我正在尝试在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吗???但就我而言,它们一直都处于关闭状态。

1 个答案:

答案 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)