是关于verilog状态机的问题 在always 时钟块的一个状态中,系统如何运行阻塞赋值? 代码如下:
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是关于verilog状态机的问题 在always 时钟块的一个状态中,系统如何运行阻塞赋值? 代码如下:相关的知识,希望对你有一定的参考价值。
s1 :begin
out=food;
out=A;
long=4'b0001;
if(counter>=6'b111000)
next=s11;
else if(long==Length)
next=s1;
else
next=s2;
end
s1状态中,阻塞赋值给out,out的值持续为food跟A的时间各是多少?
系统执行时是从上往下依次判定?或者说,是先执行了三个阻塞赋值语句后再执行条件语句中的阻塞赋值?求大神解答!
可这不是C语言啊!在时序逻辑中给不同的变量采用阻塞赋值我知道他们会顺序执行,但是就是不知道给同一个变量阻塞赋值时是否也是顺序执行了!
追答是串行,没错。同一个变量在begin end 中也是顺行,out先赋值food,再赋值A
追问试了下,这样是不行的!out直接被赋值A,
Verilog 语言,关于状态机的困惑
想在状态机加一个计数器,即处于某个状态超过50个clk就设置一个标志位:
always @(posedge clk or posedge grst)
begin
if(grst)
begin state[3:0] = 4'd0; idle_count[5:0] = 6'd0;falg = 0;end
else
begin
case(state[3:0])
4'd0:begin if(idle_count[5:0] == 6'd50) flag = 1;
else idle_count[5:0] = idle_count[5:0] + 6'd1;
state[3:0] = 4'd1; end
4'd1: begin if(falg = 1) falg = 0;……state[3:0] = 4'd2; end
4'd2: begin ……state[3:0] = 4'd0; end
endcase
end
end
我编写就向上面程序所写模式一样,但flag无变化,不知道哪里错了?
请高手指点下,谢谢!
程序:
always @(posedge clk or posedge grst)
begin
if(grst)
begin
state[3:0] = 4'd0;
idle_count[5:0] = 6'd0;
falg = 0;
end
else
begin
case(state[3:0])
4'd0:begin
if(rxdata == 1)
begin
state[3:0] = 4'd0;
if(idle_count[5:0] == 6'd50)
flag = 1;
else
idle_count[5:0] = idle_count[5:0] + 6'd1;
end
else
state[3:0] = 4'd1;
end
4'd1: begin if(falg = 1) falg = 0;……state[3:0] = 4'd2; end
4'd2: begin ……state[3:0] = 4'd0; end
endcase
end
end
状态机时序中赋值一般用“<="比较多吧,如果不是有特别需要不用“=”的
4'd0:begin if(idle_count[5:0] == 6'd50) flag = 1;
else idle_count[5:0] = idle_count[5:0] + 6'd1;
state[3:0] = 4'd1; end
4'd1: begin if(falg = 1) falg = 0;……state[3:0] = 4'd2; end
4'd2: begin ……state[3:0] = 4'd0; end
case 语句中4'd0满足后state[3:0] = 4'd1,这个赋值是立即执行的,那么 4'd1又被满足了,然后一直下去,虽然你的flag在50的时候是被置为1了,但是紧接着下面又被置回0了,所以时序上看不出来,会不会是这个问题,建议改为阻塞赋值。
不知道自己理解的对不对,大家一起看看追问
补充问题里是格式正确的程序,
不存在你说的那个问题,关键的问题应该不在这里
2 . idle_count[5:0] !== 6'd50 的时候,flag还是0,没有变化,进入状态1,然后,判断 if(falg ==1) ,falg=0 不能满足条件,就卡在这一步了;
3. 从你下面补充的来看,状态0进入状态1的条件是 rxdata !== 1;而rxdata == 1的时候,flag 会从0变为1; 参考技术C 你的idle_count初始值是000000,state初始也是0000
这样你的状态机卡在第一步了
4'd0:begin if(idle_count[5:0] == 6'd50) flag = 1;
你需要在这个if里添加state的变化,否则状态机动不了追问
gg,下面有呀,state[3:0] = 4'd1;
参考技术D 从 4'd0跳到 4'd1有 idle_count[5:0] = 6'd0;5:0] = 6'd0;这句,就是又回到0了,要flag有变化就要 idle_count能到 6'd50,如果你的省略号里内容与此无关的话那么 idle_count变化不了,flag也就不会有变化追问看来是写的格式不好,我再重发一个重写一遍
第5个回答 2011-08-05 时序逻辑不要用=,使用<=应该就可以了本回答被提问者采纳以上是关于是关于verilog状态机的问题 在always 时钟块的一个状态中,系统如何运行阻塞赋值? 代码如下:的主要内容,如果未能解决你的问题,请参考以下文章
在用verilog编写三段式状态机的时候,我看网上很多地方都是提到格式如下:always @ (posedge clk or negedg