使用Verilog实现32位可逆计数器设计
可逆计数器:
可逆计数器就是在一个模块可以实现加法计数和减法计数。本质上还是一种计数器。
设计代码:
module counter_2 (
input clk,
input rst,
input en,
input [31:0] data1,
input [31:0] data2,
output reg [31:0] q,
output reg [31:0] x);
always @ (posedge clk or negedge rst or negedge en)
begin
if(!en)//-
begin
if(!rst)
q<= data2; //- initial
else if (q=={
8{
4'b0000}})
begin
x <= {
{
30{
1'b0}},2'b10};
q <= data2;
end
else
begin
q<=q-1;
x <= {
{
30{
1'b0}},2'b00};
end
end
else//+
begin
if(!rst)
q<=data1;
else if (q=={
8{
4'b1111}})
begin
x <= {
{
30{
1'b0}},2'b01};
q <= data1;
end
else
begin
q<=q+1;
x <= {
{
30{
1'b0}},2'b00};
end
end
end
endmodule
验证代码:
module counter_2_tb;
reg clk,rst,en;
reg [31:0] data1,data2;
wire [31:0] q;
wire [31:0] x;
counter_2 t1 (clk,rst,en,data1,data2,q,x);
initial
begin
clk=0;rst=0;en=1;
data1={
{
7{
4'b1111}},4'b0000};
data2={
{
7{
4'b0000}},4'b0111};
#10 rst=1;
#50 rst=0;
#10 rst=1;
#240 rst=0;
#10 en=0;rst=0;
#10 rst=1;
#240 rst=0;
#10 $finish;
end
always #6 clk=~clk;
endmodule
仿真结果截图:
这次只有局部截图,整体截图方便。如有需要,自己下载代码跑一次程序。
总结:
仅仅是一次代码上传
感想:
无