微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > fpga 时序逻辑的问题

fpga 时序逻辑的问题

时间:10-02 整理:3721RD 点击:
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;
由于两个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

前面的回答得挺仔细

变化前的,好好看看建立时间和保持时间,对理解会有帮助的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top