guruguru123’s diary

かなり雑な作業日記です。

Papilio Pro基板上SDRAMの利用(1)

ad9851の出力の周波数・位相を高速に切り替える(μs単位が目標)ためにあらかじめPapilio Pro基板上のSDRAMにad9851へ書き込む40bitデータと時間のデータを与えておく。それを順次読み出して40bitデータをad9851へ書き込みをできるようにする。

そのためにはまずSDRAMをコントローラで

http://hamsterworks.co.nz/mediawiki/index.php/Simple_SDRAM_Controller

https://github.com/alvieboy/ZPUino-HDL/blob/dcache/zpu/hdl/zpuino/boards/papilio-pro/S6LX9/sdram_hamster.vhd

以上のサイトを参考にしながら読み書きできるようにしていく。

Papiio Pro上のSDRAMはMicron社製64MbitのSDRAM,MT48LC4M16A2。16Mbit→2^26であるので26個のアドレスが必要になる。しかし、26桁のアドレス指定用信号を用意するのでは長すぎる。そのためロウアドレス(RAS)と絡むアドレス(CAS)、バンクを用いる。SDRAMはコマンドによる制御を必要とする。

まずはentity内部から

generic (
 HIGH_BIT: integer := 24;
 MHZ: integer := 96;
 REFRESH_CYCLES: integer := 4096;
 ADDRESS_BITS: integer := 12
 );
ここでは、後に変更し得る値を設定している。

以下入出力ポート

 clock_100: in std_logic;
 clock_100_delayed_3ns: in std_logic;
 rst: in std_logic;
clock_100とclock_100_delayed_3nsが何を指しているのかわからなかった。rstはリセット信号。

以下が SDRAM用信号
 DRAM_ADDR : OUT STD_LOGIC_VECTOR (ADDRESS_BITS-1 downto 0);
 DRAM_BA : OUT STD_LOGIC_VECTOR (1 downto 0);
 DRAM_CAS_N : OUT STD_LOGIC;
 DRAM_CKE : OUT STD_LOGIC;
 DRAM_CLK : OUT STD_LOGIC;
 DRAM_CS_N : OUT STD_LOGIC;
 DRAM_DQ : INOUT STD_LOGIC_VECTOR(15 downto 0);
 DRAM_DQM : OUT STD_LOGIC_VECTOR(1 downto 0);
 DRAM_RAS_N : OUT STD_LOGIC;
 DRAM_WE_N : OUT STD_LOGIC;
各ポート説明
DRAM_ADDR:アドレス信号。ロウアドレスとカラムアドレスを入力する。
SDRAM_BA:2bitのバンク。                          
DRAM_CKE:クロックイネーブル。                      
DRAM_CLK:クロック信号。                          
DRAM_CD_N:チップセレクト信号。                      
DRAM_WE_N:書き込みイネーブル信号。                   
DRAM_DQ:入出力データ信号。                        
DRAM_RAS_N:この信号がハイの間、アドレス信号にロウアドレスが入力される。 
DRAM_CAS_N:この信号がハイの間、アドレス信号にカラムアドレスが入力される。
DRAM_DQM:データマスクイネーブル

以下がアクセス用信号
 address : IN STD_LOGIC_VECTOR (HIGH_BIT downto 2);
 req_read : IN STD_LOGIC;
 req_write : IN STD_LOGIC;
 data_out : OUT STD_LOGIC_VECTOR (31 downto 0);
 data_out_valid : OUT STD_LOGIC;
 data_in : IN STD_LOGIC_VECTOR (31 downto 0);
 data_mask : IN STD_LOGIC_VECTOR (3 downto 0);
各ポート説明
address:アドレス入力であり、ロウアドレスとカラムアドレスを入力する。
req_read:読み出しリクエスト信号。                     req_write:書き込みリクエスト信号。                     data_out:出力信号。                              data_in:入力信号。
data_out_valid:出力有効判定
data_mask : データマスク

わからなかったポートについては後で調べる。データマスクについてよくわかっていないので、別途学習したい。引き続きこのプログラムの構成を見ていく。