热度 12| |||
状态机:全称是有限状态机,缩写为fsm,是组合逻辑和时序逻辑的一种组合
独热码:每个状态只有一个寄存器置位,译码逻辑简单
四段论写出来的状态机是三段式状态机
状态空间定义
状态跳转(时序逻辑)
下个状态判断(组合逻辑)
各个状态下的动作(时序逻辑和时序逻辑都可以)
给出分频器的代码
verilog;toolbar:false">module divider7_fsm( input clk, input rst_n, //输出时钟 output reg clk_divider //一定要申明类型!!! ); //reg define reg [6:0] curr_st; reg [6:0] next_st; //parameter define 状态空间定义 parameter s0 = 7'b0000_001; parameter s1 = 7'b0000_010; parameter s2 = 7'b0000_100; parameter s3 = 7'b0001_000; parameter s4 = 7'b0010_000; parameter s5 = 7'b0100_000; parameter s6 = 7'b1000_000; //状态跳转(时序逻辑) always @ (posedge clk or negedge rst_n) begin if(!rst_n) curr_st <= s0; else curr_st <= next_st; end //下个状态判断(组合逻辑) always @ (*)begin case (curr_st) s0 : next_st = s1; s1 : next_st = s2; s2 : next_st = s3; s3 : next_st = s4; s4 : next_st = s5; s5 : next_st = s6; s6 : next_st = s0; default : next_st = s0; endcase end //各个状态下的判断 always @ (posedge clk or negedge rst_n)begin if(!rst_n) clk_divider <= 0; else if ((curr_st == s0)|(curr_st == s1)|(curr_st == s2)|(curr_st == s3)) clk_divider <= 0; else if((curr_st == s4)|(curr_st == s5)|(curr_st == s6)) clk_divider <= 1; else ; //这个别漏了 ,不然就不是完整的,而且会产生latch!!!1 end endmodule