2020年2月15日 星期六

verilog二进制转BCD码(加三移位法)

verilog二进制转BCD码(加三移位法)


设计背景:
二进制转十进制在设计应用中十分的广泛。尤其在AD转化中是必须所用到的一个小知识点,学习二进制转十进制的方法显的非常的重要。今天就和笔者来学习二进制转十进制的方法,通过简单的学习来掌握这么一门知识。
设计原理:
本次的设计主要是一个简单的二选一数据选择器,我们的设计主
二进制中只有 0 和 1 两个状态,可以表示 0、1 两种状态的电 子器件很多,如开关的接通和断开,晶体管的导通和截止、磁元 件的正负剩磁、电位电平的低与高等都可表示 0、1 两个数码。使 用二进制,电子器件具有实现的可行性。
二进制数的运算法则少,运算简单,使计算机运算器的硬件结 构大大简化。由于二进制 0 和 1 正好和逻辑代数的假(false)和 真(true)相对应,有逻辑代数的理论基础,用二进制表示二值 逻辑很自然。电子器件中,所有的数据都是用二进制来表示的。
2. BCD 
BCD 码(Binary-Coded Decimal)亦称二进码十进数或二-十进制代码。用 4 位二进制数来表示 1 位十进制数中的 0~9  10 个 数码。BCD 码是一种二进制的数字编码形式,用二进制编码的十 进制代码。BCD 码这种编码形式利用了四个位元来储存一个十进 制的数码,使二进制和十进制之间的转换得以快捷的进行。
        3. 实现方法
           1)  10 求余法
         将需要换的字除然后对 10 求余得出数各个 位上的字。8b1000_0000(10 中的 128将此数 字对 10 余,“8“8”赋最低的 4 将 此数字(128) 10得出 12(在 FPGA 计算,自取整, 对 10 ,然得出位“2把“2”赋给低的 4 。将此 数字(128)除以 100,得出 1,对 10 余,然得出位“1, 把“1”赋给另外的 4 位。这样就转换出了 BCD 码。
        这类方法中,利用了大量的除法和求余,占用了大量的逻辑资 源。但是,实现比较简单,如果芯片的逻辑资源足够的话,可以 采取使用这种方法。
        2) 大四加三法
进行移位,然后进行判断。如果大于四,则加三。最后得出们想要的 BCD (下是按转换 7 讲解的
                
架构图如下
bin_data[7:0]:输入的二进制数据。
bin_data[11:0]:输出的BCD码(输入的二进制数据为8位,最大 8’b1111_1111(255),四位表示一个BCD故而12

//数码管显示四位数字  max=8191
module smg4(
        clk,rst_n,shuzi,      //input
        qian,bai,shi,ge       //output
);
input clk;
input rst_n;
input [12:0] shuzi;
output [6:0] qian,bai,shi,ge;

reg [3:0] q,b,s,g;

// 加三移位法 13位的二进制 只需要16位来存其十进制数字 一共29位 28:0
reg [3:0] count;
reg [28:0] temp;
//---------------- 计数部分 -----------------
always@(posedge clk or negedge rst_n )
begin
 if(!rst_n ) 
   count<=0;
 else if(count==14)
   begin
    count<=0;
    q<=temp[28:25];
    b<=temp[24:21];
    s<=temp[20:17];
    g<=temp[16:13];
   end
 else
   count<=count+1;
end
//------------------加三移位法---------------
always@(posedge clk,negedge rst_n)
begin
    if(!rst_n) temp=0;
    else if(count==4'b0) temp={16'b0,shuzi};
    else if(count<=13)
        begin
           if(temp[24:21]>4) temp[24:21]=temp[24:21]+3;
           if(temp[20:17]>4) temp[20:17]=temp[20:17]+3;
           if(temp[16:13]>4) temp[16:13]=temp[16:13]+3;
           temp=temp<<1;
        end
end
//------------------七段译码--------------------
assign qian=qiduan(q);
assign bai=qiduan(b);
assign shi=qiduan(s);
assign ge=qiduan(g);

function [6:0] qiduan;
input [3:0] s;
qiduan=(s==0)?7'b1000000:
       (s==1)?7'b1111001:
       (s==2)?7'b0100100:
   (s==3)?7'b0110000:
   (s==4)?7'b0011001:
   (s==5)?7'b0010010:
   (s==6)?7'b0000010:
   (s==7)?7'b1111000:
   (s==8)?7'b0000000:
   7'b0010000;
endfunction

endmodule 

沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...