HDLBITS笔记35:独热编码状态机,ps/2数据包解析器,ps/2数据包和数据路径
目錄
題目1:Fsm onehot(熱編碼的有限狀態機)
?題目2:Fsm ps2(ps/2數據包解析器)
題目3:Fsm ps2data(ps/2數據包解析器和數據路徑)
題目1:Fsm onehot(熱編碼的有限狀態機)
給定以下狀態機,具有 1 個輸入和 2 個輸出:
假設此狀態機使用單熱編碼,其中狀態[0]通過狀態[9]分別對應于狀態S0和S9。除非另有指定,否則輸出為零。
實現狀態機的狀態轉換邏輯和輸出邏輯部分(但不是狀態觸發器)。在狀態[9:0]中,您將獲得當前狀態,并且必須產生next_state[9:0]和兩個輸出。通過檢查假設一熱編碼來推導邏輯方程。(測試平臺將使用非一個熱輸入進行測試,以確保您不會嘗試執行更復雜的操作)。
模塊聲明
module top_module(input in,input [9:0] state,output [9:0] next_state,output out1,output out2);提示:一熱狀態轉換邏輯的邏輯方程可以通過查看狀態轉換圖的邊緣來推導。
根據狀態流程圖寫出邏輯關系,輸出也是一樣的道理。
module top_module(input in,input [9:0] state,output [9:0] next_state,output out1,output out2);parameter s0 =4'd0,s1 = 4'd1,s2 = 4'd2,s3 = 4'd3,s4 = 4'd4,s5 = 4'd5,s6 = 4'd6,s7 = 4'd7,s8 = 4'd8,s9 = 4'd9;//狀態邏輯assign next_state[s0] = !in &( state[s0] | state[s1] | state[s2] | state[s3] | state[s4] | state[7] | state[s8] | state[s9]);assign next_state[s1] = in &( state[s0] | state[s8] | state[s9]);assign next_state[s2] = in &( state[s1]);assign next_state[s3] = in & state[s2] ;assign next_state[s4] = in & state[s3] ;assign next_state[s5] = in & state[s4] ;assign next_state[s6] = in & state[s5] ;assign next_state[s7] = in & (state[s6] | state[7]);assign next_state[s8] = !in & state[s5] ;assign next_state[s9] = !in & state[s6] ;//輸出邏輯assign out1 = state[8]|state[9];assign out2 = state[7]|state[9]; endmodule仿真結果:
?題目2:Fsm ps2(ps/2數據包解析器)
PS/2 鼠標協議發送長度為 3 個字節的消息。但是,在連續字節流中,消息的開始和結束位置并不明顯。唯一的指示是,每個三字節消息的第一個字節始終具有?bit[3]=1(但其他兩個字節的位 [3] 可能是 1 或 0,具體取決于數據)。
我們想要一個有限的狀態機,當給定輸入字節流時,它將搜索消息邊界。我們將使用的算法是丟棄字節,直到我們看到一個位[3]=1的字節。然后,我們假設這是消息的字節 1,并在收到所有 3 個字節(完成)后發出接收消息的信號。
FSM 應在成功接收到每條消息的第三個字節后立即在周期內發出信號。
一些時序圖來解釋所需的行為
在無差錯條件下,每三個字節形成一條消息:
發生錯誤時,搜索字節 1:
請注意,這與?1xx?序列識別器不同。此處不允許使用重疊序列:
模塊聲明
module top_module(input clk,input [7:0] in,input reset, // Synchronous resetoutput done);代碼編寫如下:
module top_module(input clk,input [7:0] in,input reset, // Synchronous resetoutput done); //reg [1:0] state,next_state;parameter s0 = 2'd0,s1 = 2'd1,s2 = 2'd2,s3 = 2'd3;// State transition logic (combinational),組合邏輯always @(*)begincase(state)s0:begin;if(!in[3])next_state = s0;elsenext_state = s1;ends1: next_state = s2;s2: next_state = s3;s3:beginif(!in[3])next_state = s0;elsenext_state = s1;endendcaseend// State flip-flops (sequential),時序邏輯always @(posedge clk)beginif(reset)state <= s0;elsestate <= next_state;end// Output logic,輸出邏輯assign done = (state==s3);endmodule題目3:Fsm ps2data(ps/2數據包解析器和數據路徑)
另請參見:PS/2 數據包解析器。
現在,您已經有了一個狀態機,它將識別 PS/2 字節流中的三字節消息,請添加一個數據路徑,該數據路徑還將在收到數據包時輸出 24 位(3 字節)消息(out_bytes[23:16]?是第一個字節,out_bytes[15:8]?是第二個字節,依此類推)。
每當斷言完成信號時,out_bytes都需要有效。您可以在其他時間輸出任何內容(即,不要在乎)。
模塊聲明?
module top_module(input clk,input [7:0] in,input reset, // Synchronous resetoutput [23:0] out_bytes,output done);分析:觀察所給的圖例,當done=1,in位1時,輸出24位才有效。當in為1,done為1,輸出out——bytes才依次從高8位,中8位,低8位輸出。當done為0時,不關心輸出。
代碼如下:
module top_module(input clk,input [7:0] in,input reset, // Synchronous resetoutput [23:0] out_bytes,output done); //reg [1:0] state,next_state;parameter [1:0] s0 = 2'd0,s1 = 2'd1,s2 = 2'd2 ,s3 = 2'd3;// FSM from fsm_ps2always @(*)begincase(state)s0:beginif(!in[3])next_state = s0;elsenext_state = s1;ends1:next_state = s2;s2:next_state = s3;s3:beginif(!in[3])next_state = s0;elsenext_state = s1;endendcaseend// New: Datapath to store incoming bytes.always @(posedge clk)beginif(reset)state <= s0;elsestate <= next_state ;endalways @(posedge clk)beginif(next_state == s1) beginout_bytes[23:16] <= in;endelse if(next_state == s2)beginout_bytes[15:8] <= in;endelse if(next_state == s3)beginout_bytes[7:0] <= in;endelse beginout_bytes <= 24'b0;endendassign done = (state == s3);endmodule仿真結果如下:
總結
以上是生活随笔為你收集整理的HDLBITS笔记35:独热编码状态机,ps/2数据包解析器,ps/2数据包和数据路径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雅致古典山水中国风PPT模板
- 下一篇: 2019年度中职组“网络空间安全”赛项赣