完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
各位看官好,最近小弟遇到了一个寄存器延迟的问题,虽然不是特别重要,但还是想弄明白,请各位看官指导。具体如下: 对于一个只有clk、reset、data_in、data_out的模,当我们用如下代码赋值时会产生一个clk的延迟,即仿真软件会将posedge clk前一时刻的data_in赋值给data_out:
always @(posedge clk) begin if(reset) data_out<=0; else data_out<=data_in; end 然而如果在代码中增加一个clk二分频时钟clk_2,并用该信号来驱动data_out,则不会产生延迟,即仿真软件会把posedge clk_2后一时刻的data_in赋给data_out: always @(posedge clk) begin if(reset) clk_2<=0; else clk_2<=~clk_2; end always @(posedge clk_2) begin if(reset) data_out<=0; else data_out<=data_in; end 问先问了下公司的一个前辈,他说有可能是使用clk_2会产生亚稳态,于是我用了一个reg来对clk_2打一个节拍产生clk_2_d,并用该时钟来触发data_out,但问题依旧。请问各位看官,是我处理亚稳态的方法不对,还是上述问题并不是由亚稳态引起的?如果不是亚稳态,那又是什么问题引起的? 注:上述例子是为了方便说明进行的简化,实际上还有一些其他的信号。
|
|
相关推荐
9个回答
|
|
看我画的图,帮助你理解
|
|
|
|
|
|
|
|
用的是上升沿有效,你看clk信号是多久一个上升沿,而clk_2是多久一个上升沿,周期clk = 两倍的clk_2 |
|
|
|
我个人觉得跟clk_2的周期没太大关系,因为看了你的回复之后,我回去分别将clk_2的周期修改为与clk相同或者是clk的2倍(利用pll),但得到的结果都是一样的,即模块无延迟地将reg_shift的结果赋值给data_out。所以我觉得应该回到寄存器触发上寻找答案,一般来说,模块会在时钟触发沿到来时将触发沿前一刻对应的数据赋给触发器输出端口(同一个clk进行触发的情况下),当用别的时钟进行触发时(clk_2),模块会将触发沿后一时刻对应的数据赋给触发器输出端口。这种情况是由亚稳态造成的还是说理论上就是如此? |
|
|
|
是在时钟的上升沿捕获的,图片是我仿真的结果。
|
|
|
|
你输入的数据datain怎么变化的?如果是在上升沿的话,当前clk的上升沿采到的是前一个时钟的数据。
|
|
|
|
我觉得当你分频之后,时钟是有延时的,这时采样到的数据就像是当前的数据,其实只是时钟变化比数据变化慢而已
|
|
|
|
我也觉得和输入的数据怎么变化有关系。
|
|
|
|
我告诉你,在默认参数设置情况下,仿真软件是绝对不会给你什么延时的,比如你第一段代码,data_in会在clk上升沿的时候赋给data_out,要刚好对齐于clk的上升沿,这才是对的。
什么亚稳态,在仿真环境下,除非你设置了非常专业的仿真延时参数,否则亚稳态什么的都是扯蛋,好好理解下自己的写的HDL,看看寄存器赋值该是什么样的,这是个很基础的问题,被你扯远了。。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1583 浏览 1 评论
助力AIoT应用:在米尔FPGA开发板上实现Tiny YOLO V4
1082 浏览 0 评论
2657 浏览 1 评论
2347 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
2620 浏览 0 评论
2056 浏览 55 评论
6053 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 06:40 , Processed in 0.784876 second(s), Total 89, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号