まよらー's 電子工作日記

回路設計、基板設計、Arduino、M5Stack、FPGAとか

Intel FPGA / NiosⅡSBT / UART core を使ってみた

 

UARTモジュールを使ってみる。

 

とりあえず、Lチカのコードに継ぎ足してみた。

 

仕様はこんな感じ↓。

LED点灯時にASCIIの”A(0x41)”を送信し、LED消灯時にASCIIの”B(0x42)”を送信する。

TXDとRXDはFPGA内でループバックするようにトップモジュールでつないだので、送信した上記のデータはそのまま受信することになる。

受信した結果をJTAG_UARTでコンソールに表示する。

 

ソースコードは以下。

 

 

  1. #include <stdio.h>
  2. //#include <stdint.h>
  3. #include "system.h"
  4. #include "altera_avalon_pio_regs.h"
  5. #include "altera_avalon_uart_regs.h"
  6. #include "altera_avalon_jtag_uart_regs.h"
  7. #include "sys/alt_sys_wrappers.h"
  8.  
  9. int main()
  10. {
  11.   printf("Hello from Nios II!\n");
  12.   char cBuf;
  13.   while (1) {
  14.      IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0xFF);
  15.      IOWR_ALTERA_AVALON_UART_TXDATA(IO_UART_BASE, 0x41);
  16.      cBuf = IORD_ALTERA_AVALON_UART_TXDATA(IO_UART_BASE);
  17.      IOWR_ALTERA_AVALON_JTAG_UART_DATA(JTAG_UART_BASE, cBuf);
  18.      usleep(500000);
  19.      IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x00);
  20.      IOWR_ALTERA_AVALON_UART_TXDATA(IO_UART_BASE, 0x42);
  21.      cBuf = IORD_ALTERA_AVALON_UART_TXDATA(IO_UART_BASE);
  22.      IOWR_ALTERA_AVALON_JTAG_UART_DATA(JTAG_UART_BASE, cBuf);
  23.      usleep(500000);
  24.   }
  25.  
  26.   return 0;
  27. }
  28.  
 
PIOと同じ要領で、レジスタライト、リードの関数を使って、データ送信、受信をする。
レジスタ書き込みの関数名は、altera_avalon_uart_regs.h の中に書かれている。
(送信:#define IOWR_ALTERA_AVALON_UARTTTXDATA(base, data))
(受信:#define IORD_ALTERA_AVALON_UART_RXDATA(base))
 
結果は以下。
 

UARTお試し_コンソール
想定通りに動いていた!
 
が、よくよく考えると、送信受信ともにバッファがないので、文字列を扱おうと思ったら、割り込み使って効率よく転送する必要がある。。。
 
Intel FPGA 16550 Compatible UART Core というIPならバッファがありそう。
なので、今度はこっちを試してみる。