FC2カウンター FPGAの部屋 キャラクタ・ディスプレイ・コントローラのシミュレーション(VHDL)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

キャラクタ・ディスプレイ・コントローラのシミュレーション(VHDL)

キャラクタ・ディスプレイ・コントローラのシミュレーションのVHDL版だ。回路の構造としてはPS/2キーボード・インターフェースとキャラクタ・ディスプレイ・コントローラをつないで、キーボードで1文字打ったら、その文字が直接ディスプレイに表示できるようになっている。本体の回路は、実験の課題となっているので、公開はできないが、テストベンチだけ公開しようと思う。
キーボード入力は”PS/2キーボードインターフェース用テストベンチ(procedure使用)”で使った procedure を使っている。これで入力したPS2のコードをアスキーコードに変換し、さらに、キーを離したときの2つのコードを取り除く。そのアスキーコードをキャラクタ・ディスプレイ・コントローラに入力してディスプレイに表示する。
シミュレーションでは、Verilogと同様に'*' キャラクタでアスキー文字を書くことによって回路が動作するかどうかを見ている。VerilogはVHDLのテストベンチをVerilogに変換したものだ。
VHDLでは report で '*' キャラクタを書いているが、書いたら改行されて、書いた時刻も表示されてしまうため、すべての文字を string にためてから表示している。

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

library work;
use work.PS2_SigGen_pack.all;

entity keyboard_chard_25MHz_tb is
end keyboard_chard_25MHz_tb;

architecture test_bench of keyboard_chard_25MHz_tb is

constant H_FRONT_PORCH : integer := 24; -- 水平フロントポーチ(表示範囲を広げた)
constant V_FRONT_PORCH : integer := 26; -- 垂直フロントポーチ(表示範囲を広げた)
constant CYCLE : time := 40 ns; -- 25MHz

signal clk : std_logic := '1';
signal reset : std_logic := '1';
signal ps2clk : std_logic := '1';
signal ps2data : std_logic := '1';
signal VGA_RED : std_logic;
signal VGA_GREEN : std_logic;
signal VGA_BLUE : std_logic;
signal VGA_HSYNC : std_logic;
signal VGA_VSYNC : std_logic;
signal line_str : string(1 to 3880); -- 97列*8行*5

component Keyboard_CharDisp_25MHz
    port(
        clk : in std_logic;
        reset : in std_logic;
        ps2clk : in std_logic;
        ps2data : in std_logic;
        VGA_RED : out std_logic;
        VGA_GREEN : out std_logic;
        VGA_BLUE : out std_logic;
        VGA_HSYNC : out std_logic;
        VGA_VSYNC : out std_logic
    );
end component;
begin
    Inst_Keyboard_CharDisp_25MHz : Keyboard_CharDisp_25MHz port map(
        clk => clk,
        reset => reset,
        ps2clk => ps2clk,
        ps2data => ps2data,
        VGA_RED => VGA_RED,
        VGA_GREEN => VGA_GREEN,
        VGA_BLUE => VGA_BLUE,
        VGA_HSYNC => VGA_HSYNC,
        VGA_VSYNC => VGA_VSYNC
    );
    
    clk <= not clk after CYCLE/2;

    process begin -- PS/2キーボード入力
        wait for 80 ns; -- 1クロック分リセット
        
        reset <= '0'; -- リセット解除
        
        PS2_SigGen(x"1C", ps2clk, ps2data); -- 'A'
        PS2_SigGen(x"F0", ps2clk, ps2data);
        PS2_SigGen(x"1C", ps2clk, ps2data);
        PS2_SigGen(x"32", ps2clk, ps2data); -- 'B'
        PS2_SigGen(x"F0", ps2clk, ps2data);
        PS2_SigGen(x"32", ps2clk, ps2data);
        PS2_SigGen(x"21", ps2clk, ps2data); -- 'C'
        PS2_SigGen(x"F0", ps2clk, ps2data);
        PS2_SigGen(x"21", ps2clk, ps2data);
    end process;
    
    process begin -- 8キャラクタ分表示
        wait for 80 ns; -- 1クロック分リセット
        wait until VGA_VSYNC'event and VGA_VSYNC='1'; -- VGA_VSYNCの立ち上がりまでwait
        
        for i in 0 to V_FRONT_PORCH-1 loop -- 垂直のフロントポーチ分だけwait
            wait until VGA_HSYNC'event and VGA_HSYNC='1'; -- VGA_HSYNCの立ち上がりまでwait
        end loop;
        
        for i in 0 to H_FRONT_PORCH-1 loop -- 水平のフロントポート分だけwait
            wait until clk'event and clk='1';
        end loop;
        
        for i in 0 to 39 loop -- 8行*5表示
            for j in 1 to 96 loop
                wait for 1 ns;
                
                if VGA_RED='1' or VGA_GREEN='1' or VGA_BLUE='1' then -- いずれの色が1だったら
                    line_str(i*97+j) <= '*';
                else
                    line_str(i*97+j) <= ' ';
                end if;
                wait until clk'event and clk='1'; -- 次のクロックへ
            end loop;
            line_str(i*97+97) <= CR;
            
            wait until VGA_HSYNC'event and VGA_HSYNC='1'; -- VGA_HSYNCの立ち上がりまでwait
            for i in 0 to H_FRONT_PORCH-1 loop -- 水平のフロントポート分だけwait
                wait until clk'event and clk='1';
            end loop;
        
        end loop;
        report line_str severity Note; -- 表示
    end process;
end test_bench;


確認はModelSimでしているが、どのようにやるかはまた後で。。。Verilog版でやろうと思う。

2007/10/19 : このテストベンチでModelSimでシミュレーションすると、このように表示されます。ModelSimも等幅フォントに指定しています。
PS2_VGA_Sim_071019.png

  1. 2007年10月18日 19:14 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/626-1ef30475
この記事にトラックバックする(FC2ブログユーザー)