有限状态机时序电路之连续检测四个0或1的个数
设计一个4连续0或者4个连续1的序列检测FSM,定义一个长序列,在七段管上分别显示检测的4个连续0和4个连续1的个数。显示连续0和连续1的个数在七段管上的显示,分别用函数和任务实现。
比如:100000110011111000011111.。。。。
检测连0个数: 000011111111111111222222。。。。 1个数: 000000000000011111111122.。。
module show(clk,clr,x,hex1,hex2); input clk,clr,x; output reg[6:0] hex1,hex2; reg[3:0] state; reg[3:0] count1=0,count2=0; parameter S0=4'b0000,S1=4'b0001,S2=4'b0010,S3=4'b0011,S4=4'b0100,S5=4'b0101,S6=4'b0110,S7=4'b0111,S8=4'b1000;//定义八个好状态 always @(posedge clk or posedge clr) begin if(clr) state=S0; //异步复位,s0为起始状态 else case(state)//状态转移过程 S0:begin if(x) begin state<=S5; taskMatch(count1,hex1);hex2<=funMatch(count2); end else begin state<=S1; taskMatch(count1,hex1);hex2<=funMatch(count2); end end S1:begin if(x) begin state <=S5;taskMatch(count1,hex1);hex2<=funMatch(count2); end else begin state <=S2; taskMatch(count1,hex1);hex2<=funMatch(count2); end end S2:begin if(x) begin state <=S5; taskMatch(count1,hex1);hex2<=funMatch(count2); end else begin state <=S3; taskMatch(count1,hex1);hex2<=funMatch(count2); end end S3:begin if(x) begin state <=S5; taskMatch(count1,hex1);hex2 <=funMatch(count2); end else begin state<=S4; count1 <= count1+1;taskMatch(count1,hex1);hex2<=funMatch(count2); end end S4:begin if(x) begin state <=S5; taskMatch(count1,hex1);hex2<=funMatch(count2); end else begin state<=S1; ; taskMatch(count1,hex1);hex2<=funMatch(count2); end end S5:begin if(x) begin state <=S6; taskMatch(count1,hex1);hex2<=funMatch(count2); end else begin state<=S1; taskMatch(count1,hex1);hex2<=funMatch(count2); end end S6:begin if(x) begin state <=S7; taskMatch(count1,hex1);hex2<=funMatch(count2); end else begin state<=S1; taskMatch(count1,hex1);hex2<=funMatch(count2); end end S7:begin if(x) begin state <=S8; count2 <= count2+1;taskMatch(count1,hex1);hex2<=funMatch(count2); end else begin state<=S1; taskMatch(count1,hex1);hex2<=funMatch(count2); end end S8:begin if(x) begin state <=S5;taskMatch(count1,hex1);hex2<=funMatch(count2); end else begin state<=S1; taskMatch(count1,hex1);hex2<=funMatch(count2); end end default:begin state<=S0;taskMatch(count1,hex1);hex2<=funMatch(count2); end endcase end task taskMatch;//七段管显示数字的任务 input [3:0] a; output [6:0] b; case(a) 4'H0:b<=7'b1000000; 4'H1:b<=7'b1111001; 4'H2:b<=7'b0100100; 4'H3:b<=7'b0110000; 4'H4:b<=7'b0011001; 4'H5:b<=7'b0010010; 4'H6:b<=7'b0000010; 4'H7:b<=7'b1111000; 4'H8:b<=7'b0000000; 4'H9:b<=7'b0011000; 4'HA:b<=7'b0001000; 4'Hb:b<=7'b0000011; 4'Hc:b<=7'b1000110; 4'Hd:b<=7'b0100001; 4'He:b<=7'b0000110; 4'Hf:b<=7'b0001110; default:b<=7'b1111111; endcase endtask function [6:0] funMatch;//七段管显示数字的函数 input [3:0] a; case(a) 4'H0:funMatch=7'b1000000; 4'H1:funMatch=7'b1111001; 4'H2:funMatch=7'b0100100; 4'H3:funMatch=7'b0110000; 4'H4:funMatch=7'b0011001; 4'H5:funMatch=7'b0010010; 4'H6:funMatch=7'b0000010; 4'H7:funMatch=7'b1111000; 4'H8:funMatch=7'b0000000; 4'H9:funMatch=7'b0011000; 4'HA:funMatch=7'b0001000; 4'Hb:funMatch=7'b0000011; 4'Hc:funMatch=7'b1000110; 4'Hd:funMatch=7'b0100001; 4'He:funMatch=7'b0000110; 4'Hf:funMatch=7'b0001110; default:funMatch=7'b1111111; endcase endfunction endmodule