题目
某同步时序电路的状态转换图如下,箭头上表示“C/Y”,圆圈内为现态,箭头指向次态。请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。
电路的接口如下图所示,C是单bit数据输入端。
信号 | 类型 | 输入/输出 | 位宽 |
---|---|---|---|
clk | wire | Intput | 1 |
rst_n | wire | Intput | 1 |
C | wire | Intput | 1 |
Y | wire | Output | 1 |
答案
在这里使用三段式状态机实现。
`timescale 1ns/1ns
module seq_circuit(
input C ,
input clk ,
input rst_n,
output wire Y
);
reg [1:0] cuur_state;
reg [1:0] next_state;
reg r_Y;
//三段式状态机
//第一段
always @(posedge clk or negedge rst_n)
if(!rst_n)
cuur_state <= 2'b00;
else
cuur_state <= next_state;
//第二段
always @(*)
begin
case(cuur_state)
2'b00: next_state = C ? 2'b01 : 2'b00;
2'b01: next_state = C ? 2'b01 : 2'b11;
2'b10: next_state = C ? 2'b10 : 2'b00;
2'b11: next_state = C ? 2'b10 : 2'b11;
default:next_state = 2'b00;
endcase
end
//第三段
always @(*)
if(!rst_n)
r_Y = 1'b0;
else if(cuur_state == 2'b11|| ((cuur_state==2'b10)&&(C==1'b1)))
r_Y = 1'b1;
else
r_Y = 1'b0;
assign Y = r_Y;
endmodule