jacaranda_8_IO - cpu-dev/cpu-dev.github.io GitHub Wiki

このページではjacaranda-8にI/Oの機能を追加していく。

jacaranda-8のMemory Map

address description note
255 UART FLAG REGISTER 1(UFR1)
254 UART FLAG REGISTER 2(UFR2) read only
253 UART TX DATA(UTD)
252 UART RX DATA(URD) read only
251 LED IO
250 interrupt vector
249 LED state
248 7seg_out

UARTモジュールをつくる

// TODO

UART TXをしてみる

jacaranda-8のメモリ空間上にUART TXのコンフィグ用MMIO領域をつくります。 ここでは、255番地から253番地までをUART TXのコンフィグ用MMIO領域として確保します。

address description note
255 UART FLAG REGISTER 1(UFR1)
254 UART FLAG REGISTER 2(UFR2) read only
253 UART TX DATA(UTD)
252 UART RX DATA(URD) read only

UART FLAG REGISTER 1(UFR1)

7-1 1 0
reserved rx_en tx_en
flag name description
rx_en rx enable flag. rx_enが1のときUART RXは有効です
tx_en tx enable flag. tx_enが1のときUART TXは有効です

UART FLAG REGISTER 2(UFR2)

7-1 1 0
reserved receive_flag busy_flag
flag_name description
receive_flag receive flag. rxが受信完了すると、receive_flagは1となります。
busy_flag busy flag. txが送信中であるとき、busy_flagは1となります。busy_flagが1のときにUTDへ書き込むのは禁止されています。

verilogを簡単に書くため、flagレジスタを2つ用意し一方はread onlyとしています。

UFR1のデータパス

// TODO

UFR2のデータパス

// TODO

UART TX DATAのデータパス

// TODO

UART TXのためのサンプルプログラム

ldih 0
ldil 1
mov r0, r3 // r0 = 0b00000001;
ldih f
ldil f
st r0, r3 // tx_en = 1;
//loop:
ldih 4
ldil 1
mov r0, r3 // r0 = 'A';
//check_busy:
// while(busy_flag == 1);
ldih f
ldil d
mov r1, r3 // r1 = UTD;
ldih f
ldil e
ld r2, r3 // r2 = UFR2;
ldih 0
ldil 1
and r2, r3 // r2 = UFR2 & 0b00000001;
cmp r2, r3 // r2 = busy_flag == 1
ldih 0
ldil c
je r3 // je check_busy
st r0, r1 // UTD = 'A';
ldih 0
ldil 6
jmp r3 // jmp loop