verilog-hdl tutorial (12)

29
1 Verilog-HDL 講習会DE0編(12) RS232C受信(Rx) 31, July, 2013 鹿児島大学 中原 啓貴

Upload: hiroki-nakahara

Post on 07-Aug-2015

110 views

Category:

Education


5 download

TRANSCRIPT

Page 1: Verilog-HDL Tutorial (12)

1

Verilog-HDL 講習会DE0編(12) RS232C受信(Rx)

31, July, 2013 鹿児島大学 中原 啓貴

Page 2: Verilog-HDL Tutorial (12)

UARTとは •  シリアルポートに外部機器を接続して行う通信 •  1ビットずつ逐次データ転送 ‒  3本の信号線を使用: グランド(GND), 送信 (TX), 受信 (RX)

•  同期をとるために予め以下の項目を決めておく ‒  ボーレート: 1秒当りの転送ビット数 ‒  データ長 ‒  パリティの有無: ありの場合は奇数か偶数かを設定 ‒  ストップビットの長さ

•  データそのものに同期用信号を持ち, 送受信側双方で同期をとる通信方法を調歩同期式 (別名, 非同期式: Asynchronous Communication)という

•  調歩同期式でシリアルデータとパラレルデータを相互に変換する回路を汎用非同期送受信回路 (UART: Universal Asynchronous Receiver Transmitter)という 2

Page 3: Verilog-HDL Tutorial (12)

RS232C通信とは

3

•  よく使われているUARTの一種 •  今回は3本線通信を実装しよう

Page 4: Verilog-HDL Tutorial (12)

準備 •  DE0ボードにはRS232Cコネクタを取り付けるパターンが設計済み ‒  レベル(電圧)変換IC(ADM3202)も取り付け済み

4

Page 5: Verilog-HDL Tutorial (12)

RS232Cコネクタを半田付け

5

5 4 3 2 1

9 8 7 6 1 2 3 4 5

6 7 8 9

RS232Cコネクタ(メス)に ハンダ付け. 表と裏のピン番号に 気をつけること!

表 裏

Page 6: Verilog-HDL Tutorial (12)

RS232C信号を受信 (今回は9600 bpsとする)

6

スタートビット (1ビットの0)

データ(8ビット) LSB(最下位ビット)から送信

ストップビット (1ビットの1)

D0 D1 D2 D3 D7

9600 bps = 9600 bit per second つまり, 1秒間に(スタートビットや ストップビットも含めて) 9600bit送信するという意味

Page 7: Verilog-HDL Tutorial (12)

RS232C受信方法 •  4倍速いクロックでスタートビットを検出 ‒  9600bpsと等速→データ間を上手く切り替えられない ‒  速すぎるクロック→信号の変化を受信してしまう

•  4クロック毎に受信

7

スタートビット (1ビットの0)

データ(8ビット) LSB(最下位ビット)から送信

ストップビット (1ビットの1)

D0 D1 D2 D3 D7

3回連続で0を受信したとき スタートビット を受信と判定

D0を 受信

D1を 受信

D1を 受信

Page 8: Verilog-HDL Tutorial (12)

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クロック毎に行う)

Page 9: Verilog-HDL Tutorial (12)

仕様 •  PCから送信したデータをLEDGに表示

9

USBシリアルケーブル (BUFFALO社製) BSUSRC0605BS

を使用 (amazonで¥2011)

Page 10: Verilog-HDL Tutorial (12)

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;

Page 11: Verilog-HDL Tutorial (12)

11

•  ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう! (DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)

DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_9_LEDG_Slide¥ 内にコピー

Page 12: Verilog-HDL Tutorial (12)

DE0_TOP.qpfをダブルクリックしてQuartus IIを起動

12

Pin Plannerを開いてみると ピン配置が終わっている!

Page 13: Verilog-HDL Tutorial (12)

Verilog-HDLを入力

13

ダブルクリック Verilog-HDLの テンプレートが 表示されるので コードを入力

コード入力したら保存を忘れずに!

Page 14: Verilog-HDL Tutorial (12)

38400Hz生成回路の追加

14

Page 15: Verilog-HDL Tutorial (12)

入力するVerilog-HDL

15

Page 16: Verilog-HDL Tutorial (12)

Verilog-HDLを保存する

16

Gen_CLK38400Hz.v として保存

Page 17: Verilog-HDL Tutorial (12)

RS232C受信回路の追加

17

Page 18: Verilog-HDL Tutorial (12)

入力する Verilog-HDL (1)

18

Page 19: Verilog-HDL Tutorial (12)

入力する Verilog-HDL (2)

19

Page 20: Verilog-HDL Tutorial (12)

入力する Verilog-HDL (3)

20

Page 21: Verilog-HDL Tutorial (12)

Verilog-HDLを保存する

21

RS232C_RX.v として保存

Page 22: Verilog-HDL Tutorial (12)

DE0_Top.vの記述

22

Page 23: Verilog-HDL Tutorial (12)

コンパイルを行う

23

「保存アイコン」を クリックして保存

「コンパイルアイコン」を クリックして コンパイルを行う

コンパイル後、このウインドウが 表示されればOK

Page 24: Verilog-HDL Tutorial (12)

FPGAとPCを接続する前に… •  COMポート(RS232C)の番号を確認 •  マイコンピュータを右クリックして「プロパティ」を選択 (Windowx XP)

24 このPCではCOM7ポート

Page 25: Verilog-HDL Tutorial (12)

FPGAをプログラム

25

Page 26: Verilog-HDL Tutorial (12)

RS232Cテストツールを起動 •  VECTOR (http://www.vector.co.jp/soft/winnt/hardware/se411276.html)からダウンロードしてインストールしてください

26

ポート名 ↓ 各PC毎に 異なる

ボーレート: 9600, バイトサイズ: 8, パリティ: なし ストップビット: 1

Page 27: Verilog-HDL Tutorial (12)

PCとFPGAを RS232Cケーブルで接続

27

Page 28: Verilog-HDL Tutorial (12)

RS232C経由でデータ送信

28 3. 送信データ(A)のバイナリ値 →0x41 → 8'b0100 0001を受信

1. 送信TEXT: A, 送信データのバイナリ変換にチェックをつける

2. 接続をクリックし, TEXT送信をクリック

Page 29: Verilog-HDL Tutorial (12)

まとめ •  RS232CケーブルをDE0ボードにとりつけ •  RS232Cデータ受信回路を設計

•  課題: ‒ 他のボーレートに対応する受信回路を設計せよ (115200bps, 14400bps) ‒ パリティを計算する回路を付加した受信回路を設計せよ ‒ 【難】スライドスイッチでボーレートを切り替えることができる受信回路を設計せよ

29