0

ザイリンクスのCoreGenを使用して署名付きアキュムレータを実装しようとしています。私の理解によれば、アキュムレータは入力を出力にルーティングするだけの通常のレジスタの機能を実行しますが、それについて明確にしたかったのです。

プロジェクトにアキュムレータIPcore(.xco)モジュールを追加しました。基本的に、コンポーネント宣言とポートマップを含むメインファイルがあります。私にもシングルステップのプロセスがあります。すべてがコンパイルされ、ボード上で結果を確認できますが、何が起こっているのかよくわかりません...

1000LEDの8ビット出力を入力すると11111000。の別の入力は私に1111与えます11110111。と呼ばれるメインのvhdファイルとファイルのコードをここに添付してAccm.vhoます。

----------------------------------------------------------------------------------

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

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity Accm is
port( b: in std_logic_vector(3 downto 0);
        sclr, clk, b1, b2 : in std_logic;
        q : out std_logic_vector(7 downto 0)
);      

end Accm;

architecture Behavioral of Accm is

-- signal declaration
type tell is (rdy,pulse,not_rdy);
signal d_n_s: tell; 
signal en: std_logic;

-- component declaration
COMPONENT my_accm
  PORT (
    b : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    clk : IN STD_LOGIC;
    sclr : IN STD_LOGIC;
    q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
  );
END COMPONENT;

-- port map
begin

A1 : my_accm
  PORT MAP (
    b => b,
    clk => en,
    sclr => sclr,
    q => q
  );

process(clk)
begin
if clk'event and clk='1' then
case d_n_s is
when rdy => en <= '0';
if b1='1' then d_n_s <= pulse; end if;
when pulse => en <= '1';
d_n_s <= not_rdy;
when not_rdy => en <='0';
if b2='1' then d_n_s <= rdy; end if;
end case;
end if;
end process;

-- .VHO CODE

------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
COMPONENT my_accm
  PORT (
    b : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    clk : IN STD_LOGIC;
    sclr : IN STD_LOGIC;
    q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
  );
END COMPONENT;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------

-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.

------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : my_accm
  PORT MAP (
    b => b,
    clk => clk,
    sclr => sclr,
    q => q
  );

end Behavioral;

CoreGenで生成したアキュムレータの画像も貼り付けています。ここに画像の説明を入力してください

誰かがこのプログラムで何が起こっているのか説明してくれたら幸いです。ありがとう!

4

2 に答える 2

3

「アキュムレータ」は多くのことを意味します。ハードウェアザイリンクスライブラリでは、インスタンス化したコンポーネントはレジスタの前にある加算器です。加算器は、アキュムレータレジスタの現在の値を入力項に加算しています。アキュムレータレジスタは入力よりも幅が広いため、出力をオーバーフローさせることなく、多くの入力項を累積(加算)できます。

回路が起動すると、アキュムレータにはゼロが含まれます。1000(-8)を入力します。これをゼロに加算すると、出力で11111000(-8符号拡張)になります。次に、1111(-1)を追加すると、出力は11110111(-9符号拡張)になります。

「アキュムレータ」が完了したら、SCLRをアサートして、アキュムレータレジスタをゼロに戻します(または、ロジックに応じてSSETまたはSINITを使用します)。

これはすべて、ザイリンクスライブラリのドキュメントでカバーされている必要があります(corgenダイアログの[データシート]ボタンをクリックしてみてください)。

于 2011-12-03T21:08:58.483 に答える
0

実は今はわかったと思います。Adder署名された入力を持つように動作します。私はこれについて正しいと思いますが、何か説明をいただければ幸いです。

于 2011-12-03T20:04:56.937 に答える