[問題] 用Verilog寫FSM以及一個blocking的問題

看板Electronics作者 (fungsui)時間8年前 (2015/10/07 14:20), 編輯推噓3(306)
留言9則, 4人參與, 最新討論串1/1
如題,想請問一下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://www.ptt.cc/bbs/Electronics/M.1444198813.A.C3A.html

10/08 10:15, , 1F
照你的寫法延遲一個clock是必須的以步數來解釋 你收跑了
10/08 10:15, 1F

10/08 10:15, , 2F
三個數據 還需要第四部步歸零 所以是必須的
10/08 10:15, 2F

10/08 10:20, , 3F
正負源觸發都可以吧 在硬體上更改配合就行
10/08 10:20, 3F

10/08 12:34, , 4F
同上+ 你把時間順序拿來看 先第三block 然後cnt=3 第二block
10/08 12:34, 4F

10/08 12:36, , 5F
動作 最後第一block 負緣動作,所以setup T= 前面兩個動作
10/08 12:36, 5F

10/08 12:42, , 6F
result 是否會敲到第一FF SDF的setup T
10/08 12:42, 6F

10/08 19:59, , 7F
我覺得妳應該先看看這篇 http://goo.gl/hwmk1G 再來探討
10/08 19:59, 7F

10/08 19:59, , 8F
狀態機問題
10/08 19:59, 8F

10/09 22:29, , 9F
count <= (count==3) ? 0 : count +1;
10/09 22:29, 9F
文章代碼(AID): #1M5BcTmw (Electronics)