Verilog设计参数化的译码器与编码器,以及设计4位格雷码计数器
生活随笔
收集整理的這篇文章主要介紹了
Verilog设计参数化的译码器与编码器,以及设计4位格雷码计数器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Verilog設(shè)計(jì)參數(shù)化的譯碼器與編碼器,以及設(shè)計(jì)4位格雷碼計(jì)數(shù)器
使用Quartus+modelsim完成設(shè)計(jì)
文章目錄
- Verilog設(shè)計(jì)參數(shù)化的譯碼器與編碼器,以及設(shè)計(jì)4位格雷碼計(jì)數(shù)器
- 1. 參數(shù)化的譯碼器
- 分析
- 代碼實(shí)現(xiàn)
- Testbench
- 結(jié)果
- 2. 參數(shù)化的編碼器
- 分析
- 代碼
- Testbench
- 結(jié)果
- 3. 4位格雷碼計(jì)數(shù)器
- 分析
- 代碼
- Testbench
- 結(jié)果
1. 參數(shù)化的譯碼器
分析
參數(shù)化譯碼器,由于輸出Y使用的是獨(dú)熱碼,所以可以直接用移位運(yùn)算符實(shí)現(xiàn)。
代碼實(shí)現(xiàn)
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; endmoduleTestbench
`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結(jié)果
輸出結(jié)果與預(yù)期一致
-
Modelsim波形顯示以及monitor輸出
-
邏輯綜合電路
2. 參數(shù)化的編碼器
分析
參數(shù)化的編碼器,主要問題點(diǎn)是實(shí)現(xiàn)優(yōu)先編碼,只識別最高位最先為“1”的位數(shù),然后賦值給輸出y
- 為了實(shí)現(xiàn)優(yōu)先編碼,應(yīng)該到達(dá)就跳出循環(huán),quartus的語法中不支持break;
- 可以使用disable來跳出循環(huán)
代碼
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;endendmoduleTestbench
`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結(jié)果
輸出結(jié)果與預(yù)期一致
-
Modelsim波形顯示以及monitor輸出
-
邏輯綜合電路
3. 4位格雷碼計(jì)數(shù)器
分析
對于四位格雷碼,可以直接用一個Case解決,實(shí)現(xiàn)一個循環(huán),同時注意是異步復(fù)位
| 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;endcaseendmoduleTestbench
`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結(jié)果
輸出結(jié)果與預(yù)期一致
-
Modelsim波形顯示以及monitor輸出
-
邏輯綜合電路
總結(jié)
以上是生活随笔為你收集整理的Verilog设计参数化的译码器与编码器,以及设计4位格雷码计数器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux中配置ftp服务器
- 下一篇: 【排序算法】python 十大经典排序算