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