【HDLBits 刷题 9】Circuits(5)Finite State Manchines 1-9
目录写在前面Finite State ManchinesFsm1Fsm1sFsm2Fsm2sFsm3combFsm3onehotFsm3Fsm3sDesign a Moore FSM写在前面HDLBits 刷题来到了最为重要的一部分---有限状态机都说 Verilog 设计的精髓就是状态机的设计可见状态机设计的重要性通过三十多道的状态机的练习可以更加熟悉状态机设计的要点通常都设计为三段式这样设计的状态机层次清晰且易于设计时序上更为易懂。以下的解题方法不一定为最佳解决方案有更好的方法欢迎提出共同学习共同进步Finite State ManchinesFsm1设计一个摩尔状态机具有两种状态一种输入和一种输出。实现此状态机。请注意重置状态为 B。使用异步重置。module top_module( input clk, input areset, // Asynchronous reset to state B input in, output out ); //状态申明 parameter A 0; parameter B 1; reg state; reg next_state; //状态机第一段起始状态 always (posedge clk or posedge areset) begin if (areset) begin state B; end else begin state next_state; end end //状态机第二段状态的跳转 always (*) begin next_state state; case(state) B: case(in) 0 : next_state A; 1 : next_state B; endcase A : case(in) 0 : next_state B; 1 : next_state A; endcase default: next_state B; endcase end //状态机第三段在每个状态的输出 assign out (state B); endmoduleFsm1s一个摩尔状态机具有两种状态一种输入和一种输出。实现此状态机。请注意重置状态为 B。使用同步复位。module top_module(clk, reset, in, out); input clk; input reset; // Synchronous reset to state B input in; output out; parameter A 0; parameter B 1; reg out; reg present_state; reg next_state; //状态机第一段初始状态非阻塞逻辑 always (posedge clk) begin if (reset) begin present_state B; end else begin present_state next_state; end end //状态机第二段状态转移阻塞赋值 always (*) begin next_state present_state; case(present_state) B: case(in) 1: next_state B; 0: next_state A; endcase A: case(in) 1: next_state A; 0: next_state B; endcase endcase end //状态机第三段状态输出 assign out (present_stateB); endmoduleFsm2这是一个摩尔状态机有两个状态两个输入和一个输出。实现此状态机。使用异步重置。module top_module( input clk, input areset, // Asynchronous areset to OFF input j, input k, output out ); parameter OFF 0; parameter ON 1; reg state; reg next_state; //状态机第一段初始状态非阻塞逻辑 always (posedge clk or posedge areset) begin if (areset) begin state OFF; end else begin state next_state; end end //状态机第二段状态转移阻塞赋值 always (*) begin next_state state; case(state) OFF: case(j) 1: next_state ON; 0: next_state OFF; endcase ON: case(k) 1: next_state OFF; 0: next_state ON; endcase endcase end //状态机第三段状态输出 assign out (stateON); endmoduleFsm2s这是一个摩尔状态机有两个状态两个输入和一个输出。实现此状态机。使用同步复位。//timescale 100ps / 1ps ////////////////////////////////////////////////////////////////////////////////// // Stage: Finite_State_Manchines // Engineer: LQC // Create Date: 2022/08/06 // Design Name: // Module Name: top_module // Description: // 摩尔状态机有两个状态两个输入和一个输出。 // 实现此状态机。使用同步重置。 ////////////////////////////////////////////////////////////////////////////////// module top_module( input clk, input reset, // Asynchronous reset to OFF input j, input k, output out ); parameter OFF 0; parameter ON 1; reg state; reg next_state; //状态机第一段初始状态非阻塞逻辑 always (posedge clk) begin if (reset) begin state OFF; end else begin state next_state; end end //状态机第二段状态转移阻塞赋值 always (*) begin next_state state; case(state) OFF: case(j) 1: next_state ON; 0: next_state OFF; endcase ON: case(k) 1: next_state OFF; 0: next_state ON; endcase endcase end //状态机第三段状态输出 assign out (stateON); endmoduleFsm3comb以下是摩尔状态机的状态转换表该状态机具有一个输入、一个输出和四个状态。使用以下状态编码A2b00、B2b01、C2b10、D2b11。仅实现此状态机的状态转换逻辑和输出逻辑组合逻辑部分。给定当前状态根据状态转换表计算和输出 。module top_module( input in, input [1:0] state, output [1:0] next_state, output out ); parameter A0, B1, C2, D3; always (*) begin case(state) A: case(in) 0: next_state A; 1: next_state B; endcase B: case(in) 0: next_state C; 1: next_state B; endcase C: case(in) 0: next_state A; 1: next_state D; endcase D: case(in) 0: next_state C; 1: next_state B; endcase default: next_state A; endcase end assign out (stateD); endmoduleFsm3onehot以下是摩尔状态机的状态转换表该状态机具有一个输入、一个输出和四个状态。使用以下单热状态编码A4b0001、B4b0010、C4b0100、D4b1000。通过检查假设为单热编码派生状态转换和输出逻辑方程。仅实现此状态机的状态转换逻辑和输出逻辑组合逻辑部分。测试平台将使用非一个热输入进行测试以确保您不会尝试执行更复杂的操作。module top_module( input in, input [3:0] state, output [3:0] next_state, output out ); //状态申明 parameter A 0; parameter B 1; parameter C 2; parameter D 3; //只需要判断next_state在哪个状态变成此状态即可 assign next_state[A] (state[A] ~in) | (state[C] ~in); assign next_state[B] (state[B] in) | (state[D] in) | (state[A] in); assign next_state[C] (state[B] ~in) | (state[D] ~in); assign next_state[D] (state[C] in); //只有当状态为D时输出才为1 assign out (state[D]); endmoduleFsm3以下是摩尔状态机的状态转换表该状态机具有一个输入、一个输出和四个状态。实现此状态机。包括将 FSM 重置为状态 A 的异步重置。module top_module( input clk, input in, input areset, output out ); //状态申明 parameter A 4b0001; parameter B 4b0010; parameter C 4b0100; parameter D 4b1000; parameter ON 1; parameter OFF 0; reg [3:0] state; reg [3:0] next_state; //状态机第一段初始状态时序逻辑、非阻塞赋值 always (posedge clk or posedge areset) begin if (areset) begin state A; end else begin state next_state; end end //状态机第二段状态转移时序逻辑、阻塞赋值 always (*) begin next_state state; case(state) A: case(in) ON: next_state B; OFF: next_state A; endcase B: case(in) ON: next_state B; OFF: next_state C; endcase C: case(in) ON: next_state D; OFF: next_state A; endcase D: case(in) ON: next_state B; OFF: next_state C; endcase endcase end //状态机第三段结果输出组合逻辑 assign out (stateD); endmoduleFsm3s以下是摩尔状态机的状态转换表该状态机具有一个输入、一个输出和四个状态。实现此状态机。包括将 FSM 重置为状态 A 的同步复位这与 Fsm3 存在相同的问题但具有同步复位。module top_module( input clk, input in, input reset, output out ); //状态申明 parameter A 4b0001; parameter B 4b0010; parameter C 4b0100; parameter D 4b1000; parameter ON 1; parameter OFF 0; reg [3:0] state; reg [3:0] next_state; //状态机第一段初始状态时序逻辑、非阻塞赋值 always (posedge clk) begin if (reset) begin state A; end else begin state next_state; end end //状态机第二段状态转移时序逻辑、阻塞赋值 always (*) begin next_state state; case(state) A: case(in) ON: next_state B; OFF: next_state A; endcase B: case(in) ON: next_state B; OFF: next_state C; endcase C: case(in) ON: next_state D; OFF: next_state A; endcase D: case(in) ON: next_state B; OFF: next_state C; endcase endcase end //状态机第三段结果输出组合逻辑 assign out (stateD); endmoduleDesign a Moore FSMmodule top_module ( input clk, input reset, input [3:1] s, output fr3, output fr2, output fr1, output dfr ); parameter A 3b000; parameter B 3b001; parameter C 3b010; parameter D 3b011; parameter E 3b100; parameter F 3b101; wire [2:0] state; wire [2:0] next_state; //状态机第一段初始状态时序逻辑非阻塞赋值 always(posedge clk)begin if(reset) state A; else state next_state; end //状态机第二段状态跳转阻塞赋值 always(*)begin case(state) A: next_state s[1]? B:A; B: next_state s[2]? D:(s[1]? B:A); C: next_state s[2]? D:(s[1]? C:A); D: next_state s[3]? F:(s[2]? D:C); E: next_state s[3]? F:(s[2]? E:C); F: next_state s[3]? F:E; endcase end //状态机第三段结果输出 always(*)begin case(state) A: {fr3,fr2,fr1,dfr} 4b1111; B: {fr3,fr2,fr1,dfr} 4b0110; C: {fr3,fr2,fr1,dfr} 4b0111; D: {fr3,fr2,fr1,dfr} 4b0010; E: {fr3,fr2,fr1,dfr} 4b0011; F: {fr3,fr2,fr1,dfr} 4b0000; endcase end endmodule
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2423949.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!