hello friends...
i am providing u some verilog code for finite state machine (FSM).i provide code of 1010 sequence detector using mealy machine and moore machine using overlap and without overlap and testbenches.
1010 SEQUENCE DETECTOR
MEALY WITHOUT OVERLAP
module melfsm(din, reset, clk, y); input din; input clk; input reset; output reg y; reg [1:0] cst, nst; parameter S0 = 2'b00, //all state S1 = 2'b01, S2 = 2'b10, S3 = 2'b11; always @(cst or din) begin case (cst) S0: if (din == 1'b1) begin nst = S1; y=1'b0; end else begin nst = cst; y=1'b0; end S1: if (din == 1'b0) begin nst = S2; y=1'b0; end else begin y=1'b0; nst = cst; end S2: if (din == 1'b1) begin nst = S3; y=1'b0; end else begin nst = S0; y=1'b0; end S3: if (din == 1'b0) begin nst = S0; y=1'b1; //output will come end else begin nst = S1; y=1'b0; end default: nst = S0; endcase end always@(posedge clk) begin if (reset) cst <= S0; else cst <= nst; end endmodule TESTBENCH module melfsm_tb; reg din,clk,reset; wire y; melfsm m1(din, reset, clk, y); initial begin reset=0 ;clk=0;din=0; $monitor($time, , ,"c=%b",clk,,"y=%b",y,,"r=%b",reset,,"d=%b",din); #5 din=1; #5 din=1; #5 din=1; #10 din=0; #10 din=1; #10 din=0; #10 din=1; #10 din=0; #5 din=1; //#5 reset=1; //#5 reset=0; end always #5 clk=~clk; initial #80 $finish ; endmodule MEALY WITH OVERLAP module melfsmolp(din, reset, clk, y); output reg y; input din; input clk; input reset; reg [1:0] cst, nst; parameter S0 = 2'b00, S1 = 2'b01, S2 = 2'b10, S3 = 2'b11; always @(cst or din) begin case (cst) S0: if (din == 1'b1) begin nst = S1; y=1'b0; end else begin nst = cst; y=1'b0; end S1: if (din == 1'b0) begin nst = S2; y=1'b0; end else begin nst = cst; y=1'b0; end S2: if (din == 1'b1) begin nst = S3; y=1'b0; end else begin nst = S0; y=1'b0; end S3: if (din == 1'b0) begin nst = S2; y=1'b1; end else begin nst = S1; y=1'b0; end default: nst = S0; endcase end always@(posedge clk) begin if (reset) cst <= S0; else cst <= nst; end endmodule TESTBENCH module melfsmolp_tb; reg din,clk,reset; wire y; melfsmolp m1(din, reset, clk, y); initial begin reset=0 ;clk=0;din=0; $monitor($time, , ,"c=%b",clk,,"y=%b",y,,"r=%b",reset,,"d=%b",din); #10 din=1; #10 din=0; #10 din=1; #10 din=0; #10 din=1; #10 din=0; #10 din=1; #10 din=1; #10 din=1; #10 din=0; #10 din=1; //#5 reset=1; //#5 reset=0; end always #5 clk=~clk; initial #100 $finish ; endmodule MOORE WITHOUT OVERLAP module morfsm(din, reset, clk, y); output reg y; input din; input clk; input reset; reg [2:0] cst, nst; parameter S0 = 3'b000, S1 = 3'b001, S2 = 3'b010, S3 = 3'b100, S4 = 3'b101; always @(cst or din) begin case (cst) S0: if (din == 1'b1) begin nst = S1; y=1'b0; end else begin nst = cst; y=1'b0; end S1: if (din == 1'b0) begin nst = S2; y=1'b0; end else begin nst = cst; y=1'b0; end S2: if (din == 1'b1) begin nst = S3; y=1'b0; end else begin nst = S0; y=1'b0; end S3: if (din == 1'b0) begin nst = S4; y=1'b0; end else begin nst = S1; y=1'b0; end S4: if (din == 1'b0) begin nst = S0; y=1'b1; end else begin nst = S1; y=1'b1; end default: nst = S0; endcase end always@(posedge clk) begin if (reset) cst <= S0; else cst <= nst; end endmodule TESTBENCH module morfsm_tb; reg din,clk,reset; wire y; morfsm m1(din, reset, clk, y); initial begin reset=0 ;clk=0;din=0; $monitor($time, , ,"c=%b",clk,,"y=%b",y,,"r=%b",reset,,"d=%b",din); #10 din=1; #10 din=1; #10 din=1; #10 din=0; #10 din=1; #10 din=0; #10 din=1; #10 din=0; #10 din=1; //#5 reset=1; //#5 reset=0; end always #5 clk=~clk; initial #100 $finish ; endmodule MOORE WITH OVERLAP module morfsmolp(din, reset, clk, y); input din; input clk; input reset; output reg y; reg [2:0] cst, nst; parameter S0 = 3'b000, S1 = 3'b001, S2 = 3'b010, S3 = 3'b100, S4 = 3'b101; always @(cst or din) begin case (cst) S0: if (din == 1'b1) begin nst = S1; y=1'b0; end else nst = cst; S1: if (din == 1'b0) begin nst = S2; y=1'b0; end else begin nst = cst; y=1'b0; end S2: if (din == 1'b1) begin nst = S3; y=1'b0; end else begin nst = S0; y=1'b0; end S3: if (din == 1'b0) begin nst = S4; y=1'b0; end else begin nst = S1; y=1'b0; end S4: if (din == 1'b0) begin nst = S1; y=1'b1; end else begin nst = S3; y=1'b1; end default: nst = S0; endcase end always@(posedge clk) begin if (reset) cst <= S0; else cst <= nst; end endmodule TESTBENCH module morfsmolp_tb; reg din,clk,reset; wire y; morfsmolp m1(din, reset, clk, y); initial begin reset=0 ;clk=0;din=0; $monitor($time, , ,"c=%b",clk,,"y=%b",y,,"r=%b",reset,,"d=%b",din); #10 din=1; #10 din=1; #10 din=1; #10 din=0; #10 din=1; #10 din=0; #10 din=1; #10 din=0; #10 din=1; //#5 reset=1; //#5 reset=0; end always #5 clk=~clk; initial #100 $finish ; endmodule
hi,
ReplyDeleteIn moore with overlap at case s4 if din=0, next state has to be s0 right?
yes u r r8.
ReplyDelete@spoorthy mb @yadav Brijesh Yes it is right
ReplyDeletein moore with overlap if din = 0 in s4 then next state will be s0 not s1...please correct it.
ReplyDeleteyoyo
ReplyDeleteDoes Moore output depending on here?
ReplyDeleteDoes Moore output depending on input here...??
ReplyDeletehow to right character detector eg;AKG in mealy model
ReplyDeletewrite
ReplyDelete