· 

SPIハードをFPGAで(3)

つづきです。

ModelSimを使うようにQuartusに設定します。

こうします。

QuartusでTools-->Run Simulation Tool-->RTL Simulationと選ぶと、

ModelSimが立ち上がる。

File-->New-->Source-->VHDL

で、テストベンチをつくる。

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;

ENTITY TB IS
END TB;

ARCHITECTURE SIM OF TB IS
    component FPGA IS
        PORT (
            NSEND : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
            NCLKDIV : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
            BUSY : OUT STD_LOGIC;
            INIT : IN STD_LOGIC;
            WDATA : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
            RDATA : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
            EN : IN STD_LOGIC;
            SCK : OUT STD_LOGIC;
            MOSI : OUT STD_LOGIC;
            MISO : IN STD_LOGIC;
            clk48 : IN STD_LOGIC
        );
    end component FPGA;

    SIGNAL NSEND : STD_LOGIC_VECTOR(2 DOWNTO 0);
    SIGNAL NCLKDIV : STD_LOGIC_VECTOR(2 DOWNTO 0);
    signal BUSY : std_logic;
    signal INIT : std_logic;
    signal WDATA : std_logic_vector(7 downto 0);
    signal RDATA : std_logic_vector(7 downto 0);
    signal EN : std_logic;
    signal SCK : std_logic;
    signal MOSI : std_logic;
    signal MISO : std_logic;
    signal CLK48 : std_logic;

    CONSTANT STEP48 : TIME := 20.83 ns;
BEGIN
    FPGA_inst : COMPONENT FPGA PORT MAP(
        NSEND=>NSEND,
        NCLKDIV=>NCLKDIV,
        BUSY=>BUSY,
        INIT=>INIT,
        WDATA=>WDATA,
        RDATA=>RDATA,
        EN=>EN,
        SCK=>SCK,
        MOSI=>MOSI,
        MISO=>MISO,
        clk48=>CLK48
    );
    MISO<=MOSI;
    PROCESS BEGIN
        CLK48 <= '1';
        WAIT FOR STEP48/2;
        CLK48 <= '0';
        WAIT FOR STEP48/2;
    END PROCESS;
    PROCESS BEGIN
        wait for STEP48*128;
        NSEND<="111";
        NCLKDIV<="001";
        WDATA<="01111010";
        EN<='1';
        INIT<='1';
        wait for 20 ns;
        INIT<='0';
        wait for 20 ns;
        INIT<='1';
        wait for 25 us;

        EN<='0';
        wait for 1 us;
        NSEND<="010";
        NCLKDIV<="000";
        WDATA<="01011111";
        EN<='1';
        INIT<='1';
        wait for 20 ns;
        INIT<='0';
        wait for 20 ns;
        INIT<='1';
        wait for 15 us;

        EN<='0';
        wait for 1 us;
        NSEND<="111";
        NCLKDIV<="000";
        WDATA<="01011010";
        EN<='1';
        INIT<='1';
        wait for 20 ns;
        INIT<='0';
        wait for 20 ns;
        INIT<='1';
        wait for 20 us;
        EN<='0';
        wait for 1 us;

        assert (false) report "Simulation End!" severity failure;
    END PROCESS;

END;

まぁ、こんなもんで。

入力したので、名前を付けて保存。

たいへん安易な名前で保存。

doファイルが勝手にできているので開く。

doファイルがあるので、開く。

こんな感じで、もともとのプロジェクトについて論理合成するようにできている。

transcript on

if {[file exists rtl_work]} {

vdel -lib rtl_work -all

}

vlib rtl_work

vmap work rtl_work

 

vlog -vlog01compat -work work +incdir+C:/Users/<ユーザ名>/Documents/Quartus/work_Prime18.1/niosii_swd_study5_logicsim/FPGA/db {C:/Users/<ユーザ名>/Documents/Quartus/work_Prime18.1/niosii_swd_study5_logicsim/FPGA/db/pll_altpll.v}

vcom -93 -work work {C:/Users/<ユーザ名>/Documents/Quartus/work_Prime18.1/niosii_swd_study5_logicsim/FPGA/MySPI/writer.vhdl}

vcom -93 -work work {C:/Users/<ユーザ名>/Documents/Quartus/work_Prime18.1/niosii_swd_study5_logicsim/FPGA/MySPI/reader.vhdl}

vcom -93 -work work {C:/Users/<ユーザ名>/Documents/Quartus/work_Prime18.1/niosii_swd_study5_logicsim/FPGA/MySPI/myspi.vhdl}

vcom -93 -work work {C:/Users/<ユーザ名>/Documents/Quartus/work_Prime18.1/niosii_swd_study5_logicsim/FPGA/MySPI/clkgen.vhdl}

vcom -93 -work work {C:/Users/<ユーザ名>/Documents/Quartus/work_Prime18.1/niosii_swd_study5_logicsim/FPGA/FPGA.vhd}

vcom -93 -work work {C:/Users/<ユーザ名>/Documents/Quartus/work_Prime18.1/niosii_swd_study5_logicsim/FPGA/PLL.vhd}

 

vcom -93 -work work {C:/Users/<ユーザ名>/Documents/Quartus/work_Prime18.1/niosii_swd_study5_logicsim/FPGA/simulation/modelsim/tb.vhd}

 

vsim -L altera_mf_ver -c work.tb

 

add wave -hex sim:/tb/clk48

 

 

log -r *

 

run -all

 

赤い部分を追加して上書き保存。

そして、do実行

シーンとなっちゃうけど、この辺にちゃんとやってるぜ的な表示が出ている。

終わった。シミュレーションを止めるためにテストベンチにseverity failureでassertしているので、Failureとかいうドキッとする表現が出るけど、VHDLではこれしか止める方法がないらしいのでしょうがないらしい。Verilogだと$stopとかいう命令で止まるらしい。

で、波形ウィンドウがでているので、表示する。

波形の横軸を調整したりするには、こちら。

テストベンチの中のインスタンスを選んで信号をずりずりっとやると波形を追加することができる。

まぁうまくいっている。

add wave -hex sim:/tb/FPGA_inst/clk100

add wave -hex sim:/tb/FPGA_inst/clk2

add wave -hex sim:/tb/FPGA_inst/NSEND

add wave -hex sim:/tb/FPGA_inst/NCLKDIV

add wave -hex sim:/tb/FPGA_inst/WDATA

add wave -hex sim:/tb/FPGA_inst/RDATA

add wave -hex sim:/tb/FPGA_inst/EN

add wave -hex sim:/tb/FPGA_inst/INIT

add wave -hex sim:/tb/FPGA_inst/SCK

add wave -hex sim:/tb/FPGA_inst/MOSI

これらをdoファイルに追記しておくと後でテストベンチ修正してもう一度シミュレーションするときにラク。

GHDL+GtkWaveがどんだけラクなのかがわかる長い道のりでした。Quartusでやる意義は、、、Quartusで論理合成が通ることの確証が取れること、、、

ここまで結局モノを扱わずに机上だけでした。モノでやってこそエンジニアなのでそろそろ実際のFPGAでやります。