「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



ネコロジーをもっと速くしようと目論んでいて、
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側の仕様に
そぐわなくなりそうだし…

まだまだ先は長い…



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする