Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

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

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 MHzfVCO = 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]

Packages

Packages