ネコロジーをもっと速くしようと目論んでいて、
VHDLのお勉強をまた少しずつやっています。
で、この間メモ帳に落書きしておいたステート
マシンをVHDLに書き出してみることにしました。
クロックを入力して、1クロックごとにステータス
を変化させていき、SRAMに送り出すアドレス
と#WE信号、#OE信号を作り出すという
感じのもの。
機能はチョビットなのでそれほど難しくはありません。
メイン機能はネコロジーAVR同様にマイコン側に
持たせておいて、アドレス生成など速度が重要な
ところを74HC4040の代わりにCPLDで
置き換えちゃおうという作戦。
↓こんな感じ。(例によって、不等号のマークはすべて
全角に変換してあります)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cpld_state_test is
port (
clk : in std_logic;
add_out : out std_logic_vector(7 downto 0);
start_sign : in std_logic;
reset_sign : in std_logic;
we_signal : out std_logic;
oe_signal : out std_logic;
end_signal : out std_logic);
end cpld_state_test;
architecture rtl of cpld_state_test is
signal status : std_logic_vector(2 downto 0):= (others=>'0');
signal address : std_logic_vector(7 downto 0):= (others=>'0');
begin
process (clk)
begin
if (clk'event and clk='1') then
case status is
when "000" => -- reset mode
address <= "00000000";
status <= "001";
we_signal <= '1';
oe_signal <= '1';
when "001" => -- waiting start signal
end_signal <= '0';
if ( start_sign = '1' ) then
status <= "010";
end if;
when "010" => -- write enable (start loop)
we_signal <= '0';
status <= "011";
when "011" => -- write disable
we_signal <= '1';
status <= "100";
when "100" => -- count up address
address <= address + 1;
status <= "101";
when "101" => -- check to reach 32kB
if ( address = "11111111" ) then
status <= "110"; -- goto end
else
status <= "010"; -- goto loop
end if;
when "110" => -- output end_signal when reached 32kB
end_signal <= '1';
status <= "000";
when others => null;
end case;
end if;
end process;
add_out(0) <= address(0);
add_out(1) <= address(1);
add_out(2) <= address(2);
add_out(3) <= address(3);
add_out(4) <= address(4);
add_out(5) <= address(5);
add_out(6) <= address(6);
add_out(7) <= address(7);
end rtl;
思いつくままVHDLを書き出してみたんですが、
いくつか文法エラーがあったものの、それさえ直せば
とおりました。(初心者なので、間違えとか無作法とか
まだ残っているとは思いますが…)
シミュレーションも思ったとおりに得られました。
↓こんな感じ。
リセット信号、スタート信号を受けて、#WE信号と
アドレスのカウントが進んでいくのが見て取れます。
が、問題が…。
シミュレーションの入力条件には、クロックを50MHz
に設定してあるのですが、4クロックでアドレスが1カウント
しか進みません。つまり50MHzのクロックを使っても
12.5MHzでしかカウントアップできません。
このままでは12.5Mspsにしか…
これをもっと速い速度で動かすには、どうすればいいので
しょうねぇ?
色々調べてみたんですが、目下よくわかってません。
それに#WE信号が短すぎてもSRAM側の仕様に
そぐわなくなりそうだし…
まだまだ先は長い…
|