1

私はプロジェクトの終わりに近づいていますが、ある時点で立ち往生しています。問題を解決できません

VHDL が配列のインデックスをシフトするのに苦労していると判断した後、シフター モジュールを変更することにしました。現在は適切にコンパイルされており、RTL 回路図は正しいように見えますが、残念ながら、スキャンコードをシフトするために革新的ではない方法を使用しました。

最大 8 つのスキャンコードを保持できる 64 ビットの std_logic_vector を定義し、このベクターの最上位 4 バイトを解析して、入力を多重化し、どの 7 セグメントを有効にするかを決定する 7 セグメント コントローラーに送りました。時計に問題があると思っているのですが、ディスプレイに何も表示されないのは、デバイスの一部が故障していると思われます。個々に試してみたので、キーボード コントローラーは正常に動作していると確信しています (これも FPGA で試しましたが、クロックを遅くすることはありませんでしたが、最後に入力したスキャンコードを確認できました)。 7セグメントコントローラーを試す方法/方法は考えていませんが、それも問題ないようです。何が問題なのかわかりません。テキストがスクロールしていません:(

トップモジュール

シフター.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.numeric_std.all;

entity my_shifter is
        port(clk      : in  std_logic;
                Scan_Dav : in  std_logic;
                Data_in  : in  std_logic_vector (7 downto 0);
                O1 : out std_logic_vector(7 downto 0);
                O2 : out std_logic_vector(7 downto 0);
                O3 : out std_logic_vector(7 downto 0);
                O4 : out std_logic_vector(7 downto 0)
                );
end my_shifter;

architecture bhv of my_shifter is

signal bytes : std_logic_vector(63 downto 0);
begin
    process (clk) begin
        if rising_edge(clk) then
                if Scan_Dav = '1' then
                    bytes <= bytes (bytes'high-8 downto 0) & Data_in;
                end if;
          end if;
    end process;
     O1 <= bytes(63 downto 56);
     O2 <= bytes(55 downto 48);
     O3 <= bytes(47 downto 40);
     O4 <= bytes(39 downto 32);
end bhv;

clkdivide.vhd

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

entity clkdivide is
    Port (clkin: in std_logic;
            clkout:out std_logic );
end clkdivide;

architecture Behavioral of clkdivide is
    signal int_clock:std_logic;
    begin
        clkout<=int_clock;
    process(clkin)
        variable var:integer range 0 to 12500 :=0;
        begin
            if (clkin'event and clkin = '1') then
                if var = 12500 then
                    int_clock <= not int_clock; 
                    var:=0;
                else 
                    var:=var+1;
                end if;
            end if;
    end process;
end Behavioral;

SevenSegmentControl.vhd:

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

entity SevenSegmentController is
    port (
        CLK: in std_logic;
        DEC1, DEC2, DEC3, DEC4: in std_logic_vector(7 downto 0);
        SEGMENTS: out std_logic_vector(6 downto 0);
        ANODES: out std_logic_vector(3 downto 0)
    );
end SevenSegmentController;

architecture Behavioral of SevenSegmentController is
   signal DecoderInput: std_logic_vector(7 downto 0);
    signal CurrentDisplay: std_logic_vector(1 downto 0) := "00";
    signal Prescaler: std_logic_vector(15 downto 0) := (others => '0');
begin

    Multiplex: process(CLK)
    begin
        if rising_edge(CLK) then
            if Prescaler(15) = '0' then
                Prescaler <= Prescaler + 1;
            else
                CurrentDisplay <= CurrentDisplay + 1;
                Prescaler <= (others => '0');
            end if;
        end if;
    end process Multiplex;

    SevenSegmentDecoder: entity work.SevenSegment_Decoder(Behavioral)
        generic map ( INVERT_OUTPUT => '1' )
        port map ( number => DecoderInput, segment => SEGMENTS );   

    DecoderInput <= DEC1 when CurrentDisplay = "00" else
                        DEC2 when CurrentDisplay = "01" else
                         DEC3 when CurrentDisplay = "10" else
                         DEC4 when CurrentDisplay = "11";

   ANODES <= "0111" when CurrentDisplay = "00" else
                 "1011" when CurrentDisplay = "01" else
                 "1101" when CurrentDisplay = "10" else
                 "1110" when CurrentDisplay = "11";              

end Behavioral;
4

2 に答える 2

0

のインターフェイスプロトコルについてSevenSegment_Decoderはわかりませんが、入力が2つしかないのに、クロックがないのはおかしいようです。デコーダーは信号をいつ解釈するかをどのように知るのですか?

于 2012-12-13T10:53:58.550 に答える
0

「7セグメントコントローラを試す方法や方法は考えていません」

非常に古いバージョンのISEを使用していない限り、確かにISE10よりも古いものですが、かなりまともなシミュレーター(ISIM)が組み込まれています(ISIMはISE10よりもさらに遡りますが、実際には使用できず、ISIM10でも問題がありました。 ...)

簡単なテストベンチを作成し、これらのモジュールを単体テストしていくと、多くの時間を節約できます。

于 2012-12-13T13:39:52.850 に答える