⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bintobcd.vhd

📁 可以很好实现一个二进制转换成BCD码的程序
💻 VHD
字号:
----串行输入(高位在前)的二进制数转换成十进制(BCD码),在n个时钟脉冲下转化n个二这十进制数
----这是二进制数转化成十进制(BCD码)的模块,可以级连使用,转化更多的二进制数
----!!!!必须修改程序中的m_value得到相应的m_value个二进制数转化成BCD码。如16位二进制数转换成BCD码,则m_value需赋值16
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--use ieee.std_logic_arith.all;

entity bintobcd is
  generic (m_value : integer :=16                 --binary bits to change to BCD code 
          );
 port(clk :in std_logic;  --clock input
      binin :in std_logic;  --二进制数串行输入
      clr :in std_logic;
      --f:out std_logic; 
      bcdout_h:out std_logic;--串行输出BCD码 级连之用 
      bcdout :out std_logic_vector(3 downto 0) --bcd码输出
     );
end  bintobcd;

architecture behave of bintobcd is

component add4b
 port(a :in std_logic_vector(3 downto 0);
      b :in std_logic_vector(3 downto 0);
      cin :in std_logic; --carry in flag;
      sum :out std_logic_vector(3 downto 0)   
     -- cout:out std_logic --carry out flag
     );
 end component;

signal f : std_logic;             ---f和ps,t等价,若t=1,则进行修正补偿后移位,否则,直接串行移位 
signal a_tmp :std_logic;          ---判断是否需要修正的中间寄存量 
signal b_tmp :std_logic;          ---判断是否需要修正的中间寄存量 
signal ps :std_logic;             ---f和ps,t等价,若ps=1,则进行修正补偿后移位,否则,直接串行移位  
signal t :std_logic;              ---f和ps,t等价,若t=1,则进行修正补偿后移位,否则,直接串行移位   
signal ccin :std_logic;           --未用到
signal p :std_logic_vector(3 downto 0); --加法器的输出,若不需要修正补偿,则p和q相等。
                                        -- 需修正补偿则先把修正的结果即加法器的输出p送给q,再移位
signal q :std_logic_vector(3 downto 0);  
signal cob :std_logic_vector(3 downto 0); --加发器的加数之一,用来修正。需要修正他t=1即cob=0011。否则,t=0 ,cob=0000
signal m : integer range 0 to 50;         --m为全部二进制数都转换成BCD码后在输出 
begin
a_tmp<=not(q(3) or q(2));
b_tmp<=not(q(3) or q(1) or q(0));
t<=not(a_tmp or b_tmp);
f<=t;
ps<=t;
cob(0)<=t;
cob(1)<=t;
cob(2)<='0';
cob(3)<='0';
ccin<='0';
count : block
begin
  u1 : add4b port map(a=>q,b=>cob,cin=>ccin,sum=>p(3 downto 0)); 
end block count;
 
shiftreg : block
begin
 process(clk)
 --variable m :integer range 0 to 50;
 begin 
 if clr='1' then q<="0000";
 else 
   if (clk'event and clk='1') then
    if ps='0' then                      --不需要修正,所以加数之一cob=0000,pq等价,进行串行移位
      q(0)<=binin;
      for i in 1 to 3 loop
       q(i)<=q(i-1);
      end loop;
    elsif ps='1' then                   --需要修正,所以加数之一cob=0011,pq不等价,P先赋给q,q进行串行移位
      q(0)<=binin;
      for i in 1 to 3 loop
         q(i)<=p(i-1);
      end loop;
    end if;  
    m<=m+1;
    if(m=m_value) then                        
       bcdout<=q;
       q<="0000";                      --q清零,重新开始转换,以防止影响输出显示
       m<=0;
    end if;    
   end if;
 end if;    
end process;
end block shiftreg;     
bcdout_h<=p(3);          
end behave;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -