微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于寄存器在上电时的初值问题?

关于寄存器在上电时的初值问题?

时间:10-02 整理:3721RD 点击:
最近在ASIC设计中,本人采用数字方法实现了一个数字系统的上电复位,在前仿过程中没有问题,但是在后仿过程中,输出一直是不定态x,导致最后无法给整个数字系统上电复位。本人设计的原理图如下:



     经过分析,是由于寄存器在时钟上升沿到来时没有先赋初值0,寄存器组的程序如下:



     我想问的问题是,这个程序有问题吗?如果有问题,那么该如何给Q一个初值?
(【注】:整个数字上电复位只有一个输入一个输出,输入是时钟信号CLK,输出是上电复位信号POR)
     求大神们给给建议……谢谢……

复位后给寄存器赋初始值


     关键是这个电路就是为了在上电后产生一个复位信号,输入就是一个CLK,没有复位rst,所以……

不懂。期待大神回答。
没有做过ASIC。这种代码风格也不喜欢,我觉得写FPGA代码越细越好,不怕啰嗦,每一个if else都写的清清楚楚的,这样有时候都很难保证综合出来的结果是自己想要的。更何况写的这么。抽象?呵呵

数字电路真正原始的上电复位,是来自于模拟的电压比较器,其原理是电源电压高过参考电压一段时间后,发出一个表明电源ready的信号,这个信号的产生是纯模拟器件,不要要用到任何寄存器。
如果你没有这样的复位源,可以用来自pin上的复位,就是按键reset。

模拟会产生一个复位的

我怎么看着你的Q除了2'b00还是2'b00呢
还有 你的 if(~EN) 与后面的if到底有没有关系?
我感觉你是太懒以至于丢了begin end
代码风格看着很捉急

在后仿的TB里 deposit 一个random值 于Q ?

过来学学!



always@(posedge)
     begin
         Q = 2‘b00;
         if(~EN)
              begin
                    Q <= D;
              end
          else
              begin
                    Q <= Q;
              end
     end
      因为在Q输出为11时,比较器输出为1,此时EN端无效,就自动执行Q保持的功能了。
      代码风格确实有所欠缺,sorry。
      最后,其实我想问的是前面这句: Q = 2‘b00。我觉得这么写有问题,但是前仿又可以通过,。我也是醉了。


什么意思?可以具体说说吗?



   想用数字寄存器产生上电复位信号,而产生复位信号的这个寄存器自己的复位如何来?呵呵,这个似乎只有理论研究意义,没有什么实际价值。


这只是用于仿真,给寄存器赋初值。解决某些寄存器没有复位信号在你的testbench里面加上:
$deposit(xxxxx.Q, 2'b0);

只能解决仿真时寄存器没有初始化的问题
$deposit(xxxx.Q, 2'b0);



   

    如果这样写,Q<= 2‘b00完全可以去掉,因为无论如何都会被后面的Q赋值覆盖掉


【链接:http://www.freepatentsonline.com/result.html?sort=relevance&srch=top&query_txt=DIGITAL+POWER+ON+RESET&submit=&patents=on】



但是你说的不无道理,因为数字电路要工作,寄存器要工作,其必须达到有效电平,要是没有上电,寄存器就不会工作,就不谈复位了。但是,从另一方面来讲,数字电路可以在上电完成后立即进行复位嘛……



   我的意思是说,在工程角度看,任何芯片中,模拟一定有这样一个稳定可靠的上电复位信号存在的,数字故意不用它,另辟蹊径大费周章自己设法去产生这样的信号,意义在哪里。这就是抛开实际只谈理论研究呀。

感觉完全没有入门啊
always @(posedge clk or negedge EN)
if (!EN)
    Q <= 1'b0;
else
   Q <= adder_output
不用 Q <= Q,本来寄存器就能保持原值

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

网站地图

Top