列表

详情


VL21. 根据状态转移表实现时序电路

描述

某同步时序电路转换表如下,请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。


电路的接口如下图所示。


输入描述

      input                A   ,
      input                clk ,
      input                rst_n

输出描述

      output   wire        Y  

原站题解

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns

module seq_circuit(
      input                A   ,
      input                clk ,
      input                rst_n,
 
      output   wire        Y   
);
    reg [1:0] state;
    
    always@(posedge clk or negedge rst_n)
    begin   
        if(!rst_n)
            state <= 2'b00;
        else if( A )
        begin
            if( state == 2'b00)
                state <= 2'b11;
            else
                state <= state -2'd1;
        end
        else
        begin
            if( state == 2'b11)
                state <= 2'b00;
            else
                state <= state + 2'd1;
        end
    end
    
    
    assign Y = (state == 2'b11) ? 1:0;
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns

module seq_circuit(
      input                A   ,
      input                clk ,
      input                rst_n,
 
      output   wire        Y   
);
    reg [1:0] crnt_state;
    reg [1:0] next_state;
    reg y;
    always @ (posedge clk or negedge rst_n) begin
        if (~rst_n) begin
            crnt_state <= 2'b00;
            next_state <= 2'b00;
        end
        else
            crnt_state <= next_state;
    end
    always @ (*) begin
        case (crnt_state)
            2'b00: next_state = (A == 1'b1)? 2'b11 : 2'b01;
            2'b01: next_state = (A == 1'b1)? 2'b00 : 2'b10;
            2'b10: next_state = (A == 1'b1)? 2'b01 : 2'b11;
            2'b11: next_state = (A == 1'b1)? 2'b10 : 2'b00;
            default: next_state = 2'b00;
        endcase
    end
    always @ (negedge rst_n or y or crnt_state) begin
        if (~rst_n) 
            y <= 1'b0;
        else if (crnt_state == 2'b11)
            y <= 1'b1;
        else 
            y <= 1'b0;
    end
    assign Y = y;
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns

module seq_circuit(
      input                A   ,
      input                clk ,
      input                rst_n,
 
      output   wire        Y   
);
    reg [1:0]cs,ns;
    //第一段,时序逻辑,将现态赋值给次态
    always@(posedge clk or negedge rst_n)begin
        if(~rst_n)begin
            cs<=2'b00;
            ns<=2'b00;
        end
        else
            cs<=ns;
    end
    //第二段,组合逻辑,现态和输入决定条件
    always@(*)begin
        case(cs)
            2'b00:ns=(A==1'b1)?2'b11:2'b01;
            2'b01:ns=(A==1'b1)?2'b00:2'b10;
            2'b10:ns=(A==1'b1)?2'b01:2'b11;
            2'b11:ns=(A==1'b1)?2'b10:2'b00;
            default:ns<=2'b00;
        endcase
    end
    assign Y=(cs==2'b11)?1:0;
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns

module seq_circuit(
      input                A   ,
      input                clk ,
      input                rst_n,
 
      output   wire        Y   
);

// reg [1:0] Q0;

// always @(posedge clk or negedge rst_n)
// begin
// 	if(~rst_n) begin
// 		Q0 <= 0;
// 	end
// 	else begin
// 	Q0[1] <= ((~A) & (Q0[1]^ Q0[0])) | (A & (Q0[1] ~^ Q0[0]));
//     Q0[0] <= ~Q0[0];
// 	end
// end
// assign Y = Q0[0] & Q0[1];
    
    
reg [1:0] state, next_state;

always @(posedge clk or negedge rst_n)
if(!rst_n) begin
    state <= 0; end
else begin
	state <= next_state;
end

always @(*) begin
	case (state)
		2'b00: next_state = A? 2'b11: 2'b01;
		2'b01: next_state = A? 2'b00: 2'b10;
		2'b10: next_state = A? 2'b01: 2'b11;
		2'b11: next_state = A? 2'b10: 2'b00;
	endcase
end

assign Y = (state==2'd11);
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns

module seq_circuit(
      input                A   ,
      input                clk ,
      input                rst_n,
 
      output   wire        Y   
);

    reg q0, q1;
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            q1 <= 0;
        end
        else begin
            q1 <= A ^ q0 ^ q1;
        end
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            q0 <= 0;
        end
        else begin
            q0 <= ~q0;
        end
    end
    assign Y = q0 & q1;

endmodule

上一题