0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cyclone® 10 LP Nios II とuart IPでPCと通信してみた

0
Posted at

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)を選択します
image.png

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

・これが完成形になります。
image.png

・アドレスマップ
image.png

・設定出来たら、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

image.png
image.png

FTDIチップ内蔵ケーブル

・FTDIチップ内蔵ケーブルを使います。
・秋月などで買えるUART-USB変換ケーブルを使用しました。
・昔買ったときは1000円台だったのに、今は4000円近くしますね。。。

https://akizukidenshi.com/catalog/g/g105840/
・pinアサインは以下の通りです。
image.png

・橙色: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!」と表示されれば成功です。
image.png
・nios2側
・pcからのascii文字が表示されれば成功です。
image.png

まとめ

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

今日はここまで

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?