在fpga设计中,我们经常会写:
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
num1 <= 0;
num2 <= 0;
num3 <= 0;
end
else
begin
num1 <= 5;
num2 <= num1;
num3 <= num2;
end
end
上面的语句,如果按照c程序去理解的话,那么num3一下子就等于5了,因为c程序中,这三句赋值的话是数序执行的。但是在fpga设计当中的话,就不是这样了。
第一个时钟节拍,num1=5,num2=0;num3=0;
第二个时钟节拍,num1=5,num2=5;num3=0;
第三个时钟节拍,num1=5,num2=5;num3=5;
为什么会是这样的呢?
因为在fpga当中的话,所有的赋值都是并行执行的,也就是同一个时间执行的。当第一个时钟上升沿来的之前,num1=0,num2=0;num3=0;这三句赋值一起执行,所以就变成了num1=5,num2=0;num3=0;
(一起执行的意思:num2虽然被赋值num1,但是这个时候num1都还没有改变),再次重申,他们是一起改变的。
一定要记住,不然的话,总会错开一个或者几个时钟周期。
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
num1 <= 0;
num2 <= 0;
num3 <= 0;
end
else
begin
num1 <= 5;
num2 <= num1;
num3 <= num2;
end
end
上面的语句,如果按照c程序去理解的话,那么num3一下子就等于5了,因为c程序中,这三句赋值的话是数序执行的。但是在fpga设计当中的话,就不是这样了。
第一个时钟节拍,num1=5,num2=0;num3=0;
第二个时钟节拍,num1=5,num2=5;num3=0;
第三个时钟节拍,num1=5,num2=5;num3=5;
为什么会是这样的呢?
因为在fpga当中的话,所有的赋值都是并行执行的,也就是同一个时间执行的。当第一个时钟上升沿来的之前,num1=0,num2=0;num3=0;这三句赋值一起执行,所以就变成了num1=5,num2=0;num3=0;
(一起执行的意思:num2虽然被赋值num1,但是这个时候num1都还没有改变),再次重申,他们是一起改变的。
一定要记住,不然的话,总会错开一个或者几个时钟周期。