利用verilog將二進位製碼轉換為十進位制BCD碼

2021-10-05 07:58:38 字數 3175 閱讀 8961

小序:

先說乙個 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...