十进制数转换BCD码
生活随笔
收集整理的這篇文章主要介紹了
十进制数转换BCD码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有必要仔細闡述這一節,目前就是用在數碼管顯示,在單片機使用時,我們通常是將十進制數字進行/和%運算,得到每個位置的十進制數字,在這里可能是為了節省使用存儲器的量,運用的是加三移位法具體其實就是將每個數字不顧位置,各自轉換為二進制形式
例如:
255 變成 0010 _0101_0101 的過程
移位的次數一定是該數字的二進制位數,加三不確定(加三也是要判斷每4位的二進制大于4才加三,所以是每次移位以后都要判斷)
module bcd_8421(input wire sys_clk,input wire sys_rst,input wire [19:0] data,output reg [3:0] ge,output reg [3:0] shi,output reg [3:0] bai,output reg [3:0] qian,output reg [3:0] wan,output reg [3:0] shi_wan);reg [4:0] cnt_shift; //移位判斷計數器 reg [43:0] data_shift; //移位判斷數據寄存器 reg shift_flag; //移位判斷標志信號always @(posedge sys_clk or negedge sys_rst) //0到21的循環計數(移位加三的方式實現的話,首位各加一個,999_999十進制換算到二進制有20位)if(!sys_rst )cnt_shift <= 5'd0;else if ((cnt_shift==5'd21) && (shift_flag == 1'b1))cnt_shift <= 5'd0;else if (shift_flag == 1'b1)cnt_shift <= cnt_shift + 1'b1;else cnt_shift <= cnt_shift;always @(posedge sys_clk or negedge sys_rst) //移位判斷標志信號,控制移位判斷的先后順序if(!sys_rst )shift_flag <= 1'b0;else shift_flag <= ~shift_flag;always @(posedge sys_clk or negedge sys_rst) //data_shift有44位,其中高24位是999_999形成的BCD碼需要24位,低20位是999_999的二進制形式是20位if(!sys_rst )data_shift <=44'b0;else if (cnt_shift == 5'd0)data_shift <= {24'b0, data }; else if ((cnt_shift <= 5'd20)&&(shift_flag==1'b0)) //cnt_shift=0時,還是上次的,因為六位數最大變成二進制有20位,所以考慮有20次判斷和移位操作,21次穩定,將它輸出,begindata_shift[23:20] <= (data_shift[23:20]>4) ? (data_shift[23:20]+2'd3) : (data_shift[23:20]);data_shift[27:24] <= (data_shift[27:24]>4) ? (data_shift[27:24]+2'd3) : (data_shift[27:24]);data_shift[31:28] <= (data_shift[31:28]>4) ? (data_shift[31:28]+2'd3) : (data_shift[31:28]);data_shift[35:32] <= (data_shift[35:32]>4) ? (data_shift[35:32]+2'd3) : (data_shift[35:32]);data_shift[39:36] <= (data_shift[39:36]>4) ? (data_shift[39:36]+2'd3) : (data_shift[39:36]);data_shift[43:40] <= (data_shift[43:40]>4) ? (data_shift[43:40]+2'd3) : (data_shift[43:40]);end else if ((cnt_shift <= 5'd20)&&(shift_flag==1'b1))data_shift <= data_shift << 1;else data_shift <= data_shift; always @(posedge sys_clk or negedge sys_rst) //當計數器等于20時,對各位置的賦值(BCD)if(!sys_rst )begin ge <= 4'b0;shi <= 4'b0;bai <= 4'b0;qian <= 4'b0;wan <= 4'b0;shi_wan <= 4'b0;endelse if (cnt_shift == 5'd21)beginge <= data_shift[23:20];shi <= data_shift[27:24];bai <= data_shift[31:28];qian <= data_shift[35:32];wan <= data_shift[39:36];shi_wan <= data_shift[43:40];end elsebeginge <= ge ;shi <= shi ;bai <= bai ;qian <= qian ;wan <= wan ;shi_wan <= shi_wan ;end endmodule?
module vtf;// Inputsreg sys_clk;reg sys_rst;reg [19:0] data;// Outputswire [3:0] ge;wire [3:0] shi;wire [3:0] bai;wire [3:0] qian;wire [3:0] wan;wire [3:0] shi_wan;// Instantiate the Unit Under Test (UUT)bcd_8421 uut (.sys_clk(sys_clk), .sys_rst(sys_rst), .data(data), .ge(ge), .shi(shi), .bai(bai), .qian(qian), .wan(wan), .shi_wan(shi_wan));initial begin// Initialize Inputssys_clk = 0;sys_rst = 0;data = 0;// Wait 100 ns for global reset to finish#100;sys_rst <= 1'b1;data <= 20'd0;#100000;data <= 20'd123_456;#100000;data <= 20'd999_999;#100000;data <= 20'd123_895;#100000;data <= 20'd456_789;#100000;data <= 20'd999_999;#100000;data <= 20'd456_789;// Add stimulus hereendalways # 10 sys_clk = ~sys_clk;endmodule總結
以上是生活随笔為你收集整理的十进制数转换BCD码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]unity3D游戏开发之GUI
- 下一篇: 2007cad多个文件窗口上部排列_【中