作者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/m.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