美好的一天,
我的最新作业是将10位十进制(因为10位的最大十进制数为1023)转换为16位BCD。当输入十进制大于或等于1024时,误差波形将变高。当然整个模块都连接到一个时钟。我不知道如何在VHDL编码中实现这一点,但我对如何使其工作有一些建议的想法:
任何人都可以帮我解决如何使用VHDL将十进制编码转换为bcd转换的问题。非常感谢一点帮助。谢谢
答案 0 :(得分:-1)
好吧,我的同学弄清楚如何使用MOD函数对此进行编码的问题。这是代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity dec_to_bcd is
Port ( Ina : in STD_LOGIC_VECTOR (9 downto 0);
clk : in STD_LOGIC;
Outa : out STD_LOGIC_VECTOR (15 downto 0);
err : out STD_LOGIC);
end dec_to_bcd;
architecture Behavioral of dec_to_bcd is
begin
process (clk)
begin
if clk='1' and clk'event then
if (conv_integer(Ina) >= 1024) then
err <= '1';
else
Outa(15 downto 12) <= conv_std_logic_vector((conv_integer(Ina) / 1000),4);
Outa(11 downto 8) <= conv_std_logic_vector((conv_integer(Ina) / 100)MOD 10,4);
Outa(7 downto 4) <= conv_std_logic_vector((conv_integer(Ina) / 10)MOD 10,4);
Outa(3 downto 0) <= conv_std_logic_vector((conv_integer(Ina))MOD 10,4);
end if;
end if;
end process;
end Behavioral;
由于我们在课堂上引入VHDL仅使用模拟,因此我们不知道它是否可以合成&#34;。欢迎任何有关如何改进此代码的建议。谢谢:))
答案 1 :(得分:-1)
您可以使用Double dabble algorithm来实现此目的。 我在我的博客中写了一个vhdl function,它基本上将8位二进制转换为12位BCD。您也可以对10位二进制数使用相同的概念。
function to_bcd ( bin : std_logic_vector(7 downto 0) ) return std_logic_vector is
variable i : integer:=0;
variable bcd : std_logic_vector(11 downto 0) := (others => '0');
variable bint : std_logic_vector(7 downto 0) := bin;
begin
for i in 0 to 7 loop -- repeating 8 times.
bcd(11 downto 1) := bcd(10 downto 0); --shifting the bits.
bcd(0) := bint(7);
bint(7 downto 1) := bint(6 downto 0);
bint(0) :='0';
if(i < 7 and bcd(3 downto 0) > "0100") then --add 3 if BCD digit is greater than 4.
bcd(3 downto 0) := bcd(3 downto 0) + "0011";
end if;
if(i < 7 and bcd(7 downto 4) > "0100") then --add 3 if BCD digit is greater than 4.
bcd(7 downto 4) := bcd(7 downto 4) + "0011";
end if;
if(i < 7 and bcd(11 downto 8) > "0100") then --add 3 if BCD digit is greater than 4.
bcd(11 downto 8) := bcd(11 downto 8) + "0011";
end if;
end loop;
return bcd;
end to_bcd;
代码也是可合成的。