我是V傻蛋 发表于 2012-10-25 22:56:53

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

各位大神,菜鸟小弟我有个问题急需大家帮忙。


在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; //发送bit0
                  4'd2: rs232_tx_r <= tx_data; //发送bit1
                  4'd3: rs232_tx_r <= tx_data; //发送bit2
                  4'd4: rs232_tx_r <= tx_data; //发送bit3
                  4'd5: rs232_tx_r <= tx_data; //发送bit4
                  4'd6: rs232_tx_r <= tx_data; //发送bit5
                  4'd7: rs232_tx_r <= tx_data; //发送bit6
                  4'd8: rs232_tx_r <= tx_data; //发送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,为什么程序能正常运行?)

谢谢了!

sky5566 发表于 2012-10-26 02:49:51

你先了解非阻塞與阻塞問題
(1)
num <= num+1'b1; 並不代表這次值,除非改成這樣
num= num+1'b1;

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

我是V傻蛋 发表于 2012-10-26 21:34:41

sky5566 发表于 2012-10-26 02:49 static/image/common/back.gif
你先了解非阻塞與阻塞問題
(1)
num

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



always @(negedge clk ornegedge 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类型变量在很多程序中都没有初始化,程序都能正常运行,这是为什么?求大神指教。

zikongxiaozi 发表于 2012-10-29 22:31:45

(本人理解)因为FPGA是上电复位,在复位后就给count、num等计数器初始化了。
页: [1]
查看完整版本: 求大神:关于verilog中语句时序问题