小序:
先說乙個 bear 的親身體會,bear 在做一些 fpga 小設計時經常會用到資料顯示功能,比如數字時鐘,數字頻率計,溫度計,跑錶等等,往往我們會選用
led 數碼管來做顯示, 因為它驅動起來比 lcd 液晶要簡單的很多,我們知道 fpga 中暫存器在定義和儲存的資料都是採用二進位制的格式 ,而 fpga 輸出給數碼
管做顯示的資料必須是十進位制的格式 , 之前 bear 經常會選擇把乙個暫存器的個位和十位分開定義 ,比如在做數字時鐘時 ,就會吧 時,分,秒的各位和十位
都分別定義成乙個變數 ,無疑這種方法會增加**的複雜度 ,所以考慮需要乙個專門把 二進位制 的資料轉換成 十進位制 bcd碼的模組 ,在網上有一些,但是好
像都不太完整 , 所以bear花了一下午寫了乙個 ,親測效果不錯 ,希望對朋友們有所幫助,下面開始正文。
首先給出二進位製碼轉換為十進位制bcd碼的幾個步驟(以8bit二進位製碼為例):
1.將二進位製碼左移一位(或者乘2)
2.找到左移後的碼所對應的個,十,百位。
3.判斷在個位和百位的碼是否大於5,如果是則該段碼加3。
4.繼續重複以上三步直到移位8次後停止。
下面是乙個例子 ,將 1111_1111 轉換為 bcd碼 ,如果8bit資料最終移位得到18bit 資料 ,那麼個位,十位,百位分別對應12~9,16~13,18~17位。
之前寫的**在轉換完之後沒有對count清零,所以在**時候需要用rst_n清零,感謝博友onlytime417的提示,經過修改之後可以對不同的輸入值連續轉換,而不需要rst_n的復位,下面是修改後的**以及**結果,(該轉換模組已經在實際專案中應用)。
code:
`timescale 1ns / 1ps
module bin_dec(clk,bin,rst_n,one,ten,hun,count,shift_reg
);input [7:0] bin;
input clk,rst_n;
output [3:0] one,ten;
output [3:0] count;
output [1:0] hun;
output [17:0]shift_reg;
reg [3:0] one,ten;
reg [1:0] hun;
reg [3:0] count;
reg [17:0]shift_reg=18'b000000000000000000;
// 計數部分
always @ ( posedge clk or negedge rst_n )
begin
if( !rst_n )
count<=0;
else if (count==9)
count<=0;
else
count<=count+1;
end// 二進位制轉換為十進位制 /
always @ (posedge clk or negedge rst_n )
begin
if (!rst_n)
shift_reg=0;
else if (count==0)
shift_reg=;
else if ( count<=8) //實現8次移位操作
begin
if(shift_reg[11:8]>=5) //判斷個位是否》5,如果是則+3
begin
if(shift_reg[15:12]>=5) //判斷十位是否》5,如果是則+3
begin
shift_reg[15:12]=shift_reg[15:12]+2'b11;
shift_reg[11:8]=shift_reg[11:8]+2'b11;
shift_reg=shift_reg<<1; //對個位和十位操作結束後,整體左移
endelse
begin
shift_reg[15:12]=shift_reg[15:12];
shift_reg[11:8]=shift_reg[11:8]+2'b11;
shift_reg=shift_reg<<1;
endend
else
begin
if(shift_reg[15:12]>=5)
begin
shift_reg[15:12]=shift_reg[15:12]+2'b11;
shift_reg[11:8]=shift_reg[11:8];
shift_reg=shift_reg<<1;
endelse
begin
shift_reg[15:12]=shift_reg[15:12];
shift_reg[11:8]=shift_reg[11:8];
shift_reg=shift_reg<<1;
endend
endend
/輸出賦值//
always @ ( posedge clk or negedge rst_n )
begin
if ( !rst_n )
begin
one<=0;
ten<=0;
hun<=0;
endelse if (count==9) //此時8次移位全部完成,將對應的值分別賦給個,十,百位
begin
one<=shift_reg[11:8];
ten<=shift_reg[15:12];
hun<=shift_reg[17:16];
endend
endmodule
以下是**結果,bin為輸入的二進位製碼,為了便於對比,**時也化成十進位制顯示了,one,ten,hun分別對應bcd碼的個,十,百位。
修改前的**結果:
修改後的**結果:
利用verilog將二進位製碼轉換為十進位制BCD碼
小序 先說乙個 bear 的親身體會,bear 在做一些 fpga 小設計時經常會用到資料顯示功能,比如數字時鐘,數字頻率計,溫度計,跑錶等等,往往我們會選用 led 數碼管來做顯示,因為它驅動起來比 lcd 液晶要簡單的很多,我們知道 fpga 中暫存器在定義和儲存的資料都是採用二進位制的格式 而...
Verilog實現二進位製碼與格雷碼轉換
格雷碼是一種常見的編碼方式,相鄰狀態間只有一位不同 這就意味著相鄰兩個狀態間進行轉換時,只有一位發生變化,因而極大的減小了出錯機率。反之,如果使用二進位制編碼,如011 100時三位均發生改變,因此出錯的機率就會大大增加 格雷碼以及其餘常見編碼的知識詳見 verilog常見編碼方式 二進位製碼 格雷...
二進位制全加器設計 (verilog)
二進位制全加器設計 一位全加器使用乘積項之和的形式可以表示為 sum a b c in a b c in a b c in a b c in c out a b b c in a c in 其中a,b和c in為輸入,sum和c out為輸出,只使用與門,或門,非門實現乙個一位全加器,寫出veril...