1
Verilog-HDL 講習会DE0編(12) RS232C受信(Rx)
31, July, 2013 鹿児島大学 中原 啓貴
UARTとは • シリアルポートに外部機器を接続して行う通信 • 1ビットずつ逐次データ転送 ‒ 3本の信号線を使用: グランド(GND), 送信 (TX), 受信 (RX)
• 同期をとるために予め以下の項目を決めておく ‒ ボーレート: 1秒当りの転送ビット数 ‒ データ長 ‒ パリティの有無: ありの場合は奇数か偶数かを設定 ‒ ストップビットの長さ
• データそのものに同期用信号を持ち, 送受信側双方で同期をとる通信方法を調歩同期式 (別名, 非同期式: Asynchronous Communication)という
• 調歩同期式でシリアルデータとパラレルデータを相互に変換する回路を汎用非同期送受信回路 (UART: Universal Asynchronous Receiver Transmitter)という 2
RS232C通信とは
3
• よく使われているUARTの一種 • 今回は3本線通信を実装しよう
準備 • DE0ボードにはRS232Cコネクタを取り付けるパターンが設計済み ‒ レベル(電圧)変換IC(ADM3202)も取り付け済み
4
RS232Cコネクタを半田付け
5
5 4 3 2 1
9 8 7 6 1 2 3 4 5
6 7 8 9
RS232Cコネクタ(メス)に ハンダ付け. 表と裏のピン番号に 気をつけること!
表 裏
RS232C信号を受信 (今回は9600 bpsとする)
6
スタートビット (1ビットの0)
データ(8ビット) LSB(最下位ビット)から送信
ストップビット (1ビットの1)
D0 D1 D2 D3 D7
9600 bps = 9600 bit per second つまり, 1秒間に(スタートビットや ストップビットも含めて) 9600bit送信するという意味
RS232C受信方法 • 4倍速いクロックでスタートビットを検出 ‒ 9600bpsと等速→データ間を上手く切り替えられない ‒ 速すぎるクロック→信号の変化を受信してしまう
• 4クロック毎に受信
7
スタートビット (1ビットの0)
データ(8ビット) LSB(最下位ビット)から送信
ストップビット (1ビットの1)
D0 D1 D2 D3 D7
3回連続で0を受信したとき スタートビット を受信と判定
D0を 受信
D1を 受信
D1を 受信
50MHzから 9600bpsよりも 4倍速いクロック(つまり, 38400Hz)を
生成するには
8
38400 Hz ということは, 1周期= 1 / 38400 = 0.0000260416 [sec]
38400Hz
ということは, 0.0000260416 / 2 = 0.0000130208 [sec] 毎に High と Low を切り替えればよい
50MHz 50 MHz ということは, 1周期= 1 / 50x106 = 0.02x10-6 [sec]
つまり, 0.0000130208 / (0.02 x 10-6) = 651.04 クロック毎に High と Lowを切り替えればよい (実際は651クロック毎に行う)
仕様 • PCから送信したデータをLEDGに表示
9
USBシリアルケーブル (BUFFALO社製) BSUSRC0605BS
を使用 (amazonで¥2011)
RS232C受信回路の状態遷移図 (ストップビットは受信していません…)
10
0000 0001 0010 0011
Reset LEDG <= 8'b0; clk_count <= 2'b0; catch_startbit <= 3'b111;
catch_startbit == 3'b000 NONE
0100
catch_startbit != 3'b000 NONE
1001 1000 0111 0110 0101
clk_count == 2'b11 clk_count <= 2'b00; LEDG[0] <= UART_RXD;
clk_count != 2'b11 clk_count <= clk_count + 1'b1;
clk_count == 2'b11 clk_count <= 2'b00; LEDG[1] <= UART_RXD;
clk_count == 2'b11 clk_count <= 2'b00; LEDG[2] <= UART_RXD;
clk_count != 2'b11 clk_count <= clk_count + 1'b1;
clk_count != 2'b11 clk_count <= clk_count + 1'b1;
clk_count != 2'b11 clk_count <= clk_count + 1'b1;
clk_count != 2'b11 clk_count <= clk_count + 1'b1;
clk_count != 2'b11 clk_count <= clk_count + 1'b1;
clk_count != 2'b11 clk_count <= clk_count + 1'b1;
clk_count != 2'b11 clk_count <= clk_count + 1'b1;
clk_count != 2'b11 clk_count <= clk_count + 1'b1;
clk_count == 2'b11 clk_count <= 2'b00; LEDG[3] <= UART_RXD;
clk_count == 2'b11 clk_count <= 2'b00; LEDG[4] <= UART_RXD;
clk_count == 2'b11 clk_count <= 2'b00; LEDG[5] <= UART_RXD;
clk_count == 2'b11 clk_count <= 2'b00; LEDG[6] <= UART_RXD;
clk_count == 2'b11 clk_count <= 2'b00; LEDG[7] <= UART_RXD;
clk_count == 2'b11 clk_count <= 2'b00;
11
• ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう! (DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_9_LEDG_Slide¥ 内にコピー
DE0_TOP.qpfをダブルクリックしてQuartus IIを起動
12
Pin Plannerを開いてみると ピン配置が終わっている!
Verilog-HDLを入力
13
ダブルクリック Verilog-HDLの テンプレートが 表示されるので コードを入力
コード入力したら保存を忘れずに!
38400Hz生成回路の追加
14
入力するVerilog-HDL
15
Verilog-HDLを保存する
16
Gen_CLK38400Hz.v として保存
RS232C受信回路の追加
17
入力する Verilog-HDL (1)
18
入力する Verilog-HDL (2)
19
入力する Verilog-HDL (3)
20
Verilog-HDLを保存する
21
RS232C_RX.v として保存
DE0_Top.vの記述
22
コンパイルを行う
23
「保存アイコン」を クリックして保存
「コンパイルアイコン」を クリックして コンパイルを行う
コンパイル後、このウインドウが 表示されればOK
FPGAとPCを接続する前に… • COMポート(RS232C)の番号を確認 • マイコンピュータを右クリックして「プロパティ」を選択 (Windowx XP)
24 このPCではCOM7ポート
FPGAをプログラム
25
RS232Cテストツールを起動 • VECTOR (http://www.vector.co.jp/soft/winnt/hardware/se411276.html)からダウンロードしてインストールしてください
26
ポート名 ↓ 各PC毎に 異なる
ボーレート: 9600, バイトサイズ: 8, パリティ: なし ストップビット: 1
PCとFPGAを RS232Cケーブルで接続
27
RS232C経由でデータ送信
28 3. 送信データ(A)のバイナリ値 →0x41 → 8'b0100 0001を受信
1. 送信TEXT: A, 送信データのバイナリ変換にチェックをつける
2. 接続をクリックし, TEXT送信をクリック
まとめ • RS232CケーブルをDE0ボードにとりつけ • RS232Cデータ受信回路を設計
• 課題: ‒ 他のボーレートに対応する受信回路を設計せよ (115200bps, 14400bps) ‒ パリティを計算する回路を付加した受信回路を設計せよ ‒ 【難】スライドスイッチでボーレートを切り替えることができる受信回路を設計せよ
29