Verilog设计参数化的译码器与编码器,以及设计4位格雷码计数器

Verilog设计参数化的译码器与编码器,以及设计4位格雷码计数器

使用Quartus+modelsim完成设计

1. 参数化的译码器

在这里插入图片描述

分析

参数化译码器,由于输出Y使用的是独热码,所以可以直接用移位运算符实现。

代码实现

module decodern #(
	parameter n=3,
				 m=1<<n
	)(
	input wire[n-1:0]in,
	output reg[m-1:0]y
	);
	//y is one-hot, so just use shift to finish
	always@(*)y=1<<in;
endmodule 

Testbench

`timescale 1 ns/ 1 ns
module decodern_vlg_tst();
reg [2:0] in;
// wires                                               
wire [7:0]  y;
                      
decodern i1 ( 
	.in(in),
	.y(y)
);
initial                                                
begin
	in=3'b010;
	#10 in=3'b001;
	#10 in=3'b111;
	#10 $stop;
end
initial 
	$monitor($time,": in=%b \t -> \t y=%b ",in,y);
endmodule

结果

输出结果与预期一致

  • Modelsim波形显示以及monitor输出
    在这里插入图片描述
    在这里插入图片描述

  • 逻辑综合电路
    在这里插入图片描述

2. 参数化的编码器

在这里插入图片描述

分析

参数化的编码器,主要问题点是实现优先编码,只识别最高位最先为“1”的位数,然后赋值给输出y

  • 为了实现优先编码,应该到达就跳出循环,quartus的语法中不支持break;
  • 可以使用disable来跳出循环

代码

module encodern #(
	parameter n=3,
				 m=1<<n
)(
	input wire[m-1:0]in,
	output reg[n-1:0]y
);
	integer i;
	always@(*)
	begin:encoder
		for (i=m-1;i>0;i=i-1)
			if(in[i]==1)
			begin
				y = i;
				disable encoder;
				//jump loop called encoder
			end
			else y = 0;
	end
	
endmodule 

Testbench

`timescale 1 ns/ 1 ns
module encodern_vlg_tst();
reg [7:0] in;
// wires                                               
wire [2:0]  y;

// assign statements (if any)                          
encodern i1 (
// port map - connection between master ports and signals/registers   
	.in(in),
	.y(y)
);
initial                                                
begin        
	in = 8'b1000_0000;
	#10 in = 8'b0111_1111;
	#10 in = 8'b0010_1000;
	#10 in = 8'b0000_0000;
	#10 in = 8'b0000_0000;
	#10 $stop;
end
initial $monitor($time, ": in:%b \t -> \t y:%b",in,y);
endmodule

结果

输出结果与预期一致

  • Modelsim波形显示以及monitor输出
    在这里插入图片描述
    在这里插入图片描述

  • 逻辑综合电路
    在这里插入图片描述

3. 4位格雷码计数器

在这里插入图片描述

分析

对于四位格雷码,可以直接用一个Case解决,实现一个循环,同时注意是异步复位

Q[3]Q[2]Q[1]Q[0]
0000
0001
0011
0010
0110
0111
0101
0100
1100
1101
1111
1110
1010
1011
1001
1000

代码

module Gray(
	input clk,
	input rst_n,
	output reg[3:0]gray
);
	always@(posedge clk or negedge rst_n)
	if(!rst_n)	gray <= 4'b0000;
	else
		case(gray)
			4'b0000 : gray <= 4'b0001;
			4'b0001 : gray <= 4'b0011;
			4'b0011 : gray <= 4'b0010;
			4'b0010 : gray <= 4'b0110;
			4'b0110 : gray <= 4'b0111;
			4'b0111 : gray <= 4'b0101;
			4'b0101 : gray <= 4'b0100;
			4'b0100 : gray <= 4'b1100;
			4'b1100 : gray <= 4'b1101;
			4'b1101 : gray <= 4'b1111;
			4'b1111 : gray <= 4'b1110;
			4'b1110 : gray <= 4'b1010;
			4'b1010 : gray <= 4'b1011;
			4'b1011 : gray <= 4'b1001;
			4'b1001 : gray <= 4'b1000;
			4'b1000 : gray <= 4'b0000;
			default : gray <= 4'bx;
		endcase

endmodule 

Testbench

`timescale 1 ns/ 1 ns
module Gray_vlg_tst();
reg clk;
reg rst_n;
// wires                                               
wire [3:0]  gray;

// assign statements (if any)                          
Gray i1 (
// port map - connection between master ports and signals/registers   
	.clk(clk),
	.gray(gray),
	.rst_n(rst_n)
);
initial 
begin 
	rst_n = 0;//initial state
	clk = 0;
	#5 rst_n = 1;
	#100 $stop;
end

always #5 clk = ~clk;

initial $monitor($time,"-> \t now state of gray is : %b",gray);
endmodule

结果

输出结果与预期一致

  • Modelsim波形显示以及monitor输出
    在这里插入图片描述
    在这里插入图片描述

  • 逻辑综合电路

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值