0

構造モデリングを使用して 4 ビットの加算減算器を使用して 4 ビットのアップダウン カウンターを作成しようとしています。問題は、加算減算器の入力 (A) を合計と等しくなるように更新する必要があることです。これを修正しますが、シミュレーションで U が得られますが、a を等しい出力に設定することはできませんが、出力が A に等しいと書く必要がありました

また、シグナル s が 0 になるという警告が表示されます。アップ ダウン カウントを行うため、0 と 1 を変更する必要がありますが、テスト ベンチで値を設定しようとするとエラーが発生します。

私はこれを理解することができません、どんな助けも大歓迎です

シミュレーション エラー : ERROR:Xst:528 - ユニットのマルチ ソース オン シグナル >; この信号は複数のドライバーに接続されています。ERROR:Xst:528 - ユニットのマルチソース オン シグナル >; この信号は複数のドライバーに接続されています。ERROR:Xst:528 - ユニットのマルチソース オン シグナル >; この信号は複数のドライバーに接続されています。ERROR:Xst:528 - ユニットのマルチソース オン シグナル >; この信号は複数のドライブに接続されています

シミュレーションの警告: 入力は使用されません。このポートが最上位ブロックに属している場合、またはサブブロックに属しており、このサブブロックの階層が保持されている場合、このポートは保持され、未接続のままになります。WARNING:Xst:653 - シグナルは使用されていますが、割り当てられていません。このソースレス信号は自動的に値 0 に接続されます。

This is the counter code 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity upDown is
    Port ( a: in STD_LOGIC_VECTOR(3 downto 0 );
             b : in STD_LOGIC_VECTOR(3 downto 0 );
            clk,reset,enable : in  STD_LOGIC  ;
           o : out STD_LOGIC_VECTOR(3 downto 0 )
            );
end upDown;

architecture Behavioral of upDown is

component addersub4bits is 
 Port ( a,b : in  STD_LOGIC_VECTOR (3 downto 0);
        y : out  STD_LOGIC_VECTOR (3 downto 0);
        s : in  STD_LOGIC  );
 end component ;

 signal s : STD_LOGIC ;
-- signal tmp2 : STD_LOGIC_VECTOR(3 downto 0) ;
signal outputsignal: STD_LOGIC_VECTOR(3 downto 0) ; --inside process

begin

ad : addersub4bits  port map( a,"0001" ,outputsignal ,s) ;

process (clk,reset,enable) 

begin

if(reset= '1' ) 
then outputsignal <= "0000"; 

elsif(clk' event and clk='1' ) then 
if(enable ='1' ) then 
outputsignal<=a ;

else

outputsignal<=outputsignal ;   --zay mahowa 
end if ;
end if ;
end process ;
--o <= tmp ;
o <=outputsignal ;

end Behavioral ;

加算減算器

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity addersub4bits is
Port ( a,b : in  STD_LOGIC_VECTOR (3 downto 0);
y : out  STD_LOGIC_VECTOR (3 downto 0);
s : in  STD_LOGIC);

end addersub4bits;

architecture dataflow of addersub4bits is


begin

 Process(a,b,s) 
 begin
if (s='1') then 

y<= (a + b) ;

else
y<=(a-b) ;

end if ; 

end process ;


end dataflow;

テストベンチ

-------------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;

ENTITY uD_testbench IS
END uD_testbench;

ARCHITECTURE behavior OF uD_testbench IS 

    -- Component Declaration for the Unit Under Test (UUT)

    COMPONENT upDown
    PORT(
         a : IN  std_logic_vector(3 downto 0);
         b : IN  std_logic_vector(3 downto 0);
         clk : IN  std_logic;
         reset : IN  std_logic;
         enable : IN  std_logic;
         o : OUT  std_logic_vector(3 downto 0)
        );
    END COMPONENT;


   --Inputs
   signal a : std_logic_vector(3 downto 0) := (others => '0');
   signal b : std_logic_vector(3 downto 0) := (others => '0');
   signal clk : std_logic := '0';
   signal reset : std_logic := '0';
   signal enable : std_logic := '0';

    --Outputs
   signal o : std_logic_vector(3 downto 0);

   -- Clock period definitions
   constant clk_period : time := 10 ns;

BEGIN

    -- Instantiate the Unit Under Test (UUT)
   uut: upDown PORT MAP (
          a => a,
          b => b,
          clk => clk,
          reset => reset,
          enable => enable,
          o => o
        );

   -- Clock process definitions
   clk_process :process
   begin
        clk <= '0';
        wait for 100 ns ;
        clk <= '1';
        wait for 100 ns ;
   end process;


   -- Stimulus process
   stim_proc: process
   begin        
      reset <= '1' ;enable <= '0' ; wait for 150 ns ;
        reset <= '0'; wait for 300 ns ;

        --enable <= '0' ; wait for 200 ns ;
        enable <='1' ;wait ;
   end process;

END;
4

1 に答える 1

0

加算器の出力は信号outputsignalを駆動しますが、レジスタも同じ信号を駆動します。それらの1つを変更すると役立つはずです。たとえば、加算器出力をレジスタ入力に供給するように変更し、レジスタ出力を加算器入力に供給するように変更します。

ad : addersub4bits port map( a=>outputsignal,b=>"0001" , y=>a ,s=>s) ;

upDownの出力としてレジスタ出力outputsignal (適切なコーディング スタイル) を使用するか、加算器出力aを使用するかを選択できるようになりました。

オプションのヒント 1: std_logic の代わりに未解決の型 std_ulogic を使用する場合、vhdl コンパイラは、複数のソースによって駆動される未解決の信号について警告する必要があります。そのため、シミュレーションを開始する前であっても、この種の問題をより迅速に見つけることができます。欠点は、VHDL 標準に IEEE.STD_U LOGIC_UNSIGNED パッケージないことです。

オプションのヒント 2: 既知の問題がある ieee.std_logic_arith の代わりに、パッケージ ieee.numeric_std を使用することをお勧めします。

両方のヒントをまとめて add/sub を次のように書くことができます:

if s='1' then 
  y<= std_ulogic_vector( unsigned(a) + unsigned(b));
else
  y<= std_ulogic_vector( unsigned(a) - unsigned(b));
end if;
于 2013-04-07T09:57:41.020 に答える