第1回 NiosにUART(RS-232 Serial Port)を実装してみる

FPGA

関連記事 FPGA
関連記事 Nios
関連記事 Quartus
関連記事 2回 NiosにUART(RS-232 Serial Port)を実装してみる

前にこんな記事を書いてみました。

JTAG UARTをNiosに実装することで、なんとなくパソコンとNiosで通信はできましたが、Visual Basicとかで作ったアプリとNiosで通信する方法がわかりませんでした。

そのやり方が未だにわからにので、別の手段として”UART (RS-232 Serial Port) Intel FPGA IP”という機能を実装してみることにしました。

この機能が動けば、パソコンとNiosでRS-232で通信できるはずです。

Terasic DE0-NANO開発ボード 【P0082】

新品価格
¥14,520から
(2020/5/19 00:12時点)

スポンサーリンク

Quartus Platform Designer

まずはQuartus Platform DesignerでNiosで使う機能を決定します。ここで、”UART (RS-232 Serial Port) Intel FPGA IP”をNiosに追加します。

Quartus Platform Designerの使い方はこちらの記事で紹介しています。

上の記事の、”QuartusのPlatform Designerを使ったハードウェア設計”の章に記載した内容をそのまま実施し、以下の機能を実装しておきます。

・Nios II
・On-Chip Memory
・汎用入力ポート(2本)
・汎用出力ポート(8本)
・JTAG UART

これらの機能を実装し終わったら、次は”UART (RS-232 Serial Port) Intel FPGA IP”を追加します。

①Interface Protocols -> Serial -> UART (RS-232 Serial Port) Intel FPGA IPを選択
②Addをクリックして追加
③uart_0の機能が追加される
④信号を接続
⑤external_connectionの項目のDouble-click to exportをダブルクリックします。すると表示がuart_0_external_connectionに変わると思います。これで、TXDとRXDが外部ピンとして生成されると思います。

続いて、
①uart_0をダブルクリック
②Parametersが表示されます
③ボーレート、パリティ、データービット、ストップビットなどの通信設定をします。

ここまで終わったら、第2回 Nios IIで遊ぼう Quartus Platform Designer編に従って先に進めてください。

VHDL

Quartus Platform Designerが生成したVHDLを使用して、以下のようなVHDLを生成しました。

library ieee;
use ieee.std_logic_1164.all;

entity nios2_uart is
	port(
	CLK		:	in std_logic;
	RXD		:	in std_logic;
	SW_IN		:	in std_logic_vector(1 downto 0);
	TXD		:	out std_logic;
	LED_OUT	:	out std_logic_vector(7 downto 0)
	);
end nios2_uart;

architecture rtl of nios2_uart is
	component nios_uart is
		port (
			clk_clk                               : in  std_logic                    := 'X';             -- clk
			sw_input_external_connection_export   : in  std_logic_vector(1 downto 0) := (others => 'X'); -- export
			led_output_external_connection_export : out std_logic_vector(7 downto 0);                    -- export
			uart_0_external_connection_rxd       : in  std_logic                     := 'X';             -- RXD
			uart_0_external_connection_txd       : out std_logic                                         -- TXD
		);
	end component nios_uart;
	

	signal	led_output_signal	:	std_logic_vector(7 downto 0);
	signal	txd_signal			:	std_logic;


begin
	
	u0 : component nios_uart
		port map (
			clk_clk                               => CLK,					-- clk.clk
			sw_input_external_connection_export   => SW_IN,					-- sw_input_external_connection.export
			led_output_external_connection_export => led_output_signal,	-- led_output_external_connection.export
			uart_0_external_connection_rxd       => RXD,						-- uart9600_external_interface.RXD
			uart_0_external_connection_txd       => txd_signal				--                            .TXD
		);
		
		LED_OUT <= led_output_signal;
		TXD <= txd_signal;
		
end rtl;

VHDLをシンボル化し、トップの回路図はこんな風になりました。

入力ピン
・CLK
・RXD
・スイッチ入力の汎用入力ポート×2本

出力ポート

・TXD
・LED用の汎用出力ポート×8本

Nios II Software Build Tools for Eclipse

ここからはソフトウェアです。やることは以下の記事とほぼ同じです。

上の記事との差異は、stdinとstdoutです。

soft_test_bsp -> Nios II -> BSP Editorを選択します。

Settings -> Commonを選択して、stdinとstdoutをuart_0にします。

あとは、こちらの記事と同じように進めてください。

今回の目標機能

ここで、今回の目標機能です。

以下はイメージ図です。

話相手のパソコン側の準備ができていないので、Niosに実装したUARTのTXDとRXDをショートさせて通信チェックをします。

①0から255までをTXDから送信
②RXDでデータ受信
③受信したデータにあわせてLEDを点灯させる

これが今回の目標です。

ソースコード

今回作成したソースコードです。

#include "sys/alt_stdio.h"
#include "system.h"
#include <stdio.h>
#include <string.h>


int main()
{
	int i=0;
	int j=0;
	int prompt = 0;

   *(volatile unsigned char *) LED_OUTPUT_BASE = 0x00;

   while(1){

	   putchar(i);
	   prompt = getchar();

	   *(volatile unsigned char *) LED_OUTPUT_BASE = prompt;

	   for(j=0;j<10000;j++){}
	   for(j=0;j<10000;j++){}
	   for(j=0;j<10000;j++){}
	   for(j=0;j<10000;j++){}
	   for(j=0;j<10000;j++){}
	   for(j=0;j<10000;j++){}
	   for(j=0;j<10000;j++){}
	   for(j=0;j<10000;j++){}
	   for(j=0;j<10000;j++){}
	   for(j=0;j<10000;j++){}

	   if(i>=255) i=0;
	   else       i++;

   }

   return (0);
}

データの送信はputchar()、データの受信はgetchar()です。

何個も並んでいるfor文はただのwaitです。

実行結果

実行してLEDが0x00から0xFFの順に点灯すれば成功です。

まとめ

パソコンとの通信はできませんでしたが、ここまで動けばおそらく大丈夫でしょう。

ただ、データの送受信方法にはまだ不満があります。

getchar()でデータ受信すると、データが来るまでずっと待ち続けているようなので、他の処理が動いてくれません。

シリアルデータ送受信用の関数があると思うんだけど、まだわかっていないので、次の課題です。

関連記事

第1回 Nios IIで遊ぼう 目標機能編
第2回 Nios IIで遊ぼう Quartus Platform Designer編
第3回 Nios IIで遊ぼう Nios II Software Build Tools for Eclipse編
第4回 Nios IIで遊ぼう Nios II Command Shell編
第5回 Nios IIで遊ぼう パソコンからNiosへのコマンド送信編

Terasic DE0-NANO開発ボード 【P0082】

新品価格
¥14,520から
(2020/5/19 00:12時点)

関連記事 FPGA
関連記事 Nios
関連記事 Quartus

タイトルとURLをコピーしました