HDLBits记录(三)

记录在HDLBits上做的题目,如有错误,欢迎指正。
HDLBits记录(一): 1 Getting Started and 2 Verilog Language.
HDLBits记录(二): 3 Circuits / 3.1 Combinational Logic.
HDLBits记录(三): 3 Circuits / 3.2 Sequential Logic.
HDLBits记录(四): 3 Circuits / 3.3 Building Larger Circuits.
HDLBits记录(五): 4 Verification: Reading Simulations and 5 Verification: Writing Testbenches.


3 Circuits

3.2 sequential Logic

3.2.1 latches and Flip-Flops

1 DFF

module top_module (
    input clk,    // Clocks are used in sequential circuits
    input d,
    output reg q );//
    always @(posedge clk) begin
        q <= d;
    end
endmodule

2 DFF

module top_module (
    input clk,
    input [7:0] d,
    output [7:0] q);

    always @(posedge clk) begin
    	q <= d;
    end

endmodule

3 DFF with reset

module top_module (
    input clk,
    input reset,            // Synchronous reset
    input [7:0] d,
    output [7:0] q
);
    always @(posedge clk) begin
        if(reset)
            q <= 0;
        else
        	q <= d;
    end

endmodule

4 DFF with reset value

module top_module (
    input clk,
    input reset,
    input [7:0] d,
    output [7:0] q );
    always @(negedge clk) begin
        if(reset)
            q <= 8'h34;
        else
        	q <= d;
    end
endmodule

5 DFF with asynchronous reset

module top_module (
    input clk,
    input areset,   // active high asynchronous reset
    input [7:0] d,
    output [7:0] q
);
    always @(posedge clk or posedge areset) begin
        if(areset)
            q <= 0;
        else
        	q <= d;
    end
endmodule

6 DFF with byte enable

module top_module (
    input clk,
    input resetn,
    input [1:0] byteena,
    input [15:0] d,
    output [15:0] q
);
    always @(posedge clk)begin
        if(!resetn)
            q <= 0;
        else begin
            if(byteena[1])
               q[15:8] <= d[15:8]; 
        	else
               q[15:8] <= q[15:8];
            
            if(byteena[0])
                q[7:0] <= d[7:0];
            else
                q[7:0] <= q[7:0];
        end
    end
endmodule

7 D latch

module top_module (
    input d, 
    input ena,
    output q);
	assign q = ena ? d : q;
endmodule

8 DFF

module top_module (
    input clk,
    input d, 
    input ar,   // asynchronous reset
    output q);
    always @(posedge clk or posedge ar)begin
        if(ar)
            q <= 0;
        else
            q <= d;
    end
endmodule

9 DFF

module top_module (
    input clk,
    input d, 
    input r,   // synchronous reset
    output q);
    always @(posedge clk)begin
        if(r)
            q <= 0;
        else
            q <= d;
    end
endmodule

10 DFF+gate

module top_module (
    input clk,
    input in, 
    output out);
    always @(posedge clk)begin
    	out <= in ^ out;
    end
endmodule

11 mux and DFF

module top_module (
	input clk,
	input L,
	input r_in,
	input q_in,
	output reg Q);

    always @(posedge clk) begin
        if(L)
            Q <= r_in;
    	else
            Q <= q_in;
    end
        
endmodule

12 mux and DFF

module top_module (
    input clk,
    input w, R, E, L,
    output Q
);
    always @(posedge clk) begin
        if(L)
            Q <= R;
        else
            if(E)
                Q <= w;
        	else
                Q <= Q;
    end
endmodule

13 DFFs and gate

module top_module (
    input clk,
    input x,
    output z
); 
    reg [2:0] q = 3'b0;
    
    always @(posedge clk)begin
        q[0] <= x ^ q[0];
        q[1] <= x & ~q[1];
        q[2] <= x | ~q[2];
    end
    
    assign z = ~(q[0] | q[1] | q[2]);
    
endmodule

14 creat circuit from truth table (JK)

module top_module (
    input clk,
    input j,
    input k,
    output Q); 

    always @(posedge clk) begin
        case({j,k})
            2'b00: Q <= Q;
            2'b01: Q <= 0;
            2'b10: Q <= 1;
            2'b11: Q <= ~Q;            
        endcase        
    end
endmodule

15 detect an edge

module top_module (
    input clk,
    input [7:0] in,
    output [7:0] pedge
);
    reg [7:0] in_reg;
    always @(posedge clk)begin
       in_reg <= in;
        pedge <= ~in_reg & in;
    end

endmodule

16 detect both edge



17 edge capture register


18 dual-edge triggered flip-flop

module top_module (
    input clk,
    input d,
    output q
);
    reg q1,q2;
    
    always @(posedge clk)begin
        q1 <= d;
    end
    always @(negedge clk)begin
        q2 <= d;
	end
    
    assign q = clk ? q1 : q2;
    
endmodule
3.2.2 counters

1 foub-bit binary counter

module top_module (
    input clk,
    input reset,      // Synchronous active-high reset
    output [3:0] q);

    always @(posedge clk)begin
        if(reset)
            q <= 3'b0;
        else
            q <= q + 1'b1;
    end
    
