以我们的EasyFPGA030为例,晶振48MHz
1.always块内执行一条if语句或一条阻塞赋值语句需要多长时间?
在学写verilog程序的过程中有些困惑,看到论坛中有如下程序:
这个程序是让LED以1S 闪烁 ,clk应该是晶振输入引脚
module led_s (led,clk);
input clk;
output [3:0] led;
reg[3:0] led;
reg[24:0] buffer;
always @(posedge clk)
begin
buffer<=buffer+1;
if(buffer==23'd24000000)
begin
led<=~led;
buffer<=0;
end
end
endmodule
每当clk上升沿来临要判断buffer,buffer加一,不知道在下个clk上升沿来临之前always块内的程序是否有足够的时间执行完?
看下另一个程序:
reg[3:0] con;
always @(posedge clk)
con<=con[2:0]+1'b1;
wire tick = con[3];
reg[2:0] cont
always @(posedge clk)
begin
cont = cont + 1'b1;
cont = cont + 1'b1;
cont = cont + 1'b1;
cont = cont + 1'b1;
if(tick)
...
...
end
当always块内的阻塞赋值语句 cont = cont + 1'b1;增加到多少条时将无法捕捉到tick为1的瞬间?
FPGA030执行指令的基本时间单位和晶振输入频率是什么关系?
2.当always块内的程序需要较长时间才能执行完时(大于clk的周期),那么当always块内的程序还没有执行完,下一个clk
上升沿已经来临,这时always是忽略clk上升沿继续执行未完的程序,还是放弃执行未完的程序来响应clk从头开始执行?
|