SPIハードをVHDLで記述して、GHDLでは動いていたので、QuartusPrimeでシミュレーションしてみます。
そういえば通常SPIにはいくつかのオプションがありますが、今回はスピードだけいじれるものです。悪しからず。
Quartus Prime Lite EditionはVersion18.1を使います。Ver19以降はWSLを必要とするんだけど、設定がよくわからん。Ver18以前はcygwinを自前でインストールしてくれるのでラク。まぁいつか解決しよう、、、いつか、、、
ではQuartusを起動する。
New Project Wizardを押す。
反射的に「Next>」を押す。そう、反射的に。
フォルダ名とプロジェクト名を入れる。プロジェクト名を毎回おんなじにしておくと、複製が容易になると思う。なぜstudy5なのか、、、これ書くまでにいろいろ検討しているんですよ。涙ぐましい地道な作業の上にすべては成り立っているのです。報われないことが多すぎてホントしんどい。
そして「Next>」を押す。
こういうのが出たら、反射的に「Yes」を押す。そう、反射的に。
Emptyからやるので、そのまま「Next>」。
ここで、ファイルを入れ込めるみたいだけど、後でやるので何もせずに「Next>」。
このボードを使うので、こうする。このボードちょっと前まで購入できてたのに、今日見たら買えなくなってた。今後買うのならこれしかない。FPGA評価キットって高価だよなー。そして相変わらずの半導体不足、、、MAX10単品でも入手できない、、、やっぱりマイナーなLatticeのほうがホビーユーザーには手が届きやすいかな、、、まぁ今回はIntel MAX10で。
無料で使えるModelSim-Alteraを選択。VHDL派であることを主張。最近、Verilog-HDLのほうが魅力が高まっている気がする。OpenCoresでもVerilogの投稿のほうが多いような、、、
そして、反射的に「Finish」。
トップレベルのソースを作るので、File-->New。
ここでもVHDL派であることを主張。
とりあえず、まっさらな状態で名前を付けて保存。
「FPGA.vhd」として保存しようとするので、そのまま「保存」。
FPGAフォルダにMySPIフォルダを作ってGHDLでシミュレーションしたVHDLファイルを入れる。
QuartusでAssignments-->Settings...を選択する。
追加するファイルを選ぶダイアログを表示させる。
選んで開く。
こうなるので、OK。
システムクロックとSPIの基準クロックはテストベンチで与えるではなく、PLLで生成します。
たいへん安易なファイル名にします。
今回のボードは48MHzのクリスタルオシレータがついているので48MHzとします。
今回はオプションの入出力は使いません。
よくわからんので、そのままNext。
クロック源を切り替えられるらしいけど、無効のままNext。
ややこしいものは使わない。
C0をシステムクロックにします。欲をかいて100MHzにします。
SPIの基準は2MHzにします。2MHzでHとLをだすと1Mbit/secになります。
c2は使わない。
c3は使わない。
c4は使わない。
必要かどうかはわからんけど、有効にしておく。
おそらく、要らんと思うものまで有効にしてFinish。
Yesを押すと、プロジェクトにPLLを追加してくれる。
LIBRARY ieee; USE ieee.std_logic_1164.ALL; LIBRARY altera; USE altera.altera_syn_attributes.ALL; ENTITY 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 FPGA; ARCHITECTURE ppl_type OF FPGA IS SIGNAL res_n : STD_LOGIC; SIGNAL por_n : INTEGER RANGE 0 TO 1; SIGNAL por_count : INTEGER RANGE 0 TO 65535; CONSTANT POR_MAX : INTEGER := 127; COMPONENT MySPI IS PORT ( NSEND : IN STD_LOGIC_VECTOR(2 DOWNTO 0); NCLKDIV : IN STD_LOGIC_VECTOR(2 DOWNTO 0); CLKIN : IN STD_LOGIC; CLKOUT : OUT STD_LOGIC; CLKSYS : IN STD_LOGIC; BUSY : OUT STD_LOGIC; INIT : IN STD_LOGIC; WDATA : IN STD_LOGIC_VECTOR(7 DOWNTO 0); RDATA : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); OUTP : OUT STD_LOGIC; INP : IN STD_LOGIC; EN : IN STD_LOGIC ); END COMPONENT MySPI; signal EN_internal : std_logic; COMPONENT PLL IS PORT ( inclk0 : IN STD_LOGIC := '0'; c0 : OUT STD_LOGIC; c1 : OUT STD_LOGIC ); END COMPONENT PLL; SIGNAL clk100 : STD_LOGIC; SIGNAL clk2 : STD_LOGIC; BEGIN MySPI_inst : COMPONENT MySPI PORT MAP( NSEND => NSEND, NCLKDIV => NCLKDIV, CLKIN => clk2, CLKOUT => SCK, CLKSYS => clk100, BUSY => BUSY, INIT => INIT, WDATA => WDATA, RDATA => RDATA, OUTP => MOSI, INP => MISO, EN => EN_internal ); PLL_inst : PLL PORT MAP( inclk0 => clk48, c0 => clk100, c1 => clk2 ); --internal reset PROCESS (clk48) BEGIN IF clk48'event AND clk48 = '1' THEN IF por_count = POR_MAX THEN por_n <= 1; por_count <= por_count; ELSE por_n <= 0; por_count <= por_count + 1; END IF; END IF; END PROCESS; res_n <= '1' WHEN por_n = 1 ELSE '0'; EN_internal <= EN when res_n='1' else '0'; END;
FPGA.vhdはこうする。QuartusというかModelSimではテストベンチは別途作るので、MySPIのインスタンスとPLLのインスタンスとPLL起動待ちを実装する。
Analysis & Synthesisを右クリックしてStartを押すとなんかやってくれる。
こんな感じでできたらしい。
、、、道のりが長いのでいったんここで切る。
コメントをお書きください