1、问题描述:
某同步时序电路转换表如下,请使用verilog实现此同步时序电路。
模块名称和端口要求:
module name: seq_circuit input ports: A, clk, rst_n(异步复位) output ports: Y
样例波形:
2、verilog程序如下:
module seq_circuit(
input A,
input clk,
input rst_n,
output reg Y
);
reg Q1=0;
reg Q0=0;
always@(posedge clk,negedge rst_n)begin
if(!rst_n)begin
Y<=0;
Q0<=0;
Q1<=0;
end
else if(A==0)
case({Q1,Q0})
2'b00:begin Y<=0;Q1<=0;Q0<=1;end
2'b01:begin Y<=0;Q1<=1;Q0<=0;end
2'b10:begin Y<=1;Q1<=1;Q0<=1;end
2'b11:begin Y<=0;Q1<=0;Q0<=0;end
endcase
else if(A==1)
case({Q1,Q0})
2'b00:begin Y<=1;Q0<=1;Q1<=1;end
2'b01:begin Y<=0;Q1<=0;Q0<=0;end
2'b10:begin Y<=0;Q1<=0;Q0<=1;end
2'b11:begin Y<=0;Q1<=1;Q0<=0;end
endcase
end
endmodule
Q1Q0的下一状态为11时,即输出的Y=1; 因此case语句并不是与题目描述一一对应。
3、testbench:
module tb_seq_circuit();
reg A;
reg clk;
reg rst_n;
wire Y;
seq_circuit U(A,clk,rst_n,Y);
initial begin
A=0;rst_n=0; clk=0;
#10 A=0;rst_n=0; clk=1;
#5 A=0;rst_n=0; clk=0;
#5 A=0;rst_n=1; clk=1;
#5 A=0;rst_n=1; clk=0;
#5 A=0;rst_n=1; clk=1;
#5 A=0;rst_n=1; clk=0;
#5 A=0;rst_n=1; clk=1;
#5 A=0;rst_n=1; clk=0;
#5 A=1;rst_n=1; clk=1;
#5 A=1;rst_n=1; clk=0;
#5 A=1;rst_n=1; clk=1;
#5 A=1;rst_n=1; clk=0;
#5 A=1;rst_n=1; clk=1;
#5 A=1;rst_n=1; clk=0;
#5 A=1;rst_n=1; clk=1;
end
initial begin
$dumpfile("test.vcd");
$dumpvars(0);
end
endmodule
波形图:
4、总结:
熟悉case语句和简单的时序电路。