ZuckerSOCメモ
UART関連
UARTのデータレジスタ
アドレス: 0xf0000000
送信したい場合は 0xf0000000 へ書き込む
受信したい場合は 0xf0000000 から読み込む
UARTの制御レジスタ
アドレス: 0xf0000004
読み込んだデータの意味
最下位ビット( uart_ctr[0] ):受信データの有無(未読の場合は1、読み込みを行うと1→0となる)
下位第二ビット( uart_ctr[1] ):データ送信中の場合は1、そうでない場合は0
実装はこんな感じ
mem_rdata[7:0] <= { 6'b0, uart0_txbusy, uart0_dr };
UART周りの制御回路
code:rtl/sysctl_pico.v
((mem_addr & 32'hf000_0000) == 32'hf000_0000): begin
(* parallel_case *)
16'h0000: begin
if (mem_wstrb && !uart0_txbusy) begin
uart0_tx_byte <= mem_wdata7:0; uart0_txbusy <= 1;
uart0_transmit <= 1;
mem_ready <= 1;
end else if (!mem_wstrb) begin
mem_rdata7:0 <= uart0_rx_byte; uart0_dr <= 0;
UART0_CTS <= 0;
mem_ready <= 1;
end
end
16'h0004: begin
if (!mem_wstrb) begin
mem_rdata7:0 <= { 6'b0, uart0_txbusy, uart0_dr }; end
mem_ready <= 1;
end
LEDへの値の表示
code:asm
// 16 + 4 の結果をLEDに表示
li t1, 0xf0001000 // LEDコントロールレジスタのアドレス
sw t0, 0(t1) // LEDコントロールレジスタへ書き込み
initialでBRAMを初期化できそう
ブートプログラムを bram へ配置してるところ? initial で書けるの便利そう。
code:verilog
// BLOCK RAM
`ifdef EN_LOWBRAM
localparam BRAM_WORDS = 1280; // 32-bit words
`else
localparam BRAM_WORDS = 1536;
`endif
`ifdef FPGA_GATEMATE
initial $readmemh("firmware/firmware.hex", bram);
`else
initial $readmemh("firmware/firmware_seed.hex", bram);
`endif
EN_GPU_TEXT
EN_GPU_TEXT することでテキストを画面に出力できそう
Video Text
There is a 80x25 character buffer in BRAM at 0x10000000. In monochrome mode, the character buffer is 128x48.
Writing an ASCII character to this video text memory will display it on the screen.
Text and graphics can be displayed at the same time.
本当にSDRAM動いてる?
動いてそうに見える。