📄 bintobcd.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 + -