Verilog设计参数化的译码器与编码器,以及设计4位格雷码计数器
使用Quartus+modelsim完成设计
文章目录
- Verilog设计参数化的译码器与编码器,以及设计4位格雷码计数器
- 1. 参数化的译码器
- 分析
- 代码实现
- Testbench
- 结果
- 2. 参数化的编码器
- 分析
- 代码
- Testbench
- 结果
- 3. 4位格雷码计数器
- 分析
- 代码
- Testbench
- 结果
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 finishalways@(*)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
beginin=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:encoderfor (i=m-1;i>0;i=i-1)if(in[i]==1)beginy = i;disable encoder;//jump loop called encoderendelse y = 0;endendmodule
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] |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 |
0 | 0 | 1 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 0 |
0 | 1 | 1 | 1 |
0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 |
1 | 1 | 0 | 0 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
1 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 |
1 | 0 | 0 | 0 |
代码
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;elsecase(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;endcaseendmodule
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 stateclk = 0;#5 rst_n = 1;#100 $stop;
endalways #5 clk = ~clk;initial $monitor($time,"-> \t now state of gray is : %b",gray);
endmodule
结果
输出结果与预期一致
-
Modelsim波形显示以及monitor输出
-
逻辑综合电路