作者fungsui (fungsui)
看板Electronics
标题[问题] 用Verilog写FSM以及一个blocking的问题
时间Wed Oct 7 14:20:10 2015
如题,想请问一下FSM的几个问题
以下是我要问的CODE的主要部分
always@(negedge clk or posedge reset)begin
if(reset)current_state<=s0;
else current_state<=next_state;
end
always@(*)begin
case(current_state)
s0:
begin
if(count==3)next_state=s1;
else next_state=s0;
end
endcase
end
always@(posedge clk or posedge reset)begin
if(reset)begin
count<=0;
end
else begin
case(current_state)
s0:
begin//read_input_data
if(!count)begin
count<=count+1'b1;
end
else if(count==1)begin
count<=count+1'b1;
end
else if(count==2)begin
count<=count+1'b1;
end
else count<=2'b00;
end
endcase
end
end
大概的功能是在第一个状态S0的时候会连续读取三个输入资料
,所以我用一个Count的变数上数并在等於3的时候转换到S1。
这时我的第一个always block里面的触发是CLK的负缘,
我一开始是使用正缘触发但是会有个问题,就是当Count等於3
的时候不会立刻转态而会延迟一个CLK。
想请问的是我第一个BLOCK用负缘触发这是一个好的写法吗?
若是错误的观念,不知道该怎麽改才好?
另外我想请教一下blocking的问题,在always@(posedge clk)
里面到底可不可以用blocking,很多人都说sequence circuit
里面要使用nonblocking才是对的,但是我一开始使用bloking
的写法,模拟出来的功能一样是正常的。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.192.91.129
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1444198813.A.C3A.html
1F:推 blackmmm: 照你的写法延迟一个clock是必须的以步数来解释 你收跑了 10/08 10:15
2F:→ blackmmm: 三个数据 还需要第四部步归零 所以是必须的 10/08 10:15
3F:推 blackmmm: 正负源触发都可以吧 在硬体上更改配合就行 10/08 10:20
4F:→ wait: 同上+ 你把时间顺序拿来看 先第三block 然後cnt=3 第二block 10/08 12:34
5F:→ wait: 动作 最後第一block 负缘动作,所以setup T= 前面两个动作 10/08 12:36
6F:→ wait: result 是否会敲到第一FF SDF的setup T 10/08 12:42
8F:→ xanter: 状态机问题 10/08 19:59
9F:推 impression: count <= (count==3) ? 0 : count +1; 10/09 22:29