FPGA勉強中です
・前回のプロジェクトに[uart IP]を追加して、PCのターミナルから文字を送受信しました。
・Nios II に UART IP を組み込み、PC とシリアル接続して通信テストを行いました。
・nios側でPCから受け取った1バイトをそのまま送信するエコーバックを実装しました。
・UART 経由の双方向通信が正常に動作することを確認しました。
前回のプロジェクト
https://qiita.com/ShigeoYakuno/items/78f6f9292a7d7631f251
それでは本編です
platform planner で UART IPの追加
・platform planner より「uart」で検索します。
・UART(RS-232 Serial Port)を選択します

・設定はデフォルトで使います。
・念のため、PC側は以下の設定で使いますので合わせます。

・設定出来たら、Generate HDLを選択して完了
今回使用するポート
・DevkitのPMOD端子の上側(1~6pin)を使用します。
・今回はF13(2pin)とD15(3pin)を使用しました。
・最初はF16(4pin)を使用予定でしたが、nCEOと競合しておりエラーがでました。
・QSFファイルの設定は以下を追加します。
# UART TXD (FPGA⇒FTDI USB-UART)
#set_location_assignment PIN_F16 -to uart0_txd_rxd_txd #nCEOと競合!
set_location_assignment PIN_F13 -to uart0_txd_rxd_txd
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to uart_txd_rxd_txd
# UART RXD (FTDI USB-UART⇒FPGA)
set_location_assignment PIN_D15 -to uart0_txd_rxd_rxd
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to uart_txd_rxd_rxd
FTDIチップ内蔵ケーブル
・FTDIチップ内蔵ケーブルを使います。
・秋月などで買えるUART-USB変換ケーブルを使用しました。
・昔買ったときは1000円台だったのに、今は4000円近くしますね。。。
https://akizukidenshi.com/catalog/g/g105840/
・pinアサインは以下の通りです。

・橙色:TXD ⇒ FPGAのRXD PIN_D15(PMOD_D2 J8-3)につなぎます
・黄色:RXD ⇒ FPGAのTXD PIN_F13(PMOD_D1 J8-2)につなぎます
・GNDも忘れずに。
quartusのコンパイル
・トップファイルの作成
・今までのサンプルにUARTのポートの宣言を足します。
module NiosII_Hw_Dev_C10 (
// Reset and Clocks
input C10_CLK50M,
input C10_RESETN,
// LED and Push Button
input [3:0] USER_PB,
output [3:0] USER_LED,
// UART (追加)
input uart0_txd_rxd_rxd, // UART受信 (FTDI TXD → FPGA)
output uart0_txd_rxd_txd // UART送信 (FPGA → FTDI RXD)
);
wire [2:0] led;
// Push button to turn on LED
assign USER_LED[0] = USER_PB[0];
// LED ON represent counter binary value of 1
assign USER_LED[3:1] = ~led;
// Instantiate nios2e
nios2e u0 (
.clk_clk (C10_CLK50M),
.reset_reset_n (C10_RESETN),
.led_external_connection_export (led),
// UART信号を接続 (追加)
.uart0_txd_rxd_rxd (uart0_txd_rxd_rxd),
.uart0_txd_rxd_txd (uart0_txd_rxd_txd)
);
endmodule
・この設定でコンパイルし、sofを書き込みます。
BSPの作成
・以下の通りのフォルダ構成にします。
top_project/
├─ nios2e.sopcinfo
└─ software/
├─ nios_uart_test/
└─ nios_uart_test_bsp/
・BSPフォルダにて下記を実行してNios II BSPを生成します。
・.sopcinfo(システム構成ファイル)をもとに、Nios II 向けの HAL(BSP) を作り直します
nios2-bsp hal . \
../../nios2e.sopcinfo \
--cpu-name nios2e \
--set hal.enable_small_c_library true \
--set hal.enable_reduced_device_drivers true \
--set hal.max_file_descriptors 4
・public.mk, system.h, linker.x, drivers/, alt_sys_init.cなどが作られます
elfの作成
・ファームウェアサンプルを用意します。
・uartでPCと接続してキーボードからの入力をエコーバックするものにしました。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include "system.h"
int main(void)
{
printf("=== UART Echo Test ===\n");
// UART0を開く
int uart = open("/dev/uart_0", O_RDWR);
if (uart < 0) {
printf("ERROR: Cannot open UART0\n");
return 1;
}
printf("UART Echo ready. Waiting for data...\n");
// ウェルカムメッセージ送信
const char *msg = "Echo ready. Type something:\r\n";
write(uart, msg, 30);
// エコーバックループ
while (1) {
char c;
int n = read(uart, &c, 1);
if (n > 0) {
// 受信した文字をそのまま送り返す
write(uart, &c, 1);
// JTAG UARTにも表示
printf("Received: 0x%02X ('%c')\n", c, c);
}
}
return 0;
}
・次にmakefileを作成します。
cd /cygdrive/d/workspace/cyc10/nios_uart/nios_uart_restored/software/nios_uart_test
nios2-app-generate-makefile \
--bsp-dir ../nios_uart_test_bsp \
--src-files nios_uart_test.c
makefileが作成されます。
・makeを実行します
make
・elfが作成されます。
実験開始
・teratermとnios2-terminalを開いておきます。
・コマンドnios2-terminal
・別のnios2-terminalで次のコマンドでelfを書き込みます。
nios2-download -r -g nios_uart_test.elf
・PC側
・「hello world!」とキーボード入力します。
・nios2からそのまま文字がエコーバックするので「hello world!」と表示されれば成功です。

・nios2側
・pcからのascii文字が表示されれば成功です。

まとめ
・Nios II に UART IP を組み込み、PC とシリアル接続して通信テストを行いました。
・nios側でPCから受け取った1バイトをそのまま送信するエコーバックを実装しました。
・UART 経由の双方向通信が正常に動作することを確認しました。



