hello_veryl
| Version | 0.1.0 |
|---|
Modules
| ActivityLed | アクティビティ表示 (パルス引き伸ばし) |
|---|---|
| Blink | LED 点滅 (分周トグル) |
| FontRom | 8x16 フォント ROM (ASCII 0x00-0x7F,未定義コードは全 0) |
| PsramClkGen | PSRAM 用クロック生成 (rPLL 27 MHz → clk_mem 54 MHz) |
| PsramSpikeBitbang | PSRAM spike 段1: bit-bang レジスタ読み出し (docs/psram.md「spikeの構成」) |
| TextConsole | テキストコンソール |
| Top | トップモジュール (Tang Nano 9K) |
| Uart | UART 送受信 (8N1) |
| VideoTiming | RGB LCD (DEモード) タイミングジェネレータ |
Module Prototypes
Interfaces
| stream_if | valid/ready ハンドシェイクの汎用 stream interface |
|---|
Packages
Modules
Modules
| ActivityLed | アクティビティ表示 (パルス引き伸ばし) |
|---|---|
| Blink | LED 点滅 (分周トグル) |
| FontRom | 8x16 フォント ROM (ASCII 0x00-0x7F,未定義コードは全 0) |
| PsramClkGen | PSRAM 用クロック生成 (rPLL 27 MHz → clk_mem 54 MHz) |
| PsramSpikeBitbang | PSRAM spike 段1: bit-bang レジスタ読み出し (docs/psram.md「spikeの構成」) |
| TextConsole | テキストコンソール |
| Top | トップモジュール (Tang Nano 9K) |
| Uart | UART 送受信 (8N1) |
| VideoTiming | RGB LCD (DEモード) タイミングジェネレータ |
ActivityLed
ActivityLed
アクティビティ表示 (パルス引き伸ばし)
i_active のパルスを人間が視認できる幅へ引き伸ばす.
i_active が立つたびに保持カウンタをリロードし,HoldCycles の間
o_on を保持する (保持中の再トリガで延長).
Parameters
| HoldCycles | u32 | 保持サイクル数 (既定 100 ms @ 27 MHz) |
|---|
Ports
| i_clk | input | clock | クロック |
|---|---|---|---|
| i_rst | input | reset | リセット |
| i_active | input | logic | アクティビティ検出 (レベル,1 で活動中) |
| o_on | output | logic | 表示出力 (保持中 1) |
Blink
Blink
LED 点滅 (分周トグル)
InClkFreq / (BlinkFreq * 2) サイクルごとに出力を反転し,
BlinkFreq [Hz] の矩形波を生成する.
Parameters
| InClkFreq | u32 | 入力クロック周波数 [Hz] |
|---|---|---|
| BlinkFreq | u32 | 点滅周波数 [Hz] |
Ports
| i_clk | input | clock | クロック |
|---|---|---|---|
| i_rst | input | reset | リセット |
| o_led | output | logic | LED 出力 (トグル) |
FontRom
FontRom
8x16 フォント ROM (ASCII 0x00-0x7F,未定義コードは全 0)
各バイト: bit0=左端(col0) [LSB-left]. 実装: グリフ単位の case 式で 128bit パック定数 (row0 が下位) を引き, 行はシフトで選択する (Veryl は通常 module の initial で代入不可, また数百アームの単一 case はコンパイラの stack overflow を誘発するため).
生成物のため直接編集しない (scripts/gen_font_rom.py で再生成).
Ports
| i_clk | input | clock | クロック |
|---|---|---|---|
| i_code | input | logic<7> | ASCIIコード |
| i_row | input | logic<4> | グリフ内の行 (0-15) |
| o_line | output | logic<8> | 1行分のピクセル (1サイクル遅れ) |
PsramClkGen
PsramClkGen
PSRAM 用クロック生成 (rPLL 27 MHz → clk_mem 54 MHz)
設定 (docs/psram.md,UG286):
fCLKOUT = 27 * FBDIV(2) / IDIV(1) = 54 MHz,
fVCO = 54 * ODIV(16) = 864 MHz (GW1NR-9 C6/I5 許容 400-1200 MHz 内,DS117).
位相調整出力 CLKOUTP は phy パッチで使用する (PSDA_SEL は初期値 90°=0100). LOCK はロック過程でグリッチしうる (UG286 note) ため表示用途に留める. 実機結果 (2026-07-22): 54 MHz 動作と lock を LED で確認済み.
Clock Domains
| 'mem |
|---|
| 'memp |
| 'osc |
Ports
| i_clk | input | 'osc | clock | 基準クロック (27 MHz オシレータ) |
|---|---|---|---|---|
| o_clk_mem | output | 'mem | clock | clk_mem (54 MHz,位相 0°) |
| o_clk_mem_p | output | 'memp | clock | 位相シフト出力 (+90°,段2では未使用) |
| o_lock | output | 'osc | logic | PLL lock (非同期出力,表示用途のみ) |
PsramSpikeBitbang
PsramSpikeBitbang
PSRAM spike 段1: bit-bang レジスタ読み出し (docs/psram.md「spikeの構成」)
PLL・DDR プリミティブを使わず 27 MHz ロジックのみで CK = 27/4 = 6.75 MHz を
生成し,ch0 の IR0/IR1/CR0 を読み出して結果を ASCII 1 行の stream として
送出する (PSRAM IR0=xxxx IR1=xxxx CR0=xxxx L=xx W=x).
CK 位相 (1 CK = 4 サイクル,phase 0..3).CK エッジがデータ遷移から 1 サイクル遅れ,構成的に 90° 相当の関係になる:
リード側は POR デフォルト (固定 2x レイテンシ) 前提で CR0 を書かず, RWDS のエッジ検出で自己同期してデータ語を取り込む (レイテンシ実測値は L=xx として報告し,L1 モデル/データシート解釈の照合に使う). 実機結果 (2026-07-22): IR0=005F / IR1=000F / CR0=8F1F / L=0B / W=1.
Parameters
| ResetPulseCycles | u32 | リセットパルス幅 [cyc] (tRP = 200 ns min → 27 MHz で 8 cyc = 296 ns) |
|---|---|---|
| TvcsCycles | u32 | RESET# 解除後の待機 [cyc] (tVCS = 150 µs min → 200 µs 相当を既定とする) |
Ports
| i_clk | input | clock | クロック (27 MHz) |
|---|---|---|---|
| i_rst | input | reset | リセット |
| o_ck | output | logic | CK 出力 (6.75 MHz) |
| o_cs_n | output | logic | CS# 出力 |
| o_reset_n | output | logic | RESET# 出力 |
| o_dq | output | logic<8> | DQ 出力 (CA) |
| o_dq_oe | output | logic | DQ 出力イネーブル |
| i_dq | input | logic<8> | DQ 入力 (リードデータ) |
| i_rwds | input | logic | RWDS 入力 (データ検出に使用) |
| msg | modport | stream_if source | 結果メッセージ (リセット毎に 1 行送出) |
TextConsole
TextConsole
テキストコンソール
受信した文字をカーソル位置へ書き込み,VideoTiming の座標に同期して 文字ピクセルを描画する.text RAM (std::ram) + FontRom の 2 段読み出しに 合わせ,de/sync を 2 サイクル遅延して出力する.
flowchart LR
CH["文字入力"] --> WR["書き込みFSM<br>カーソル/スクロール"]
WR --> RAM["text RAM<br>(std::ram)"]
POS["VideoTiming座標"] --> RAM
RAM --> FONT["FontRom 8x16"]
FONT --> PX["ピクセル出力<br>(2段パイプライン)"]
文字セマンティクス:
- 0x20-0x7E: カーソル位置へ表示しカーソル前進 (右端で折り返し)
- LF (0x0A): 改行 (行頭復帰 + 行送り)
- CR (0x0D): 行頭復帰
- その他: 無視
最下行での行送りはリングバッファ的に 1 行スクロールする (base_row 前進 + 新最下行のクリア).クリア中 (Cols サイクル) の文字入力は無視されるが, UART のバイト間隔 (115200bps で約 2300 サイクル) より十分短いため実害はない.
Parameters
| Cols | u32 | 桁数 |
|---|---|---|
| Rows | u32 | 行数 |
Ports
| i_clk | input | clock | クロック |
|---|---|---|---|
| i_rst | input | reset | リセット |
| i_char_valid | input | logic | 文字入力有効 |
| i_char | input | logic<8> | 文字コード (ASCII) |
| i_de | input | logic | データイネーブル入力 |
| i_hsync | input | logic | 水平同期入力 |
| i_vsync | input | logic | 垂直同期入力 |
| i_pos_x | input | logic<10> | 画素 X 座標 |
| i_pos_y | input | logic<9> | 画素 Y 座標 |
| o_de | output | logic | データイネーブル出力 |
| o_hsync | output | logic | 水平同期出力 |
| o_vsync | output | logic | 垂直同期出力 |
| o_pixel | output | logic | 文字前景=1 |
Top
Top
トップモジュール (Tang Nano 9K)
UART エコー + テキストコンソール (LCD) + PSRAM spike + LED 表示の統合.
flowchart LR
PC["PC (COMポート)"] -- uart_rx --> RX["Uart RX"]
RX -- "echo" --> ARB["TX arbiter<br>(spike優先)"]
SPIKE["PsramSpikeBitbang"] -- "結果1行" --> ARB
ARB --> TX["Uart TX"] -- uart_tx --> PC
ARB -. "傍受" .-> CON["TextConsole"] --> LCD["5inch LCD"]
SPIKE <--> RAM["内蔵 PSRAM ch0"]
PLL["PsramClkGen<br>(rPLL 54MHz)"] --> LEDS["leds"]
LED 割当は docs/rtl.md,PSRAM サブシステムは docs/psram.md を参照.
Parameters
| OscFreq | u32 | オシレータ周波数 [Hz] |
|---|---|---|
| NumLeds | u32 | LED 数 |
Ports
| i_clk | input | clock | 27 MHz オシレータ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| i_rst | input | reset | S1 ボタン (active-low) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| leds | output | logic| LED (active-low,割当は rtl.md)
|
uart_tx |
output |
logic |
UART TX
|
uart_rx |
input |
logic |
UART RX
|
lcd_clk |
output |
logic |
LCD ピクセルクロック (反転出力)
|
lcd_de |
output |
logic |
LCD データイネーブル
|
lcd_hsync |
output |
logic |
LCD 水平同期 (負極性)
|
lcd_vsync |
output |
logic |
LCD 垂直同期 (負極性)
|
lcd_r |
output |
logic<5> |
LCD R (RGB565)
|
lcd_g |
output |
logic<6> |
LCD G (RGB565)
|
lcd_b |
output |
logic<5> |
LCD B (RGB565)
|
O_psram_ck |
output |
logic<2> |
PSRAM CK (ch1:ch0)
|
O_psram_ck_n |
output |
logic<2> |
PSRAM CK# (差動)
|
O_psram_cs_n |
output |
logic<2> |
PSRAM CS#
|
O_psram_reset_n |
output |
logic<2> |
PSRAM RESET#
|
IO_psram_dq |
inout |
trilogic<16> |
PSRAM DQ (ch0=下位8bit)
|
IO_psram_rwds |
input |
logic<2> |
PSRAM CK (ch1:ch0)
PSRAM CK# (差動)
PSRAM CS#
PSRAM RESET#
PSRAM DQ (ch0=下位8bit)
PSRAM RWDS.spike では読むだけのため input とする
(メモリライトのマスクで駆動が必要になる phy パッチで inout 化する)
|
|
Uart
Uart
UART 送受信 (8N1)
- TX:
tx_streamから 1 バイト受け取り LSB first で送出する - RX: 2FF 同期 + start bit 中央から 1 ビット周期ごとの中央サンプリング.
受信完了で即
validを立てて次フレームに備えるノンブロッキング供給 (未消費のまま次バイトが完了した場合は旧バイトを上書き)
Parameters
| InClkFreq | u32 | 入力クロック周波数 [Hz] |
|---|---|---|
| BaudRate | u32 | ボーレート [bps] |
Ports
| i_clk | input | clock | クロック |
|---|---|---|---|
| i_rst | input | reset | リセット |
| uart_tx | output | logic | TX ライン (idle High) |
| uart_rx | input | logic | RX ライン (非同期入力,内部で 2FF 同期) |
| tx_stream | modport | stream_if sink | 送信データ入力 |
| rx_stream | modport | stream_if source | 受信データ出力 (ノンブロッキング) |
VideoTiming
VideoTiming
RGB LCD (DEモード) タイミングジェネレータ
デフォルトタイミングは 5inch 800x480 パネル (050QG32-40) の datasheet “6.4 Timing Characteristics” から導出した pclk=27MHz 用の値:
- HSyncWidth=1 (thpw min),HBackPorch=46 (thb 固定値)
- VSyncWidth=3 (tvpw min),VBackPorch=23 (tvb 固定値)
- FrontPorch はライン長/フレーム長の選択からの逆算 (HTotal=890, VTotal=513)
- 27MHz / (890 * 513) = 59.1Hz refresh
sync 極性は負 (公式 Wiki rgb_screen: “enabled by negative polarity”).
本モジュールはタイミングと座標の生成のみを担う.画素合成 (色のゲートや フォーマット変換) は利用側で行い,パイプライン段数に応じて de/sync を 遅延させて位相を合わせること.
Parameters
| Width | u32 | 有効画素数 (水平) |
|---|---|---|
| Height | u32 | 有効画素数 (垂直) |
| HFrontPorch | u32 | 水平フロントポーチ [pclk] |
| HSyncWidth | u32 | 水平同期幅 [pclk] |
| HBackPorch | u32 | 水平バックポーチ [pclk] |
| VFrontPorch | u32 | 垂直フロントポーチ [line] |
| VSyncWidth | u32 | 垂直同期幅 [line] |
| VBackPorch | u32 | 垂直バックポーチ [line] |
Ports
| i_clk | input | clock | クロック (= pclk) |
|---|---|---|---|
| i_rst | input | reset | リセット |
| de | output | logic | データイネーブル |
| hsync | output | logic | 水平同期 (負極性) |
| vsync | output | logic | 垂直同期 (負極性) |
| frame | output | logic | Vブランキング先頭の1クロックパルス |
| pos_x | output | logic<$clog2(Width)> | 画素 X 座標 (de==1 で有効) |
| pos_y | output | logic<$clog2(Height)> | 画素 Y 座標 (de==1 で有効) |
Module Prototypes
Module Prototypes
Interfaces
Interfaces
| stream_if | valid/ready ハンドシェイクの汎用 stream interface |
|---|
stream_if
stream_if
valid/ready ハンドシェイクの汎用 stream interface
valid && ready のサイクルで data を 1 語転送する.
source が data/valid を,sink が ready を駆動する.
Parameters
| BitWidth | u32 | データ幅 [bit] |
|---|