Trong chế độ đồng bộ, nơi phát có thể gửi xung đồng hồ tới nơi thu theo một kênh truyền song song vớikênh truyền dữ liệu hoặc nơi thu tự tạo ra xung đồng hồ bằng cách tách tín hiệu thờig
Trang 1ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG KHOA ĐIỆN TỬ-VIỄN THÔNG
BÁO CÁO ĐỒ ÁN CHUYÊN NGHÀNH
ĐỀ TÀI:
THIẾT KẾ BỘ TRUYỀN NHẬN UART 8 BIT NẠP TRÊN KIT FPGA
Sinh viên thực hiện : Đỗ Tiến Thành
Trang 2
LỜI CAM ĐOAN Tôi xin cam đoan nội dung của đồ án này không phải là bản sao chép của bất cứ đồ án nào đã có từ trước Nếu vi phạm tôi xin chịu mọi hình thức kỷ luật của Khoa Sinh viên thực hiện Đỗ Tiến Thành
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
Đà Nẵng, ngày tháng 1 năm 2014
GIÁO VIÊN HƯỚNG DẪN
(Ký tên)
LỜI MỞ ĐẦU
Ngày nay, trong các hệ thống truyền dữ liệu có hai cách đưa tín hiệu lên đường
Trang 3truyền: nối tiếp và song song Cách truyền song song thường được truyền trên mộtkhoảng cách ngắn, ví dụ giữa các thiết bị trong cùng một phòng như từ máy tính sangmáy in Cách truyền nối tiếp thường được thực hiện khi khoảng cách truyền khá xa.
Ngoài ra, trong cách truyền nối tiếp, dựa vào cách thực hiện sự đồng bộ giữa nơiphát và thu ta có hai chế độ hoạt động: đồng bộvà bất đồng bộ Trong chế độ bất đồng
bộ, xung đồng hồ được tạo ra một cách riêng rẻ ở máy phát và máy thu dựavào tần sốdanh định tương ứng với vận tốc truyền (bit rate hoặc baud rate) Trong chế độ đồng
bộ, nơi phát có thể gửi xung đồng hồ tới nơi thu theo một kênh truyền song song vớikênh truyền dữ liệu hoặc nơi thu tự tạo ra xung đồng hồ bằng cách tách tín hiệu thờigian từ dòng dữ liệu
Trong đồ án này, tôi xin được trình bày về chuẩn truyền thông nối tiếp không
đồng bộ UART (Universal Asynchronous Receiver Transmitter) Vì truyền thông nối
tiếp có các ưu điểm sau:
- Khoảng cách truyền xa hơn truyền song song
- Sốdây kết nối ít
- Có thể truyền không dây dùng hồng ngoại
- Có thể ghép nối với vi điều khiển hay PLC (Programmable Logic Device)
- Cho phép nối mạng
- Có thể tháo lắp trong lúc máy tính đang làm việc
Trang 4MỤC LỤC
LỜI CAM ĐOAN 2
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN 2
LỜI MỞ ĐẦU 3
MỤC LỤC 4
Chương 1 MÔ TẢ TỔNG QUAN VỀ GIAO TIẾP UART 6
1.1 Đặc trưng khung truyền 6
1.1.1 Bộ nhận dữ liệu 7
1.1.2 Bộ phát dữ liệu 8
1.1.3 Tốc độ Baud 8
Chương 2 PHÂN TÍCH TỔNG QUAN VÀ THIẾT KẾ CÁC KHỐI CHỨC NĂNG CỦA BỘ UART 10
2.2 Sơ đồ tín hiệu vào ra và sơ đồ chi tiết các khối thiết kế 12
2.2.2 Khối RECEIVER 16
2.2.3 Khối BAUD RATE 23
2.2.4 Khối CONTROL DISPLAY 26
Chương 3 KIỂM TRA THIẾT KẾ 29
3.1 Giải thích cách viết testbench mô phỏng: 29
3.2 Dạng sóng chạy mô phỏng: 29
3.2.2 Khối Baud rate: 31
3.2.3 Khối Transmitter: 31
3.2.4 Khối Receiver: 31
Chương 4 DEMO THỰC TẾ TRÊN KIT DE1 CỦA HÃNG ALTERA 33
4.1 Board mạch DE1 của hãng Altera 33
4.2 Demo thiết kế trên kit DE1 33
ĐÁNH GIÁ ĐỀ TÀI THIẾT KẾ 37
1 Thuận lợi 37
Trang 52 Khó khăn 37
3 Hướng phát triển của đề tài 37
Tài liệu tham khảo 37
PHỤ LỤC 38
Code Verilog HDL mô tả thiết kế 38
1 Code khối Transmitter 38
2 Code khối Receiver 40
3 Code khối Baud rate 44
4 Code khối Control_dislay 45
5 Kết nối các khối thành 1 file Core Uart 48
6 Code Testbecnh mô phỏng: 50
Trang 6Chương 1 MÔ TẢ TỔNG QUAN VỀ GIAO TIẾP UART
Truyền nối tiếp (serial transmission) các thông tin số hay bit thông qua một dâyđơn (single wire) hay một vật liệu trung gian nào đó thì tiết kiệm chi phí hơn nhiều sovới truyền song song dùng nhiều dây cùng một lúc Truyền dữ liệu dùng UART có thểthực hiện theo phương thức song công (full duplex) tức là việc gửi và nhận thực hiệncùng một lúc, hay bán song công (half duplex), tức là các thiết bị thay phiên nhau phát
và nhận
Bộ truyền UART phát từng bit trong byte dữ liệu một cách tuần tự Bộ thuUART chịu trách nhiệm lắp ghép các bit này lại thành các byte hoàn chỉnh Mỗi UARTgồm có hai thanh ghi dịch, được dùng làm thành phần cơ bản trong việc chuyển giữanối tiếp sang song song và ngược lại
1.1 Đ c tr ng khung truy n ặc trưng khung truyền ưng khung truyền ền
Hình 1.1 Định dạng khung truyền cơ bản
Mỗi ký tự được gửi sau một bit khởi tạo gọi là start bit ở mức logic thấp, số cácbit dữ liệu thường là 7 hay 8 đôi khi là 5, cũng có thể có thêm bit kiểm tra chẵn lẻ(parity bit) và một hay nhiều stop bit ở mức logic cao Start bit sẽ báo hiệu cho bộ thumột ký tự mới đang được gửi đi (hay nói đúng hơn là đang đến) Tiếp theo sau start bit,
bộ thu sẽ nhận từ 5 đến 8 bit dữ liệu, phụ thuộc vào tùy vào cấu hình sử dụng Theo saubit dữ liệu có thể là một bit kiểm tra chẵn lẻ và cuối cùng phải có ít nhất một stop bit ởmức cao báo hiệu quá trình truyền một ký tự đã kết thúc Bộ thu sẽ tiến hành xử lý các
Trang 7bit đã nhận và chờ start bit để nhận byte dữ liệu tiếp theo Bởi vì start bit luôn là mứclogic 0 trong khi stop bit ở mức logic 1 do đó không gây ra hiểu lầm giữa hai bit liêntiếp được truyền.
1.1.1 Bộ nhận dữ liệu
Hình 1.2 Bộ nhận dữ liệu
Tất cả các hoạt động của phần cứng UART đều được đồng bộ hay điều khiểnbởi một tín hiệu xung đồng hồ (clock) chạy với tốc độ bằng một số nhân nguyên nào
đó của tốc độ dữ liệu, ví dụ việc truyền hay nhận một bit dữ liệu sẽ kéo dài trong vòng
16 xung clock chẳng hạn Bộ thu sẽ kiểm tra trạng thái của tín hiệu được gửi đến tạimỗi xung đồng hồ (theo cạnh lên hay cạnh xuống) để xem khi nào xảy ra start bit Nếuthời gian của một start bit kéo dài ít nhất là một nửa thời gian của một bit dữ liệu, thì
nó được xem là hợp lệ và báo hiệu việc truyền một ký tự mới đang xảy ra
Nếu Start bit không đáp ứng yêu cầu, xung này xem như là xung sai (spuriouspulse) và bị bỏ qua Thời gian truyền một bit được giám sát và trạng thái của đườngtruyền được lấy mẫu tại điểm giữa mỗi bit Đồng thời tạo ra xung clock (cạnh lên hay
Trang 8xuống) cho phép dịch dữ liệu vào thanh ghi dịch (shift register) Sau khi kết thúc mộtkhung dữ liệu, nội dung của thanh ghi dịch đã được chuẩn bị sẵn sàng ở dạng songsong để gửi tới bộ xử lý dữ liệu trong hệ thống UART lúc này sẽ đặt một cờ (flag) đểbáo hiệu dữ liệu mới nhận đã sẵn sàng, hoặc nó cũng có thể tạo ra một ngắt (interrupt)
để yêu cầu bộ xử lý nhận dữ liệu vừa nhận được
Trong một vài kiểu UART, một bộ nhớ đệm nhỏ kiểu FIFO (First In First Out)được đặt giữa thanh ghi dịch của bộ thu và bộ xử lý, việc làm này cho phép bộ xử lý cónhiều thời gian hơn để thao tác trên dữ liệu nhằm hạn chế việc mất dữ liệu trong trườnghợp tốc độ xử lý của bộ xử lý chậm hơn quá trình nhận dữ liệu
Trang 9Bởi việc truyền một khung dữ liệu có thể tương đối lâu so với tốc độ của bộ xử
lý, nên UART sẽ duy trì một cờ báo hiệu trạng thái bận để hệ thống không ghi byte dữliệu mới vào cho đến khi dữ liệu tại đã được truyền xong, việc báo hiệu này có thể thựchiện thông qua một ngắt
có độ dài 7 bit phải cần đến ít nhất 9 bit hoặc 10 bit (nếu có bit kiểm tra chẵn lẻ) đểtruyền Do đó, một modem có khả năng phát 300 bit trên giây từ nơi này sang nơi khácthì có thể truyền 30 khung dữ liệu 7 bit nếu có dùng bit kiểm tra chẵn lẻ, 1 stop bit và 1start bit Như vậy, số bit dữ liệu thực sự trong một giây của modem là 210 bit, số bitđược chèn thêm là 90 bit
Trang 10Chương 2 PHÂN TÍCH TỔNG QUAN VÀ THIẾT KẾ CÁC KHỐI CHỨC NĂNG CỦA BỘ UART
Thiết kế một bộ truyền bất đồng bộ theo chuẩn UART thử nghiệm trên KIT FPGA Cụ thể, thiết kế bộ truyền nối tiếp theo chuẩn UART (Universal Asynchronous Receiver Transmitter) có các đặc điểm như sau: Cấu hình được tốc độ BAUD (tốc độ truyền dữ liệu) theo công thức :
fbaud = fosc/((BRG + 1)x16)
Trong đó: fbaud là tốc độ BAUD cần cấu hình, BRG là thanh ghi thiết lập tốc
độ baud có độ rộng 8 bit, fosc là tần số xung clock trong mạch.
Khung dữ liệu gồm: 1 start bit, 8 bit dữ liệu, 1 stop bit 8 bit dữ liệu cần truyền
có giá trị từ H00 đến HFF sẽ được chuyển đổi dạng mã ASCII trước khi truyền đi Vídụ: Dữ liệu cần truyền là: H85 sẽ được đổi thành H38 (là mã ASCII của số 8) và
Trang 11H35(là mã ASCII của số 5) Sau đó hai giá trị H38 và H35 sẽ được truyền đi quađường truyền nối tiếp.
2.1 Những yêu cầu của thiết kế :
- Tốc độ baud được chọn cố định trước khi tổng hợp thông qua biến BRG
- Khung dữ liệu gồm 1 bit start, 8 bit dữ liệu, 1 bit stop
- Truyền nhận song công (Dữ liệu được truyền đồng thời theo 2 hướng)
Hình 2.1 Truyền nhận song công
Sơ đồ khối tổng quát: Thiết kế có 4 khối cơ bản như sau
Trang 12CONTROL DISPLAY
TRANSMITTER
BAUD RATE
RECEIVER
tx_in
uart_tx data_in[7:0]
Lõi UART-FPGA gồm các khối chính như sau:
Khối truyền nối tiếp (TRANSMITTER): Nhận dữ liệu từ ngõ vào data_in và
phát đi dựa trên tốc độ baud đã được tính trong khối BAUD RATE
Trang 13Khối nhận dữ liệu nối tiếp (RECEIVER): Phát hiện, lấy mẫu và lưu trữ dữ liệu
nhận nối tiếp từ chân RX của UART ngoài thông qua tín hiệu uart_rx với tốc độ baud
đã được tính ở khối BAUD RATE Khối này có thêm bộ đệm FIFO 8 tầng để lưu tạm
dữ liệu và tránh mất mát dữ liệu
Khối tạo tốc độ truyền (BAUD RATE): Dựa vào thông số tốc độ truyền được
cấu hình, khối này sẽ tính toán và tạo xung nhịp truyền dữ liệu khi phát và lấy mẫu dữliệu khi nhận
Khối điều khiển và hiển thị (CONTROL DISPLAY): tiếp nhận tín hiệu điều
khiển tx_in để tạo ra tín hiệu cho phép khối truyền dữ liệu của UART hoạt động Đồngthời nhận các giá trị dữ liệu từ khối nhận dữ liệu của UART để giải mã LED 7 đoạn vàhiển thị kết quả
Bốn khối trên sẽ được kết nối với nhau thành một thiết kế hoàn chỉnh ở file
brg_tx_clken
uart_tx
*Chức năng các tín hiệu:
Trang 14Tên tín hiệu Chiều Mô tả
khi bộ truyền hoạt động
ra cổng RS232
*Máy trạng thái của bộ truyền dữ liệu:
IDLE
SHIFT_DATA LOAD_TXS
Trang 15tại tiếp
IDLE
Trạng thái rảnh khi bộ truyền không hoạt động
LOAD_TXS
Trạng thái nạp dữliệu vào thanh ghidịch
SHIFT_DATA
SHIFT_DATA
Trạng thái truyền từng bit dữ liệu
Trang 16Bộ đếm để tạo tín hiệu tx_count[3:0], cứ khi nào dịch được 1 bit trong thanh ghitsr[9:0] thì giá trị bộ đếm tăng lên 1 Khi tx_count = “1001” thì dữ liệu đã được truyềnxong.
MUX
0
1 MUX
tsr[0]
shift uart_en
brg_tx_clken clk
clk FF
FF
Khối gồm các cổng logic: cổng AND4 để tạo tín hiệu shift_en cho phép dịch,các bộ so sánh để tạo các tín hiệu tương ứng, bộ MUX để chọn các tín hiệu ngõ vàodựa vào 2 tín hiệu shift_en và load_data, các DFF để tạo các thanh ghi tsr[9:0] vào tínhiệu uart_tx
Khối tạo thanh ghi dịch tsr 10 bit {gồm 1 bit start, 8 bit data_in, 1 bit stop) , khi
có xung brg_tx_clken và đủ các điều kiện như mô tả ở máy trạng thái thì dữ liệu trongthanh ghi sẽ được dịch đến ngõ ra nối tiếp uart_tx của tín hiệu truyền cho tới khi truyềnhết 8 bit data_in
Trang 17*Chức năng các tín hiệu:
rc_data[7:0] output Dữ liệu nhận được của khối
RECEIVER
dữ liệu vào FIFO nữa
Trang 18fifo_empty output Cờ báo FIFO trống,có thể ghi được
dữ liệu vào FIFO
*Máy trạng thái của bộ nhận dữ liệu:
CHECK_START_BIT
Trạng thái lấy mẫu và kiểm tra bit start
Trang 19mẫu các bit trên đường nhận dữ liệu nối tiếp
*Sơ đồ chi tiết khối RECEIVER:
Mạch đếm xung lấy mẫu:
0000
1x 01 00
=
? state
Mạch gồm các bộ so sánh bằng để tạo các tín hiệu tương ứng trên hình vẽ, cáccổng OR2, AND2 để tạo tín hiệu inc_samp_count, bộ MUX để chọn các ngõ vào dựavào 2 tín hiệu inc_samp_count và clr_samp_count, thanh ghi DFF để tạo tín hiệusamp_count[3:0]
Giá trị bộ đếm samp_count[3:0] sẽ tăng lên 1 khi các điều kiện của bộ MUXđược thỏa mãn
Mạch đếm số bit nhận được:
Trang 20clr_rx_coun t
AND3
fsm_receive brg_rx_clken sample_point
inc_rx_count
=
? samp_count[3:0]
0111
=
? rx_bitcount[3:0]
1001
set_comp
clk FF
Mạch gồm các bộ so sánh bằng để tạo các tín hiệu tương ứng trên hình vẽ, cỏngAND3 để tạo tín hiệu inc_rx_count, bộ MUX để chọn các ngõ vào dựa vào 2 tín hiệuinc_rx_count và set_comp, thanh ghi DFF để tạo tín hiệu rx_bitcount[3:0]
Khi nhận được 1 bit thì rx_bitcount[3:0] sẽ tăng lên 1 Khi đã nhận đủ 10 bit củathanh ghi dịch tsr[9:0] thì bộ đếm sẽ được reset nhờ tín hiệu clr_rx_count
Mạch tạo thanh ghi dịch bên bộ nhận:
MUX 1
Trang 21Mạch gồm bộ MUX để chọn các ngõ vào dựa vào tín hiệu inc_rx_count, thanhghi DFF để tạo tín hiệu rsr[7:0]
Tạo thanh ghi dịch 8 bit rsr[7:0] để nhận 8 bit data_in từ thanh ghi dịch tsr[9:0]bên khối truyền.Khi có tín hiệu cho phép dịch inc_rx_count thì dữ liệu trong thanh ghi
sẽ được dịch qua phải 1 bit để đưa vào FIFO nhận
Mạch bắt cạnh tín hiệu cho phép FIFO nhận:
fifo _rd_sync fifo _rd
uart_rx uart_rx_sync uart_rx_sync_2
FF FF
Việc nhấn và giữ một nút (KEY) sẽ tạo ra mức logic 1 kéo dài trong nhiều xungclock hê thống
Trang 22Nếu ta đưa trực tiếp tín hiệu fifo_rd vào để xét điều kiện đọc FIFO thì sẽkhông chính xác và không kiểm soát được số lần đọc Để một lần nhấn núttương ứng với một byte dữ liệu được đọc đi thì ta phải tạo ra tín hiệu cho phépchỉ tích cực trong đúng một chu kỳ của xung clock hệ thống Mạch trên đây sẽthực hiện điều đó.
6 7
0 1
6 7
set_comp
Trang 23Khi FIFO chưa Full,dữ liệu từ thanh ghi rsr[7:0] sẽ được ghi vào FIFO nhờ contrỏ cho phép ghi wptr[3:0] và tín hiệu fifo_we.
Dữ liệu đọc ra thanh ghi rc_data[7:0] chính là dữ liệu nhận được để hiển thị trênLED 7 đoạn Con trỏ cho phép đọc rptr[3:0] sẽ cho phép đọc dữ liệu ra từ FIFO
Mạch tạo ra con trỏ dữ liệu wptr[3:0] và rptr[3:0] :
MUX 1
0
MUX 1
0
AND3 fifo _we
fifo _re uart_en
fifo _empty fifo _rd_enable
Mạch tạo các cờ báo trạng thái của FIFO:
Trang 24Khi con trỏ wptr[2:0] = rptr[2:0] và bit có trọng số cao nhất wptr[3] khác rptr[3]thì tín hiệu fifo_full = 1 ,cờ này báo hiệu FIFO đầy, không thể ghi thêm dữ liệu vàoFIFO.
Khi con trỏ wptr[2:0] = rptr[2:0] và bit có trọng số cao nhất wptr[3] giốngrptr[3] thì tín hiệu fifo_empty = 1 ,cờ này báo hiệu FIFO chưa đầy, có thể ghi thêm dữliệu vào FIFO
2.2.3 Khối BAUD RATE
*Sơ đồ tín hiệu giao tiếp
BAUD RATE
BAUD RATE
clk reset_n
bit dữ liệu khi bộ truyền hoạt động
vị trí lấy mẫu dữ liệu
Trang 25Mô tả xung truyền và xung nhận :
Tốc độ baud được chọn gán trước khi tổng hợp thông qua biến BRG theo côngthức sau:
fbaud = fosc/((BRG + 1)x16)
fbaud tính theo đơn vị bps, fosc là tần số xung clock
Xung Tx cho phép bắt đầu truyền 1 bit dữ liệu(Data) bên phát, ở bên thu khinhận được 1 bit dữ liệu thì cũng có 1 xung Rx được lấy mẫu ở giữa bit dữ liệu
Khoảng thời gian lấy mẫu của Tx và Rx là 16x(n+1) xung CLOCK, với n làtham số nạp vào để cấu hình cho tốc độ Baud
*Sơ đồ chi tiết khối BAUD RATE:
Mạch tạo xung truyền :
Trang 26? x16
Khi có tín hiệu uart_en = 1, thì BRG sẽ được nạp vào ,bộ đếm sẽ bắt đầu đếm từ
0 cho tới khi tx_counter[15:0] = {16x(BRG + 1) -1} thì brg_tx_clken = 1
Mạch gồm bộ cộng để tăng giá trị đếm lên 1, cổng AND2, các bộ MUX để chọncác giá trị ngõ vào khác nhau, bộ so sánh bằng, thanh ghi DFF để tạo tín hiệurx_count[11:0]
Trang 27Khi có tín hiệu uart_en = 1, thì BRG sẽ được nạp vào ,bộ đếm sẽ bắt đầu đếm từ
0 cho tới khi rx_counter[11:0] = BRG thì brg_rx_clken = 1
2.2.4 Khối CONTROL DISPLAY
*Sơ đồ tín hiệu giao tiếp
CONTOL DISPLAY
CONTROL DISPLAY
clk reset_n uart_en tx_in rc_data[7:0]
*Chức năng các tín hiệu:
Trang 28tx_in input Cho phép ghi dữ liệu từ bus data_in vào
thấp trong Byte dữ liệu nhận được
trong Byte dữ liệu nhận được
bộ gán ra cổng RS232
*Sơ đồ chi tiết khối CONTROL DISPLAY
Mạch giải mã LED 7 đoạn cho dữ liệu nhận hiện tại:
Trang 29
rc_data[3:0]
rc_data_hex0[3:0]
0 1 2 3 4 5 6 7 8 9 a b c d e f
Hex0[6:0]
rc_data[7:4]
rc_data_hex1[3:0]
0 1 2 3 4 5 6 7 8 9 a b c d e f
Hex1[6:0]
0000001 1001111 0010010 0000110 1001100 0100100 0100000 0001111 0000000 0000100 0001000 1100000 0110001 1000010 0110000 0111000
Chức năng: giải mã 4 bit của rc_data thành 7 bit để hiện thị trên LED 7 đoạn
Mạch tạo tín hiệu cho phép truyền :
Trang 30tx_in tx_in_sync
tx_enable tx_in_sync_2
Dạng sóng mô phỏng :
Sau 2 chu kì của tín hiệu tx_in thì phát hiện được cạnh của tx_enable