2017-11-02 10 views
0

次のコードは、2つの数値をbcdで加算するためのコードです。いくつかの値を入力するたびに、最も重要な4ビットの出力が不正確(X)になります。私はこれでどこが間違っているのか分かりません。このvhdlコードでbcdを追加すると何が問題になりますか?

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; 

助けてください!

+0

あなたはこの中で間違っているところ、見つけるテストベンチを書いて、それをシミュレートします。 –

+0

'std_ulogic_vector'と' u_unsigned'(別名 'unresolved_unsigned')型を使用すると、これらの解決された型の代わりに、このシミュレーションの振る舞いはありません。複数のドライバのため、コンパイル時にすでにエラーが発生します。 – JHBonarius

答えて

0

コードがありませんMinimal, Complete and Verifiable exampleコードでは、読みやすいようにスタイル(空白)を適切に適用する必要があります。

あなたは、2つの加算器をキャリーでデイジーチェーン接続しています(一方のc_outをもう一方のc_inにデイジーチェーン接続しています)。

c_out_finalには3つのドライバがあり、z0、z1の2つのc_out、testbenchの実際のポート番号はc_out_finalです。モードはinoutです。

c_out_finalの値は、c_out_finalの2つ以上のドライバを持つすべてのドライバの解決された値で、 'X'が返されます。

「X」は、z1の加算によってsum_final2を「毒」します。

final_adderに信号を追加します。 c_out_final使用モードoutにモードinoutを使用しないでください。

テストベンチを含めた最小限の完全かつ検証可能な例がないと、読者はそれ以上問題がないことを保証できません。あなたが意味するものと仮定し

I入力いくつかの値、上位4ビットの出力は正しくないと出てくるたびに、この答えは `...

(X)

に対処しない」をz1ポートsumまたはfinal_adderポート sum_final2のXXXXのいずれか、またはc_out_finalの値を意味します。

corrections.png

関連する問題