搜索
bottom↓
回复: 3

求大神:关于verilog中语句时序问题

[复制链接]

出0入0汤圆

发表于 2012-10-25 22:56:53 | 显示全部楼层 |阅读模式
各位大神,菜鸟小弟我有个问题急需大家帮忙。


在always 语句下有如下情况:

...

if(clk_bps)

  begin
          num <= num+1'b1;
          case (num)
                  4'd0: rs232_tx_r <= 1'b0;  //发送起始位
                  4'd1: rs232_tx_r <= tx_data[0]; //发送bit0
                  4'd2: rs232_tx_r <= tx_data[1]; //发送bit1
                  4'd3: rs232_tx_r <= tx_data[2]; //发送bit2
                  4'd4: rs232_tx_r <= tx_data[3]; //发送bit3
                  4'd5: rs232_tx_r <= tx_data[4]; //发送bit4
                  4'd6: rs232_tx_r <= tx_data[5]; //发送bit5
                  4'd7: rs232_tx_r <= tx_data[6]; //发送bit6
                  4'd8: rs232_tx_r <= tx_data[7]; //发送bit7
                  4'd9: rs232_tx_r <= 1'b1; //发送结束位
                  default: rs232_tx_r <= 1'b1;
            endcase
    end
   else if(num==4'd11) num <= 4'd0;

第一个问题:如果上述语句中num初始值为0,当clk_bps为真时。那case中为0的语句还执行吗?即num <= num+1'b1;先执行再执行case还是同时执行?

第二个问题:本语句来自特权同学的串口发送语句,想问num在定义为reg类型初始值为x,为什么可以不初始化为0便能正确执行发送8位数据?(补充:在整个串口发送程序中如果clk_bps不为真时,也没有复位信号时,num一直为x,为什么程序能正常运行?)

谢谢了!

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-10-26 02:49:51 | 显示全部楼层
你先了解非阻塞與阻塞問題
(1)
num <= num+1'b1; 並不代表這次值,除非改成這樣
num  = num+1'b1;  

例如
old <= new;
if ({old,new} == 2'01') <----這樣你看的懂就知道了
   ....................
   
(2)沒有完整程序,所以不知道

出0入0汤圆

 楼主| 发表于 2012-10-26 21:34:41 | 显示全部楼层
sky5566 发表于 2012-10-26 02:49
你先了解非阻塞與阻塞問題
(1)
num

先谢谢您了呵,第一个问题了解了。
第二个问题我简化一下:
请您先看这个最简单的计数器程序(我下载试了试正确的):
module part_1(
              cout,rco,
              clk,reset_n
              );
input   clk;
input   reset_n;
output  reg [3:0] cout;
output  reg rco;



always @(negedge clk or  negedge reset_n)
begin
     if(!reset_n)
     begin
        rco =1'b0;
        cout =4'b0000;
     end
    else if(cout == 4'b1001)begin
              cout=4'b0000;
              rco=1'b1;
         end
    else
        begin
        cout=cout+1;
        rco=1'b0;
        end
end

endmodule


然后,我不明白的是:verilog语言书上在定义reg类型时,默认都是x(夏宇闻老师翻译的那本国外教材书上有),比如这个cout,我们并没有给它初始位0,下载后也没有对rst_n进行复位,如果按照默认值x,那这个计数器不是不能正常工作了吗?


可能就这个点我理解得不够好,才对第一个问题产生更多的疑惑,第一个问题中num跟计数器cout一样没有初始化,而且我发现关于这些计数的reg类型变量在很多程序中都没有初始化,程序都能正常运行,这是为什么?求大神指教。

出0入0汤圆

发表于 2012-10-29 22:31:45 | 显示全部楼层
(本人理解)因为FPGA是上电复位,在复位后就给count、num等计数器初始化了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-27 11:23

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

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