求大神:关于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,为什么程序能正常运行?)
谢谢了! 你先了解非阻塞與阻塞問題
(1)
num <= num+1'b1; 並不代表這次值,除非改成這樣
num= num+1'b1;
例如
old <= new;
if ({old,new} == 2'01') <----這樣你看的懂就知道了
....................
(2)沒有完整程序,所以不知道 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类型变量在很多程序中都没有初始化,程序都能正常运行,这是为什么?求大神指教。
(本人理解)因为FPGA是上电复位,在复位后就给count、num等计数器初始化了。
页:
[1]