使用Verilog实现32位可逆计数器设计

使用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

仿真结果截图:

这次只有局部截图,整体截图方便。如有需要,自己下载代码跑一次程序。
在这里插入图片描述

总结:

仅仅是一次代码上传

感想:

猜你喜欢

转载自blog.csdn.net/yixiaoyaobd/article/details/108112868