VL21. 根据状态转移表实现时序电路
描述
某同步时序电路转换表如下,请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。输入描述
input A ,输出描述
output wire YVerilog 解法, 执行用时: 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