0

バイトで構成される配列のインデックスをシフトするシフター モジュールに問題があります。

シフター.vhd:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use work.mypackage2.all; -- contains the type reg array

entity shifter is
    generic ( REGSIZE  : integer := 8);
    port(clk      : in  std_logic;
            Scan_Dav : in  std_logic;
            Data_in  : in  std_logic_vector(7 downto 0);
            Data_out : out reg_array );
end shifter;

architecture bhv of shifter is

    signal shift_reg : reg_array;
begin
    process (clk) begin
        if rising_edge(clk) then
                if Scan_Dav = '1' then
                    shift_reg <= shift_reg(shift_reg'high-1 downto 0) & Data_in;
                end if;
          end if;
    end process;
     Data_out <= shift_reg;
end bhv;

これはキーボードからのスキャンコードを保持するシフターで、出力配列は 7 セグメント ディスプレイのテキストをスクロールするために使用されます。私のパッケージには、shifter の出力を定義するために使用される型宣言が含まれています。

mypackage2.vhd:

--  Package File Template
--
--  Purpose: This package defines supplemental types, subtypes, 
--       constants, and functions 


library IEEE;
use IEEE.STD_LOGIC_1164.all;

package mypackage2 is

   subtype reg is std_logic_vector(7 downto 0); -- a byte
    type reg_array is array (7 downto 0) of reg; -- array of bytes

end mypackage2;


package body mypackage2 is

end mypackage2;

私はそれで問題を抱えています。このコードの RTL 回路図は次のようになります。

シフターの RTL:

なぜこれが起こるのか混乱しています。この問題について誰か助けてもらえますか?

4

1 に答える 1

0

あなたの「my_shifter」は問題ないようです-それ自体。ザイリンクス ツールはそれを正常にコンパイルし、RTL ビューアーはそれを正常に表示し、ページ内のカスタム信号などすべてを表示します。

ただし、7 セグメント コントローラーを使用してトップ レベル デザインに「my_shifter」を埋め込むと、困惑した「エラー」の症状を再現することができました。トップ レベル ダイアグラムの RTL ビューには表示されません。

「合成レポート」の警告に注意を払うと、他の信号が接続されていないことがわかり、合成ツールがシフター全体を最適化できるようになりました。サマリーで生成されたフリップフロップの数を見て確認

これらの欠落した接続を修正し、RTL ビューですべてのポートが適切に接続されたシフターが表示されることを確認します。

したがって、RTL ビューアには (この点で!) バグがある可能性があるという私の提案は撤回しますが、基本的な設計上の問題を解決するには非常に貧弱な方法であるという私の提案を強化します。

そのためのシミュレーションです。

そうでなければ、あなたは必要以上に一生懸命働いて、どこに問題があるのか​​誤解されていることになります。

于 2012-12-13T18:11:39.527 に答える