描述
某同步时序电路的状态转换图如下,→上表示“C/Y”,圆圈内为现态,→指向次态。
请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。
如图所示:
电路的接口如下图所示,C是单bit数据输入端。
如图所示:
输入描述
input C ,
input clk ,
input rst_n
输出描述
output wire Y
解题分析
本题提供的是状态转换图,可采用状态机实现,也可采用列激励方程、输出方程,进而用D触发器和组合逻辑电路实现。本题解采用第二种方案实现。
由状态转换图可得出,电路共4个状态,所以使用2个寄存器来实现状态的寄存。两个寄存器的输出为Q1和Q0,两个寄存器的输入为D1和D0。可列出状态转换表如下:
由状态转换表可列出激励方程如下:
输出方程如下:
根据激励方程和输出方程以及思路整理,关键电路如下:
将电路转换成Verilog代码描述如下:
reg Q1 ;
reg Q0 ;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
Q1 <= 1'b0;
else
Q1 <= (Q1 & (Q0 | C)) | (~Q1 & Q0 & ~C);
end
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
Q0 <= 1'b0;
else
Q0 <= (~Q1 & (Q0 | C)) | (Q1 & Q0 & ~C);
end
assign Y = (C & Q1) | (Q1 & Q0);
参考代码
`timescale 1ns/1ns
module seq_circuit(
input C ,
input clk ,
input rst_n,
output wire Y
);
reg Q1 ;
reg Q0 ;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
Q1 <= 1'b0;
else
Q1 <= (Q1 & (Q0 | C)) | (~Q1 & Q0 & ~C);
end
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
Q0 <= 1'b0;
else
Q0 <= (~Q1 & (Q0 | C)) | (Q1 & Q0 & ~C);
end
assign Y = (C & Q1) | (Q1 & Q0);
endmodule
方法二
`timescale 1ns/1ns
module seq_circuit(
input C ,
input clk ,
input rst_n,
output wire Y
);
reg [1:0] state;
always @(posedge clk or negedge rst_n)
begin
if(~rst_n)
begin
state <= 2'b00;
end
else
begin
case(state)
2'b00:
begin
if(C)
state <= 2'b01;
else
state <= 2'b00;
end
2'b01:
begin
if(C)
state <= 2'b01;
else
state <= 2'b11;
end
2'b10:
begin
if(C)
state <= 2'b10;
else
state <= 2'b00;
end
2'b11:
begin
if(C)
state <= 2'b10;
else
state <= 2'b11;
end
endcase
end
end
assign Y = (state == 2'b11)?1'b1:(state == 2'b10)?C:1'b0 ;
endmodule
注:解题分析来源于网友,如有侵权,请告删之。