// // 状态机与时钟分频 `timescale 1ns/1ns module huawei7( input wire clk , input wire rst , output reg clk_out ); // reg clk_2, clk_4; reg [3:0] state, n_state; // 独热编码 parameter s0 = 4'b0001, s1 = 4'b0010, s2 = 4'b0100, s4 = 4'b1000; //*************code***********// // 输出 always@(posedge clk or negedge rst) begin if(!rst) clk_out <= 1'b0; else if(state == s0) // state == s1 通过,但是 s0反而不行,这是测试上的问题 clk_out <= 1'b1; else clk_out <= 1'b0; end // 状态跳转 always@(posedge clk or negedge rst) begin if(!rst) state <= s0; else state <= n_state; end // 状态计数跳转. always@(state) begin case(state) // 4个状态机4分频,相等 4进制计数器 s0: n_state = s1; s1: n_state = s2; s2: n_state = s4; s4: n_state = s0; default: state = s0; endcase end /* // 输出结果,被替换掉. always@(posedge clk or negedge rst) begin if(!rst) begin clk_2 <= 0; clk_4 <= 0; clk_out <= 0; end else if(n_state == s1)// 使用n_state,不延迟1个clk,直接4分频 clk_2 <= clk; // 下面这个也可以实现输出结果,验证通过,但是在牛客网测试板块不行 else if(n_state == s2) clk_4 <= clk_2; else if(n_state == s4) clk_out <= clk_4; else begin clk_2 <= 0; clk_4 <= 0; clk_out <= 0; end end */ //*************code***********// endmodule