endmodule

2 decade counter

module top_module (
    input clk,
    input reset,        // Synchronous active-high reset
    output [3:0] q);
    
    always @(posedge clk)begin
        if(reset)
            q <= 3'b0;
        else
            if(q == 4'd9)
                q <= 0;
        	else
            	q <= q + 1'b1;
    end
endmodule

3 decade counter again

module top_module (
    input clk,
    input reset,
    output [3:0] q);
    
    always @(posedge clk)begin
        if(reset)
            q <= 4'b1;
        else
            if(q == 4'd10)
                q <= 1;
        	else
            	q <= q + 1'b1;
    end

endmodule

4 slow decade counter

module top_module (
    input clk,
    input slowena,
    input reset,
    output [3:0] q);
    
    always @(posedge clk)begin
        if(reset)
            q <= 4'b0;
        else
            if (slowena)
            	if(q == 4'd9)
                	q <= 0;
        		else
            		q <= q + 1'b1;
        	else 
                q <= q;
    end
endmodule

5 counter 1-12

module top_module (
    input clk,
    input reset,
    input enable,
    output [3:0] Q,
    output c_enable,
    output c_load,
    output [3:0] c_d  ); 
    
	assign c_enable = enable;
    assign c_load = reset | (Q == 4'd12 & enable);
    assign c_d = 4'd1;
    
    count4 the_counter (.clk(clk), .enable(c_enable), .load(c_load), .d(c_d), .Q(Q));

endmodule

13 counter 100

module top_module (
    input clk,
    input reset,
    output OneHertz,
    output [2:0] c_enable
); //
    wire [3:0] q1,q2,q3;
    
    assign c_enable[0] = 1'b1;
    assign c_enable[1] = (q1 == 4'd9);
    assign c_enable[2] = (q1 == 4'd9 & q2 == 4'd9);
    assign OneHertz = (q1 == 4'd9 & q2 == 4'd9 & q3 == 4'd9); 
    
    bcdcount counter0 (clk, reset, c_enable[0], q1);
    bcdcount counter1 (clk, reset, c_enable[1], q2);
    bcdcount counter2 (clk, reset, c_enable[2], q3);
    
endmodule

14 4- digit decimal counter

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    output [3:1] ena,
    output [15:0] q);
	
	always @(posedge clk) begin
		if (reset) begin
			ena <= 3'b0;
		end
		else begin
			if (q[3:0] == 4'd8 ) begin
				ena[1] <= 1;
			end
			else
				ena[1] <= 0;

			if (q[7:4] == 4'd9 && q[3:0] == 4'd8) begin
				ena[2] <= 1;
			end
			else
				ena[2] <= 0;

			if (q[11:8] == 4'd9 && q[7:4] == 4'd9 && q[3:0] == 4'd8) begin
				ena[3] <= 1;
			end
			else
				ena[3] <= 0;		
		end
	end

	always @(posedge clk) begin
		if (reset) begin
			q <= 16'b0;
		end
		else begin
			if (ena[1]) begin
				q[3:0] <= 4'b0;
				q[7:4] <= q[7:4] + 1'b1;
			end
			else begin
				q[3:0] <= q[3:0] + 1'b1;
				q[7:4] <= q[7:4];				
			end

			if (ena[2]) begin
				q[7:4] <= 4'b0;
				q[11:8] <= q[11:8] + 1'b1;
			end
			else
				q[11:8] <= q[11:8];

			if (ena[3]) begin
				q[11:8] <= 4'b0;
				
				if (q[15:12] == 4'd9 )
			    	q[15:12] <= 4'b0;
				else
					q[15:12] <= q[15:12] + 1'b1;
			end
			else
				q[15:12] <= q[15:12];	
		end
	end
endmodule

15 12-hour clock

module top_module(
    input clk,
    input reset,
    input ena,
    output pm,
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 

    //例化计数器表示秒
    wire ssl_2_ssh,ssh_2_mml;   //地位向高位进位
    cnt cnt_ssl(.clk(clk),.reset(reset),.count_start(ena),.count_end(4'd9),.end_cnt(ssl_2_ssh),.count(ss[3:0]));
    cnt cnt_ssh(.clk(clk),.reset(reset),.count_start(ssl_2_ssh),.count_end(4'd5),.end_cnt(ssh_2_mml),.count(ss[7:4]));
   
    //例化计数器表示分钟
    wire mml_2_mmh, mmh_2_hh;
    cnt cnt_mml(.clk(clk),.reset(reset),.count_start(ssh_2_mml),.count_end(4'd9),.end_cnt(mml_2_mmh),.count(mm[3:0]));
    cnt cnt_mmh(.clk(clk),.reset(reset),.count_start(mml_2_mmh),.count_end(4'd5),.end_cnt(mmh_2_hh),.count(mm[7:4]));
    
    //小时计数
    reg a_2_p;
    always @(posedge clk)begin
        if(reset)begin
            a_2_p <= 0;
            hh <= 8'h12;        // 初始条件 12:00:00 AM
        end
        else if(mmh_2_hh)begin
            if(hh == 8'h12)
                hh <= 8'h01;
            else begin
                hh <= hh + 1'b1;
                if(hh == 8'h09)
                    hh <= 8'h10;
                if(hh == 8'h11)
                    a_2_p <= ~ a_2_p;
            end
        end
    end
    assign pm = a_2_p;
endmodule

//计数器子模块,可以设置开始和结束条件
module cnt(
    input clk,
    input reset,
    input count_start,     //开始计数输入
    input [3:0] count_end, //计数到多少停止计数
    output end_cnt,        //一次计数完成标志
    output [3:0] count);
 
    wire add_cnt;
    always @(posedge clk)begin
        if(reset)begin
           count <= 4'd0; 
        end
        else if(add_cnt)begin
            if(end_cnt)
                count <= 4'd0;
            else
                count <= count + 1'b1;
        end
    end
    assign add_cnt = count_start;   //计数开始条件,当满足了开始计数
    assign end_cnt = add_cnt && count == count_end;    //计数结束产生一个标志
endmodule
3.2.3 shift registers

1 4-bit shift registers

module top_module(
    input clk,
    input areset,  // async active-high reset to zero
    input load,
    input ena,
    input [3:0] data,
    output reg [3:0] q); 
	
	always @(posedge clk or posedge areset) begin
		if (areset) begin
			q <= 4'b0;			
		end
		else begin
			if (load) begin
			 	q <= data;
			end
			else if (ena) begin
				q <= q >> 1;
			end	
			else 
				q <= q;		
		end
	end
endmodule

2 left/rignt rotator


module top_module(
    input clk,
    input load,
    input [1:0] ena,
    input [99:0] data,
    output reg [99:0] q); 
	integer i;
	
	always @(posedge clk) begin
		if (load) begin
			q <= data;
		end
		else if (ena == 2'b01) begin
			q[99] <= q[0];
			for (i = 0; i <= 98; i = i + 1)
			    q[i] <= q[i+1];
		end
		else if (ena == 2'b10) begin
			q[0] <= q[99];
			for (i = 1; i <= 99; i = i + 1)
			    q[i] <= q[i-1];
		end
		else
			q <= q;
	end
endmodule

3 left/rignt arthmetic shift by 1 or 8

module top_module(
    input clk,
    input load,
    input ena,
    input [1:0] amount,
    input [63:0] data,
    output reg [63:0] q); 
	
	always @(posedge clk) begin
		if (load) begin
			q <= data;
		end
		else if (ena) begin
			case (amount) 
			    2'b00: q <= q <<< 1;
			    2'b01: q <= q <<< 8;
			    2'b10: q <= {{q[63]},{q[63:1]}};
                2'b11: q <= {{8{q[63]}},{q[63:8]}};			            
			endcase
		end
		else
			q <= q;
	end
endmodule

4 5-bit LFSR

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 5'h1
    output [4:0] q
); 
	always @ (posedge clk) begin
		if (reset) begin
			q <= 4'b1;        
		end
		else begin
		   q[4] <= q[0] ^ 1'b0;
		   q[3] <= q[4]       ;
		   q[2] <= q[3] ^ q[0];
		   q[1] <= q[2] 	  ;
           q[0] <= q[1]       ;
	    end
	end
endmodule

5 3-bit LFSR

module top_module (
	input [2:0] SW,      // R
	input [1:0] KEY,     // L and clk
	output [2:0] LEDR);  // Q
	
	always @(posedge KEY[0]) begin
		LEDR[0] <= KEY[1] ? SW[0] : LEDR[2];
		LEDR[1] <= KEY[1] ? SW[1] : LEDR[0];
		LEDR[2] <= KEY[1] ? SW[2] : (LEDR[1] ^ LEDR[2]);
	end

endmodule

6 32-bit LFSR

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 32'h1
    output [31:0] q ); 
	
	always @ (posedge clk) begin
		if(reset)
			q <= 32'h1;
		else begin
	        q <= {q[0], q[31:1]};
	        q[31] <= q[0] ^ 1'b0; 
            q[21] <= q[0] ^ q[22];
	        q[1]  <= q[0] ^ q[2];
	        q[0]  <= q[0] ^ q[1];
        end
	end
endmodule

7 shift register

module top_module (
    input clk,
    input resetn,   // synchronous reset
    input in,
    output out);
	
	reg q_0,q_1,q_2;
	always @(posedge clk) begin
		if (!resetn) begin
			q_0 <= 0;
			q_1 <= 0;
			q_2 <= 0;
			out <= 0;	
		end
		else begin
			q_0 <= in;
			q_1 <= q_0;
			q_2 <= q_1;
			out <= q_2;				
		end
	end
endmodule

8 shift register

module top_module (
    input [3:0] SW,
    input [3:0] KEY,
    output [3:0] LEDR
); //
    MUXDFF u_1(.clk(KEY[0]), .w(KEY[3]), .E(KEY[1]), .R(SW[3]), .L(KEY[2]), .q(LEDR[3]));
    MUXDFF u_2(.clk(KEY[0]), .w(LEDR[3]), .E(KEY[1]), .R(SW[2]), .L(KEY[2]), .q(LEDR[2]));
    MUXDFF u_3(.clk(KEY[0]), .w(LEDR[2]), .E(KEY[1]), .R(SW[1]), .L(KEY[2]), .q(LEDR[1]));
    MUXDFF u_4(.clk(KEY[0]), .w(LEDR[1]), .E(KEY[1]), .R(SW[0]), .L(KEY[2]), .q(LEDR[0]));
endmodule

module MUXDFF (
	input clk,
	input w,
	input E,
	input R,
	input L,
	output q
	);
	always @(posedge clk) begin
		q <= L ? R : (E ? w : q);
	end
endmodule

9 3-input LUT

module top_module (
    input clk,
    input enable,
    input S,
    input A, B, C,
    output Z ); 

	reg [7:0] q;

	always @(posedge clk) begin
		if (enable) begin
		    q <= {q[6:0], S};   
		end
		else 
			q <= q;
	end

	always @(*) begin
		case ({A,B,C}) 
		    3'b000: Z <= q[0];
		    3'b001: Z <= q[1];
		    3'b010: Z <= q[2];
		    3'b011: Z <= q[3];
		    3'b100: Z <= q[4];
		    3'b101: Z <= q[5];
		    3'b110: Z <= q[6];
		    3'b111: Z <= q[7];
		endcase
	end
endmodule

3.2.4 More Circuits

1 Rule 90

module top_module(
    input clk,
    input load,
    input [511:0] data,
    output [511:0] q ); 
    integer i;
    always @(posedge clk)begin
        if(load)begin
           q <= data; 
        end
        else begin
            q[0] <= 1'b0 ^ q[1];
            q[511] <= 1'b0 ^ q[510];
            for(i = 1; i < 511; i = i + 1)begin
                q[i] <= q[i-1] ^ q[i+1]; 
            end
        end
    end
endmodule

2 Rule 110

module top_module(
    input clk,
    input load,
    input [511:0] data,
    output [511:0] q
); 
    integer i;
    always @(posedge clk)begin
        if(load)begin
           q <= data; 
        end
        else begin
            q[0] <= q[0];
            q[511] <= q[511] | q[510];
            for(i = 1; i < 511; i = i + 1)begin
                q[i] <= (~q[i+1] & (q[i] | q[i-1])) |  (q[i+1] & (q[i] ^ q[i-1])); 
            end
        end
    end
endmodule

3 Conway’s Game of Life 16x16


3.2.5 Finite State Machines

1 simple FSM 1

module top_module(
    input clk,
    input areset,    // Asynchronous reset to state B
    input in,
    output out);//  

    parameter A=1'b0, B=1'b1; 
    reg state, next_state;

    always @(*) begin    // This is a combinational always block
        // State transition logic
        if (state == B) 
        	next_state = in ? B : A;
        else if(state == A) 
        	next_state = in ? A : B;
        else 
            next_state = next_state;
    end

    always @(posedge clk, posedge areset) begin    // This is a sequential always block
        // State flip-flops with asynchronous reset
        if (areset) begin
        	state <= B;        
        end
        else begin
        	state <= next_state;        
        end
    end

    // Output logic
    assign out = (state == B);

endmodule

2 simple FSM 1.2

module top_module(clk, reset, in, out);
    input clk;
    input reset;    // Synchronous reset to state B
    input in;
    output out;//  
    reg out;

    // Fill in state name declarations
    parameter A=1'b0, B=1'b1; 
    reg present_state, next_state;

    always @(posedge clk) begin
        if (reset) begin  
            present_state = B;
        end 
        else begin
            case (present_state)
                B : if (in == 1'b0) 
                        next_state = A;
                	else 
                		next_state = present_state;
                A : if (in == 1'b0) 
                        next_state = B;
                	else 
                		next_state = present_state;
            endcase

            // State flip-flops
            present_state = next_state;   
		end
            case (present_state)
                // Fill in output logic
                B : out = 1;
                A : out = 0;
            endcase
       
    end

endmodule

// Note the Verilog-1995 module declaration syntax here:
module top_module(clk, reset, in, out);
    input clk;
    input reset;    // Synchronous reset to state B
    input in;
    output out;//  
    wire out;

    // Fill in state name declarations
	parameter A=1'b0;
    parameter B=1'b1;

    reg state;
    
	assign out = state;
    
    always @(posedge clk) begin
        if (reset) begin  
            state = B;
        end else begin
            case (state)
                A: begin state = (in==0)?B:A; end
                B: begin state = (in==0)?A:B; end
            endcase
        end
    end

endmodule

3 simple FSM 2

module top_module(
    input clk,
    input areset,    // Asynchronous reset to OFF
    input j,
    input k,
    output out); //  

    parameter OFF=0, ON=1; 
    reg state, next_state;

    always @(*) begin
        if(state == OFF) begin
            next_state = (j==1) ? ON : OFF;
        end
        else if(state == ON) begin
            next_state = (k==1) ? OFF : ON;
        end
        else
            next_state = OFF;
    end

    always @(posedge clk, posedge areset) begin
        // State flip-flops with asynchronous reset
        if(areset) begin
            state <= OFF;
        end
        else begin
            state <= next_state;
        end 
    end

    // Output logic
    assign out = (state == ON);

endmodule

4 simple FSM 2

module top_module(
    input clk,
    input reset,    // Asynchronous reset to OFF
    input j,
    input k,
    output out); //  

    parameter OFF=0, ON=1; 
    reg state, next_state;

    always @(*) begin
        if(state == OFF) begin
            next_state = (j==1) ? ON : OFF;
        end
        else if(state == ON) begin
            next_state = (k==1) ? OFF : ON;
        end
        else
            next_state = OFF;
    end

    always @(posedge clk) begin
        // State flip-flops with asynchronous reset
        if(reset) begin
            state <= OFF;
        end
        else begin
            state <= next_state;
        end 
    end

    // Output logic
    assign out = (state == ON);

endmodule

5 Simple state transitions 3

module top_module(
    input in,
    input [1:0] state,
    output [1:0] next_state,
    output out); //

    parameter A=0, B=1, C=2, D=3;

    // State transition logic: next_state = f(state, in)
    always @(*) begin
        case(state)
            A : begin next_state = in ? B: A; end
            B : begin next_state = in ? B: C; end
            C : begin next_state = in ? D: A; end
            D : begin next_state = in ? B: C; end
        endcase
    end
    // Output logic:  out = f(state) for a Moore state machine
    assign out = (state == D);
endmodule

6 Simple one-hot state transitions 3

module top_module(
    input in,
    input [3:0] state,
    output [3:0] next_state,
    output out); //

    parameter A=0, B=1, C=2, D=3;

    // State transition logic: Derive an equation for each state flip-flop.
    assign next_state[A] = (state[A] & ~in) | (state[C] & ~in);
    assign next_state[B] = (state[A] &  in) | (state[B] &  in) | (state[D] &  in);
    assign next_state[C] = (state[B] & ~in) | (state[D] & ~in);
    assign next_state[D] = (state[C] &  in) ;

    // Output logic: 
    assign out = (state[D] == 1);

endmodule

7 Simple FSM3 (asynchronous reset)

module top_module(
    input clk,
    input in,
    input areset, 
    output out); 

    reg [3:0] state, next_state;

    parameter A=0, B=1, C=2, D=3;

    // State transition logic: Derive an equation for each state flip-flop.
    assign next_state[A] = (state[A] & ~in) | (state[C] & ~in);
    assign next_state[B] = (state[A] &  in) | (state[B] &  in) | (state[D] &  in);
    assign next_state[C] = (state[B] & ~in) | (state[D] & ~in);
    assign next_state[D] = (state[C] &  in) ;

    always @(posedge clk or posedge areset) begin
        if(areset) begin
            state <= 4'b0001;
        end
        else begin
            state <= next_state;
        end 
    end

    // Output logic
    assign out = (state == 4'b1000);

endmodule

8 Simple FSM3 (synchronous reset)

module top_module(
    input clk,
    input in,
    input reset,    
    output out);

    reg [3:0] state, next_state;

    parameter A=0, B=1, C=2, D=3;

    // State transition logic: Derive an equation for each state flip-flop.
    assign next_state[A] = (state[A] & ~in) | (state[C] & ~in);
    assign next_state[B] = (state[A] &  in) | (state[B] &  in) | (state[D] &  in);
    assign next_state[C] = (state[B] & ~in) | (state[D] & ~in);
    assign next_state[D] = (state[C] &  in) ;

    always @(posedge clk) begin
        if(reset) begin
            state <= 4'b0001;
        end
        else begin
            state <= next_state;
        end 
    end

    // Output logic
    assign out = (state == 4'b1000);

endmodule

9 Design a Moore FSM


10 Lemmings1

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    output walk_left,
    output walk_right); //  

    parameter LEFT=0, RIGHT=1;
    reg state, next_state;

    always @(*) begin
        if(state == LEFT)begin
            if(bump_left)begin 
               next_state = RIGHT; 
            end
            else begin
                next_state = LEFT; 
            end
        end
        else begin
            if(bump_right)begin 
               next_state = LEFT; 
            end
            else begin
               next_state = RIGHT; 
            end
        end
    end

    always @(posedge clk, posedge areset) begin
        // State flip-flops with asynchronous reset
        if(areset)begin
           state <= LEFT; 
        end
        else begin
           state <= next_state; 
        end
    end

    // Output logic
    assign walk_left = (state == LEFT);
    assign walk_right = (state == RIGHT);

endmodule

11 Lemmings2

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    input ground,
    output walk_left,
    output walk_right,
    output aaah ); 
    
    parameter LEFT=0, RIGHT=1, FALL_L = 2, FALL_R = 3; 
    reg [1:0] state, next_state;
    
    always @(*) begin
        case(state)
            LEFT : begin
                if(~ground) begin
                   next_state = FALL_L;
                end
                else if(bump_left)begin 
               		next_state = RIGHT; 
            	end
            	else begin
                	next_state = LEFT; 
            	end 
            end
            RIGHT : begin 
                if(~ground) begin
                   next_state = FALL_R;  
                end
                else if(bump_right)begin 
               		next_state = LEFT; 
            	end
            	else begin
                	next_state = RIGHT; 
            	end 
            end
            FALL_L : begin 
                if(~ground) begin
                   next_state = FALL_L;  
                end
            	else begin
                	next_state = LEFT; 
            	end 
            end
            FALL_R : begin 
                if(~ground) begin
                   next_state = FALL_R;  
                end
            	else begin
                	next_state = RIGHT; 
            	end 
            end
        endcase
    end

    always @(posedge clk, posedge areset) begin
        // State flip-flops with asynchronous reset
        if(areset)begin
           state <= LEFT; 
        end
        else begin
           state <= next_state; 
        end
    end

    // Output logic
    assign walk_left  = (state == LEFT);
    assign walk_right = (state == RIGHT);
    assign aaah       = (state == FALL_R | state == FALL_L);
endmodule

12 Lemmings 3

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    input ground,
    input dig,
    output walk_left,
    output walk_right,
    output aaah,
    output digging ); 
    
    parameter LEFT=0, RIGHT=1, FALL_L = 2, FALL_R = 3, DIG_L = 4, DIG_R = 5; 
    reg [2:0] state, next_state;
    
    always @(*) begin
        case(state)
            LEFT : begin
                if(~ground) begin
                   next_state = FALL_L;
                end
                else if(dig) begin
                    next_state = DIG_L; 
                end
                else if(bump_left)begin 
               		next_state = RIGHT; 
            	end
            	else begin
                	next_state = LEFT; 
            	end 
            end
            RIGHT : begin 
                if(~ground) begin
                   next_state = FALL_R;  
                end
                else if(dig) begin
                    next_state = DIG_R; 
                end
                else if(bump_right)begin 
               		next_state = LEFT; 
            	end
            	else begin
                	next_state = RIGHT; 
            	end 
            end
            FALL_L : begin 
                if(~ground) begin
                   next_state = FALL_L;  
                end
            	else begin
                	next_state = LEFT; 
            	end 
            end
            FALL_R : begin 
                if(~ground) begin
                   next_state = FALL_R;  
                end
            	else begin
                	next_state = RIGHT; 
            	end 
            end
            DIG_L : begin
                if(~ground) begin
                   next_state = FALL_L;  
                end
            	else begin
                	next_state = DIG_L; 
            	end 
            end
            DIG_R : begin
                if(~ground) begin
                   next_state = FALL_R;  
                end
            	else begin
                	next_state = DIG_R; 
            	end 
            end
        endcase
    end

    always @(posedge clk, posedge areset) begin
        // State flip-flops with asynchronous reset
        if(areset)begin
           state <= LEFT; 
        end
        else begin
           state <= next_state; 
        end
    end

    // Output logic
    assign walk_left  = (state == LEFT);
    assign walk_right = (state == RIGHT);
    assign aaah       = (state == FALL_R | state == FALL_L);
    assign digging    = (state == DIG_R  | state == DIG_L);
endmodule

13 Lemmings4

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    input ground,
    input dig,
    output walk_left,
    output walk_right,
    output aaah,
    output digging ); 
    
    parameter LEFT=0, RIGHT=1, FALL_L = 2, FALL_R = 3, DIG_L = 4, DIG_R = 5, SPLAT = 6; 
    reg [2:0] state, next_state;
    reg [4:0] time_cnt;
    
    always @(*) begin
        case(state)
            LEFT : begin
                if(~ground) begin
                   next_state = FALL_L;
                end
                else if(dig) begin
                    next_state = DIG_L; 
                end
                else if(bump_left)begin 
               		next_state = RIGHT; 
            	end
            	else begin
                	next_state = LEFT; 
            	end 
            end
            RIGHT : begin 
                if(~ground) begin
                   next_state = FALL_R;  
                end
                else if(dig) begin
                    next_state = DIG_R; 
                end
                else if(bump_right)begin 
               		next_state = LEFT; 
            	end
            	else begin
                	next_state = RIGHT; 
            	end 
            end
            FALL_L : begin 
                if(~ground) begin
                   next_state = FALL_L;  
                end
                else if(time_cnt > 20) begin
                    next_state = SPLAT; 
                end
            	else begin
                	next_state = LEFT; 
            	end 
            end
            FALL_R : begin 
                if(~ground) begin
                   next_state = FALL_R;  
                end
                else if(time_cnt > 20) begin
                    next_state = SPLAT; 
                end
            	else begin
                	next_state = RIGHT; 
            	end 
            end
            DIG_L : begin
                if(~ground) begin
                   next_state = FALL_L;  
                end
                
            	else begin
                	next_state = DIG_L; 
            	end 
            end
            DIG_R : begin
                if(~ground) begin
                   next_state = FALL_R;  
                end
            	else begin
                	next_state = DIG_R; 
            	end 
            end
            SPLAT : begin
                next_state = SPLAT;  
            end
        endcase
    end

    always @(posedge clk or posedge areset) begin
        if(areset)begin
           time_cnt <= 0; 
        end
        else if(~ground)begin
            time_cnt <= time_cnt + 1'b1;
        end
        else begin
            time_cnt <= 0; 
        end 
    end
    
    always @(posedge clk, posedge areset) begin
        // State flip-flops with asynchronous reset
        if(areset)begin
           state <= LEFT; 
        end
        else begin
           state <= next_state; 
        end
    end

    // Output logic
    assign walk_left  = (state == LEFT);
    assign walk_right = (state == RIGHT);
    assign aaah       = (state == FALL_R | state == FALL_L);
    assign digging    = (state == DIG_R  | state == DIG_L);
endmodule

14 one-hot FSM

module top_module(
    input in,
    input [9:0] state,
    output [9:0] next_state,
    output out1,
    output out2);

    assign next_state[0] = (state[0] & ~in) | (state[1] & ~in) | (state[2] & ~in) | (state[3] & ~in) | (state[4] & ~in) | (state[7] & ~in) | (state[8] & ~in) | (state[1] & ~in) | (state[9] & ~in);
    assign next_state[1] = (state[0] & in) | (state[8] & in) | (state[9] & in);
    assign next_state[2] = (state[1] & in);
    assign next_state[3] = (state[2] & in);
    assign next_state[4] = (state[3] & in);
    assign next_state[5] = (state[4] & in);
    assign next_state[6] = (state[5] & in);
    assign next_state[7] = (state[6] & in) | (state[7] & in);
    assign next_state[8] = (state[5] & ~in);
    assign next_state[9] = (state[6] & ~in);
     
    assign out1 = state[8] | state[9];
    assign out2 = state[7] | state[9];
endmodule

15 PS/2 packet parser

module top_module(
    input clk,
    input [7:0] in,
    input reset,    // Synchronous reset
    output done); //

    parameter byte1 = 0, byte2 = 1,byte3 = 2, error = 3;
    
    reg[1:0] state, next_state;
    
    
    // State transition logic (combinational)
    always @(*)begin
        case(state)
            byte1 : begin next_state = in[3] ? byte2 : byte1; end
            byte2 : begin next_state = byte3; end
            byte3 : begin next_state = error ; end
            error : begin next_state = in[3] ? byte2 : byte1 ;end
        endcase
    end
    // State flip-flops (sequential)
    always @(posedge clk) begin
        if(reset)begin
            state <= byte1;
        end
        else begin
           state <= next_state;
        end
    end
    // Output logic
    assign done = (state == error);
endmodule

16 PS/2 packet parser and datapath

module top_module(
    input clk,
    input [7:0] in,
    input reset,    // Synchronous reset
    output [23:0] out_bytes,
    output done); //

    // FSM from fsm_ps2
   parameter byte1 = 0, byte2 = 1,byte3 = 2, error = 3;
    
    reg[1:0] state, next_state;
    
    
    // State transition logic (combinational)
    always @(*)begin
        case(state)
            byte1 : begin next_state = in[3] ? byte2 : byte1; end
            byte2 : begin next_state = byte3; end
            byte3 : begin next_state = error ; end
            error : begin next_state = in[3] ? byte2 : byte1 ;end
        endcase
    end
    // State flip-flops (sequential)
    always @(posedge clk) begin
        if(reset)begin
            state <= byte1;
        end
        else begin
           state <= next_state;
        end
    end
    // Output logic
    assign done = (state == error);
    
    // New: Datapath to store incoming bytes.
    always @(posedge clk)begin
        case(state)
            byte1 : begin out_bytes[23:16] <= in[3] ? in : 8'b0; end
            byte2 : begin out_bytes[15:8] <=  in; end
            byte3 : begin out_bytes[ 7:0] <=  in ; end
            error : begin out_bytes[23:16] <= in[3] ? in : 8'b0;end
        endcase
    end
endmodule

17 serial receiver

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output done
); 

    parameter idel = 0, start = 1, bit1=2, bit2=3, bit3=4, bit4=5, bit5=6, bit6=7, bit7=8, bit8=9, stop = 10, error =11;
    reg [3:0] state, next_state;
    
    always @(posedge clk)begin
        if(reset)begin
           state <= idel;
        end
        else begin
           state <= next_state;
        end
    end
    always @(*)begin
        case(state)
            idel:begin next_state = ~in ? start : idel; end
            start:begin next_state = bit1;end
            bit1:begin next_state = bit2;end
            bit2:begin next_state = bit3;end
            bit3:begin next_state = bit4;end
            bit4:begin next_state = bit5;end
            bit5:begin next_state = bit6;end
            bit6:begin next_state = bit7;end
            bit7:begin next_state = bit8;end
            bit8:begin next_state =  in ? stop : error; end
            stop:begin next_state = ~in ? start : idel; end
            error : begin next_state = in ? idel : error; end
        endcase
    end
    
    assign done = (state == stop);
endmodule

18 serial receiver and datapath

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output [7:0] out_byte,
    output done
); //

    // Use FSM from Fsm_serial
    parameter idel = 0, start = 1, bit1=2, bit2=3, bit3=4, bit4=5, bit5=6, bit6=7, bit7=8, bit8=9, stop = 10, error =11;
    reg [3:0] state, next_state;
    
    always @(posedge clk)begin
        if(reset)begin
           state <= idel;
        end
        else begin
           state <= next_state;
        end
    end
    always @(*)begin
        case(state)
            idel:begin next_state = ~in ? start : idel; end
            start:begin next_state = bit1;end
            bit1:begin next_state = bit2;end
            bit2:begin next_state = bit3;end
            bit3:begin next_state = bit4;end
            bit4:begin next_state = bit5;end
            bit5:begin next_state = bit6;end
            bit6:begin next_state = bit7;end
            bit7:begin next_state = bit8;end
            bit8:begin next_state =  in ? stop : error; end
            stop:begin next_state = ~in ? start : idel; end
            error : begin next_state = in ? idel : error; end
        endcase
    end
    
    assign done = (state == stop);
    // New: Datapath to latch input bits.
    always @(posedge clk)begin
        case(state)
            start:begin out_byte[0] <= in;end
            bit1:begin out_byte[1] <= in;end
            bit2:begin out_byte[2] <= in;end
            bit3:begin out_byte[3] <= in;end
            bit4:begin out_byte[4] <= in;end
            bit5:begin out_byte[5] <= in;end
            bit6:begin out_byte[6] <= in;end
            bit7:begin out_byte[7] <= in; end
        endcase
    end
endmodule

19 serial receiver and parity checking


20 sequence recognition

module top_module(
    input clk,
    input reset,    // Synchronous reset
    input in,
    output disc,
    output flag,
    output err);

    parameter idel = 0, bit1 = 1, bit2=2, bit3=3, bit4=4, bit5=5, bit6=6,bit7 = 7, s_disc= 8,s_flag = 9,s_error=10;
    reg [3:0] state, next_state;
    
    always @(posedge clk) begin
        if(reset)begin
           state <= idel; 
        end
        else begin 
           state <= next_state; 
        end
    end
    always @(*)begin
        case(state)
            idel : begin next_state = in ? bit1 : idel; end
            bit1: begin next_state = in ? bit2 : idel; end
            bit2: begin next_state = in ? bit3 : idel; end
            bit3: begin next_state = in ? bit4 : idel; end
            bit4: begin next_state = in ? bit6 : idel; end
            bit6: begin next_state = ~in ? s_disc : bit7; end
            bit7: begin next_state = ~in ? s_flag : s_error; end
            s_error: begin next_state = in ? s_error : idel; end
            s_disc : begin next_state = in ? bit1 : idel; end
            s_flag : begin next_state = in ? bit1 : idel; end
        endcase
    end
    
    assign disc = (state == s_disc);
    assign flag = (state == s_flag);
    assign err  = (state == s_error);
endmodule

21 design a Mealy FSM

module top_module (
    input clk,
    input aresetn,    // Asynchronous active-low reset
    input x,
    output z ); 

    parameter s0 = 0, s1 = 1, s2 = 2;
    reg[1:0] state,next_state;
    
    always @(posedge clk or negedge aresetn)  begin
        if(!aresetn) 
            state <= s0;
        else
            state <= next_state;
    end
    always @(*)begin
        case(state)
            s0: begin next_state =  x ? s1 : s0; end
            s1: begin next_state = ~x ? s2 : s1; end
            s2: begin next_state =  x ? s1 : s0; end
            default : next_state =  s0;
        endcase
    end
    
    assign z = (state == s2 && x == 1);
    
    
endmodule

22 serial two’s complementer (Moore FSM)


23 serial two’s complementer (Mealy FSM)


24 Q3a: FSM


25 Q3b: FSM

module top_module (
    input clk,
    input reset,   // Synchronous reset
    input x,
    output z
);
    parameter s0 = 0, s1 = 1, s2 = 2, s3 = 3, s4 = 4;
    reg[2:0] state,next_state;
    
    always @(posedge clk)  begin
        if(reset) 
            state <= s0;
        else
            state <= next_state;
    end
    always @(*)begin
        case(state)
            s0: begin next_state =  x ? s1 : s0; end
            s1: begin next_state =  x ? s4 : s1; end
            s2: begin next_state =  x ? s1 : s2; end
            s3: begin next_state =  x ? s2 : s1; end
            s4: begin next_state =  x ? s4 : s3; end
            default : next_state =  s0;
        endcase
    end
    
    assign z = (state == s3 ||state == s4);
endmodule

26 Q3c: FSM logic

module top_module (
    input clk,
    input [2:0] y,
    input x,
    output Y0,
    output z
);
    parameter s0 = 0, s1 = 1, s2 = 2, s3 = 3, s4 = 4;
    reg[2:0] next_state;
    
    always @(*)begin
        case(y)
            s0: begin next_state =  x ? s1 : s0; end
            s1: begin next_state =  x ? s4 : s1; end
            s2: begin next_state =  x ? s1 : s2; end
            s3: begin next_state =  x ? s2 : s1; end
            s4: begin next_state =  x ? s4 : s3; end
            default : next_state =  s0;
        endcase
    end
    
    assign Y0 = next_state[0];
    assign z = (y == s3 ||y == s4);
endmodule

27 Q6b: FSM next-state logic


28 Q6c: FSM one-hot next-state logic


29 Q6: FSM


30 Q2a: FSM


31 Q2b: one-hot FSM equations


32 Q2a: FSM


33 Q2b: another FSM


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值