ULX3SとPSRAM
SDRAMコントローラ書くの大変そうなので、kianRiscV でも使っているPSRAMを試してみたい。
QQSPI PSRAM Pmod Compatible Module (32MB)
4000円ぐらいだったような
kianRiscV
QQSPIのピン
https://gyazo.com/3d7c544d991123297e5feae54bd68a51
QQSPI
1 /SS (active low)
2 SIO0 (MOSI)
3 SIO1 (MISO)
4 SCK
5 GND
6 3V3
7 SIO2
8 SIO3
9 CS0
10 CS1
11 GND
12 3V3
QQSPIとULX3Sを接続
ULX3SのGPIO GP21からGP24、GN21からGP24を利用してQQSQPと接続
https://gyazo.com/1be5288b8f8a21fa8cec6449451e7aac
QQSPI → ULX3S
1 /SS (active low) → GN24
2 SIO0 (MOSI) → GN23
3 SIO1 (MISO) → GN22
4 SCK → GN21
5 GND → GND
6 3V3 → 3V3
7 SIO2 → GP24
8 SIO3 → GP23
9 CS0 → GP22
10 CS1 → GP21
11 GND → GND
12 3V3 → 3V3
QSPIの選択
QQSPIにはQSPI PSRAMが4個載ってる。
CS0ピンとCS1ピンの組み合わせでアクセスするQSPI PSRAMを選択する。
CS0 = L, CS1 = L → QSPI1を選択(QSPI1/CE = L)
CS0 = H, CS1 = L → QSPI2を選択(QSPI2/CE = L)
CS0 = L, CS1 = H → QSPI3を選択(QSPI3/CE = L)
CS0 = H, CS1 = H → QSPI4を選択(QSPI4/CE = L)
https://gyazo.com/d4cc082360877187b18ffceb5c8cfc27
QQSPI PSRAMを使ってみる
プロジェクトのテンプレをコピーしてきて、
code:sh
ファイル名を blinky から hello に変更
code:diff
diff --git a/Makefile b/Makefile
index a57e1de..e04fe15 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
.PHONY: all
.DELETE_ON_ERROR:
-TOPMOD := blinky
+TOPMOD := hello
VLOGFIL := $(TOPMOD).v
BINFILE := $(TOPMOD).bin
VDIRFB := ./obj_dir
@@ -40,11 +40,11 @@ test: $(VCDFILE)
$(VCDFILE): $(SIMPROG)
./$(SIMPROG)
-##
+##
.PHONY: clean
clean:
- rm -rf $(VDIRFB)/ $(SIMPROG) $(VCDFILE) blinky/ $(BINFILE) $(RPTFILE)
- rm -rf blinky.json ulx3s_out.config ulx3s.bit
+ rm -rf $(VDIRFB)/ $(SIMPROG) $(VCDFILE) hello/ $(BINFILE) $(RPTFILE)
+ rm -rf hello.json ulx3s_out.config ulx3s.bit
##
## Find all of the Verilog dependencies and submodules
@@ -65,13 +65,13 @@ endif
ulx3s.bit: ulx3s_out.config
ecppack ulx3s_out.config ulx3s.bit
-ulx3s_out.config: blinky.json
- nextpnr-ecp5 --85k --json blinky.json \
+ulx3s_out.config: hello.json
+ nextpnr-ecp5 --85k --json hello.json \
--lpf ulx3s_v20.lpf \
- --textcfg ulx3s_out.config
+ --textcfg ulx3s_out.config
-blinky.json: blinky.ys blinky.v
- yosys blinky.ys
+hello.json: hello.ys hello.v
+ yosys hello.ys
prog: ulx3s.bit
fujprog ulx3s.bit
diff --git a/blinky.ys b/blinky.ys
deleted file mode 100644
index 0107eff..0000000
--- a/blinky.ys
+++ /dev/null
@@ -1,2 +0,0 @@
-read_verilog blinky.v
-synth_ecp5 -json blinky.json
diff --git a/blinky.v b/hello.v
similarity index 100%
rename from blinky.v
rename to hello.v
diff --git a/hello.ys b/hello.ys
new file mode 100644
index 0000000..753a83b
--- /dev/null
+++ b/hello.ys
@@ -0,0 +1,2 @@
+read_verilog hello.v
+synth_ecp5 -json hello.json
qqspi.vのコードを読む
ステート
STATE_IDLE(初期状態)
valid && !ready && state == STATE_IDLE → STATE_INIT
STATE_INIT
初期化 → STATE_START へ遷移
STATE_START
QQSPIの/SSをアサート(SS = 0) → STATE_CMD へ遷移
STATE_CMD
(writeの場合) bufferへコマンドを書き込み → STATE_ADDR へ遷移
STATE_ADDR
bufferへアドレスを設定後、
(writeの場合) → STATE_WAIT へ遷移
(writeでない場合) → STATE_XFER へ遷移
STATE_WAIT
なんか初期化して → STATE_XFER へ遷移
STATE_XFER
終了処理を行なって → STATE_END へ遷移
STATE_END
読み込んだ buffer を rdata へセットして、ready = 1 にする → STATE_IDLE へ遷移
バス
addr (31:0)
rdata (31:0)
wdata (31:0)
ready: 読み込みまたは書き込みが完了
valid: 読み込み、または書き込みの開始依頼
write: 読み込み: 0、書き込み: 1
clk: クロック
resetn: リセット(通常は1にしておき、0でリセット)
アドレス
addr[24:23]でチップの選択を行なってる
QQSPIのアドレスの範囲は 0x0000000から0x1ffffffまでの32Mバイト
メモリマップの案
0x0000000から0x1ffffffまでの32MB: BRAM等の領域
0x2000000から0x2
kianRiscV
defines.vh をいい感じに修正して、
code:diff
以下のコマンドを実行
code:sh
cd kianv_harris_mcycle_edition/gateware/
./build_ulx3s.sh
fujprog soc.bit