搜索
bottom↓
回复: 16

还是阻塞和非阻塞,谢谢

[复制链接]

出0入0汤圆

发表于 2009-6-11 16:47:32 | 显示全部楼层 |阅读模式
代码要求:
变量temp,在clk上升沿,temp加1;
当temp>=8的时候,temp减8.

如果写成阻塞,代码如下:

always @ (posedge clk)
  begin
     temp=temp+1;
    if (temp>=8)
        temp=temp-8;
  end                                       
验证下,也是对的.

我没弄明白,如果改成非阻塞,怎么做?总做的不对?
还是有的时序电路并不能用非阻塞,谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-6-11 22:41:52 | 显示全部楼层
晕...
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        temp <= 'd0;
    else if(temp >= 4'd8)
        temp <= 'd0;
    else
        temp <= temp + 4'd1;
end

时序电路最好全部用非阻塞,好的style对于一个程序的稳定性是非常重要,还有EDA综合后的效率,速度.
大系统也能降低不确定因素.

否则你前仿可以后仿也许就不行了.
或者后仿可以烧片就不行了,或者温度变化,环境变化,器件老化后.....

出0入0汤圆

 楼主| 发表于 2009-6-11 23:11:39 | 显示全部楼层
谢谢OLIVER.上次也得到你的帮助.

出0入0汤圆

发表于 2009-6-11 23:14:33 | 显示全部楼层
是吗?我忘了,呵呵.

出0入0汤圆

 楼主| 发表于 2009-6-12 10:10:16 | 显示全部楼层
谢谢Oliver. 我的意图没有说明白.

每来1个时钟,temp就加1;然后判断如果>=8,再减8.这样一来加1和减8同时执行
就无法用非阻塞表达?

问题来源于另外一个帖子
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3380438&bbs_page_no=1&bbs_id=1029
cliff的代码怎么用非阻塞表达?

谢谢Oliver cliff 和大家.

出0入0汤圆

发表于 2009-6-12 10:28:21 | 显示全部楼层
你干嘛要搞这么复杂?

+和判同时执行,这样不符合数字电路综合原则
(真想这样只能用阻塞,仿真应该没问题,烧片就站不住脚了,至于怎么用是当事人的事)

你把8改成7不就完了吗?????

出0入0汤圆

 楼主| 发表于 2009-6-12 11:31:45 | 显示全部楼层
+和判同时执行,这样不符合数字电路综合原则 .
谢谢Oliver.

出0入0汤圆

发表于 2009-6-12 12:16:33 | 显示全部楼层
不谢,你原来是不是写C(顺序执行)的.

HDL不一样,是并行执行的.

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        temp <= 'd0;
    else if(temp >= 4'd7) //0:7(8 steps)
        temp <= 'd0;
    else
        temp <= temp + 4'd1;
end

你看看,应该是你想要的

出0入0汤圆

 楼主| 发表于 2009-6-12 15:06:41 | 显示全部楼层
谢谢Oliver,是这个意思.

还有个问题,用FPGA分频能精确吗?
假设输入时钟是很精确的,10分频后,信号的相位会发生越来越大的漂移吗?

always @(posedge clk)
   begin
      if (cnt==9)
         flag<=1;
      else
flag<        
   end

出0入0汤圆

 楼主| 发表于 2009-6-12 15:11:13 | 显示全部楼层
谢谢Oliver,是这个意思.

还有个问题,用FPGA分频能精确吗?
假设输入时钟是很精确的,10分频后,信号的相位会发生越来越大的漂移吗?

always @(posedge clk)
   begin
      if (cnt==9)
         begin    
         flag<=1;  //别的地方实现flag<=0
      else
         cnt<=cnt+1;        
   end

运行一段时间后clk和flag之间的相位差会越来越大吗(因为门电路的延迟)?

出0入0汤圆

 楼主| 发表于 2009-6-12 15:12:55 | 显示全部楼层
不好意思,上面两个帖子不完整.完整如下:

谢谢Oliver,是这个意思.

还有个问题,用FPGA分频能精确吗?
假设输入时钟是很精确的,10分频后,信号的相位会发生越来越大的漂移吗?

always @(posedge clk)
   begin
      if (cnt==9)
         begin    
            flag<=1;  //别的地方实现flag<=0
            cnt<=0;
         end
      else  
         cnt<=cnt+1;         
   end

运行一段时间后clk和flag之间的相位差会越来越大吗(因为门电路的延迟)?

出0入0汤圆

发表于 2009-6-12 16:42:41 | 显示全部楼层
1.你的电路不可能工作的,同一reg变量不能在多个always中操作.

2.分频不会相位越来越大,相同环境因素下是固定的,一般几个ns
(他们是同步工作的,怎么会越来越大呢?永远同步在posedge clk上).

3.建议你任何时候都把复位信号放上.

4.计数和时序输出可以分两个always写,虽然功能一样,但逻辑性更清楚些

出0入0汤圆

 楼主| 发表于 2009-6-15 11:51:24 | 显示全部楼层
多谢Oliver,很有启发,虽然还不是完全明白.

出0入0汤圆

 楼主| 发表于 2009-6-15 11:53:19 | 显示全部楼层
Oliver方便的话可以邮件联系吗? 我的:nust10@yahoo.com.cn

出0入0汤圆

发表于 2009-6-15 12:33:16 | 显示全部楼层
我不是经常用邮件,去我那贴ARM7+CPLD+SRAM+TFT的贴子,里面有mail,qq,mp......

出0入0汤圆

 楼主| 发表于 2009-6-15 13:10:26 | 显示全部楼层
是那个从SD卡显示照片的帖子吧,以前看了好几遍,今天找了好久找不着了,怪了.谢谢

出0入0汤圆

发表于 2009-6-15 14:19:14 | 显示全部楼层
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=2199636&bbs_page_no=1&search_mode=4&search_text=Oliver&bbs_id=9999
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 19:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表