这个用于bcd的vhdl代码有什么问题?

时间:2017-11-02 17:33:55

标签: vhdl addition bcd

以下代码用于bcd添加两个数字。每当我输入一些值时,最重要的4位输出都是不正确的(X)。我不知道我错在哪里。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity bcd_adder1 is
    port(a,b : in  unsigned(3 downto 0);
         c_in : in std_logic;
         sum  : out  unsigned(3 downto 0); 
         c_out : out std_logic);
end bcd_adder1;

architecture func of bcd_adder1 is
begin
process(a,b)
variable sum_temp : unsigned(4 downto 0);
begin
    sum_temp := ('0' & a) + ('0' & b) + ("0000" & c_in); 
    if(sum_temp > 9) then
        c_out <= '1';
        sum <= resize((sum_temp + "00110"),4);
    else
        c_out <= '0';
        sum <= sum_temp(3 downto 0);
    end if;  
end process;   
end architecture;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity final_adder is
    port(a_final1,a_final2,b_final1,b_final2 : in  unsigned(3 downto 0);
         c_in_final : in std_logic;
         sum_final1,sum_final2  : out  unsigned(3 downto 0); 
         c_out_final : inout std_logic);
end final_adder;
architecture final of final_adder is
component bcd_adder1
    port(a,b : in  unsigned(3 downto 0);
         c_in : in std_logic;
         sum  : out  unsigned(3 downto 0); 
         c_out : out std_logic);
end component;
begin
z0:bcd_adder1 port map(a_final1,b_final1,c_in_final,sum_final1,c_out_final);
z1:bcd_adder1 port map(a_final2,b_final2,c_out_final,sum_final2,c_out_final);
end final;

请帮忙!

1 个答案:

答案 0 :(得分:0)

缺少Minimal, Complete and Verifiable example您的代码需要合适的样式(空白)应用以提高可读性。

你是用菊花链接两个加法器(一个是c_out到另一个的c_in)。

c_out_final有多达三个驱动程序,z0,z1和testbench实际的两个c_out - 端口c_out_final模式是inout。

c_out_final的值是所有在c_out_final处有两个或更多驱动程序的驱动程序的解析值,可能会产生'X'。

'x'将通过z1中的加法“毒化”你的sum_final2。

向final_adder添加信号。请勿对inout使用模式c_out_final使用模式out

如果没有包含测试平台的最小,完整和可验证的示例,您的读者无法保证不再存在问题。

这个答案确实解决了

  

每当我输入一些值时,最重要的4位输出都是不正确的(X)`...

假设您在z1端口sumfinal_adder端口上表示“XXXX” sum_final2,或意味着c_out_final上的值。

corrections.png