fpga 时序逻辑的问题
if (rst)
begin
sta_condition <= #1 1'b0;
sto_condition <= #1 1'b0;
end
else
begin
sta_condition <= #1 ~sSDA & dSDA & sSCL;//
sto_condition <= #1 sSDA & ~dSDA & sSCL;//
end
always @(posedge clk or negedge rst)
else if (rst)
busy <= #1 1'b0;
else
busy <= #1 sta_condition & ~sto_condition;
由于两个always模块都是在clk下触发,在第二个always模块中如果来了一个clk上升沿busy按照sta_condition和sto_condition在clk上升沿以前的值变化还是按照经过此上升沿后的新值变化呢?
好像是变化前吧
我感觉是变化前,就是不太确定
是变化前的,该电路为同步电路,在2模块时钟上升沿的时候(也基本是1模块的上升沿),此时还是2模块的触发器所采到的值当然是sta_condition和sto_condition的变化之前的值,因为sta_condition和sto_condition的变化之后的值还没有到达 busy信号所在的触发器。
变化前,但是比较危险,因为不确定
所有的always块可以理解为是并行执行的。在时钟上升沿到来时。sta_conditon经过组合逻辑后的值被打入busy。而sta_c则是在上升沿之后才会变化。在你的程序里就是#1以后变化。
要用电路的观点去看sta_condition和sto_condition是两个寄存器,经过组合逻辑之后传入busy这个寄存器的输入端,仿真的时候肯定是变化前的值
再问:两个always模块在代码中的不同位置对他们的执行过程会不会产生影响呢?
只要是在本module里面的两个always,放在哪里都一样的。
不会。所有的always块都是并行的,只有在always内部才会有前后关系。你对硬件的理解还差点。
是变化前的吧
为什么是在变化前啊?
这个是一个比较深的话题,由设计思想的时间区域概念决定的。
为什么用两个呢
!
!
!
always @(posedge clk or negedge rst)
if (rst)
begin
sta_condition <= #1 1'b0;
sto_condition <= #1 1'b0;
end
else
begin
sta_condition <= #1 ~sSDA & dSDA & sSCL;//
sto_condition <= #1 sSDA & ~dSDA & sSCL;//
end
always @(posedge clk or negedge rst)
else if (rst)
busy <= #1 1'b0;
else
busy <= #1 sta_condition & ~sto_condition;
编译过不到吧
没错,这段RTL Code如果拿去做simulation,应该busy会一直unkonw到底,
因为sta_condition,sto_condition 在初始时,并没有给定值,所以值是unknow.
假设程序是要做async low reset,则程序要改为
always @(posedge clk or negedge rst)
if (!rst)
begin
sta_condition <= #1 1'b0;
sto_condition <= #1 1'b0;
end
else
begin
sta_condition <= #1 ~sSDA & dSDA & sSCL;//
sto_condition <= #1 sSDA & ~dSDA & sSCL;//
end
always @(posedge clk or negedge rst)
else if (!rst)
busy <= #1 1'b0;
else
busy <= #1 sta_condition & ~sto_condition;
其中
#1 的目的只是让simulation出来的结果更接近真实的情况,
如果不加#1,那就是看simulator的判定,一般是会判定"变化之前"
但是这有可能会视simulator的不同而有所不同.
我觉得同学你的对硬件电路行为还差点理解哦,是不是都是在做仿真?
可以看看综合出来的电路结构,慢慢就习惯了。
1# chupenghui
前面的回答得挺仔细
变化前的,好好看看建立时间和保持时间,对理解会有帮助的
