armwork 发表于 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                                       
验证下,也是对的.

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

Oliver 发表于 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综合后的效率,速度.
大系统也能降低不确定因素.

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

armwork 发表于 2009-6-11 23:11:39

谢谢OLIVER.上次也得到你的帮助.

Oliver 发表于 2009-6-11 23:14:33

是吗?我忘了,呵呵.

armwork 发表于 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 和大家.

Oliver 发表于 2009-6-12 10:28:21

你干嘛要搞这么复杂?

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

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

armwork 发表于 2009-6-12 11:31:45

+和判同时执行,这样不符合数字电路综合原则 .
谢谢Oliver.

Oliver 发表于 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

你看看,应该是你想要的

armwork 发表于 2009-6-12 15:06:41

谢谢Oliver,是这个意思.

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

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

armwork 发表于 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之间的相位差会越来越大吗(因为门电路的延迟)?

armwork 发表于 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之间的相位差会越来越大吗(因为门电路的延迟)?

Oliver 发表于 2009-6-12 16:42:41

1.你的电路不可能工作的,同一reg变量不能在多个always中操作.

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

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

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

armwork 发表于 2009-6-15 11:51:24

多谢Oliver,很有启发,虽然还不是完全明白.

armwork 发表于 2009-6-15 11:53:19

Oliver方便的话可以邮件联系吗? 我的:nust10@yahoo.com.cn

Oliver 发表于 2009-6-15 12:33:16

我不是经常用邮件,去我那贴ARM7+CPLD+SRAM+TFT的贴子,里面有mail,qq,mp......

armwork 发表于 2009-6-15 13:10:26

是那个从SD卡显示照片的帖子吧,以前看了好几遍,今天找了好久找不着了,怪了.谢谢

Oliver 发表于 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
页: [1]
查看完整版本: 还是阻塞和非阻塞,谢谢