VHDL编码:10位十进制转换为BCD是否可能?

时间:2017-08-23 01:28:16

标签: decimal vhdl xilinx-ise bcd

美好的一天,

我的最新作业是将10位十进制(因为10位的最大十进制数为1023)转换为16位BCD。当输入十进制大于或等于1024时,误差波形将变高。当然整个模块都连接到一个时钟。我不知道如何在VHDL编码中实现这一点,但我对如何使其工作有一些建议的想法:

  • 首先,我可以实现使用TWO MODULES,其中第一个块的输出将以相同的时钟连接到第二个块。第一个块的输出是输入的二进制,当十进制输入大于1023时,误差等于1。

Here's the photo of the two module

  • 第二种方法是使用单模块技术,其中输入小数直接转换为16位BCD,如果输入小数大于1023,则误差为1。

Here's the photo of one module

任何人都可以帮我解决如何使用VHDL将十进制编码转换为bcd转换的问题。非常感谢一点帮助。谢谢

2 个答案:

答案 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;

代码也是可合成的。