Thiết kế bộ truyền nhận UART
Trang 1BÁO CÁO BÀI TẬP CHUYÊN ĐỀ (KTĐT)
Đề tài: Thiết kế bộ truyền nhận UART
GVHD: Huỳnh Việt Thắng Nhóm: 7
Trang 21 Kiến thức cơ bản về UART:
- UART (Universal Asynchronous Receiver Transmitter) gọi là bộ thu phát dữ liệu không đồng bộ nối tiếp UART được sử dụng phổ biến để giao tiếp giữa các thiết
bị khác nhau.
- UART có nhiệm vụ chuyển đổi 1 byte (8 bit) dữ liệu từ song song sang nối tiếp
và thêm vào các bit start, stop để tạo thành khung truyền truyền đi.
- Bộ phát UART được điều khiển việc truyền tải dữ liệu bằng một xung clock gọi
là tốc độ baud.
Hình 1: Khung truyền UART
- Dữ liệu được gởi đi không đồng bộ xung clock nên giữa bộ truyền và bộ nhận cần có một sự thống nhất với nhau Vì vậy, khi bộ truyền truyền một khung dữ liệu (frame), bộ nhận sẽ lấy mẫu các tín hiệu đó và sau đó tập hợp và khôi phục lại tín hiệu gốc.
- Cơ chế này được minh họa ở hình 2, một bit thông tin được chia thành 16 điểm lấy mẫu Vì xác suất lỗi ở vị trí mẫu đầu và mẫu cuối là cao nhất còn xác suất lỗi ở vị trí giữa là thấp nhất nên ta chọn điểm lấy mẫu ở giữa.
Hình 2: Cơ chế lấy mẫu nhận dữ liệu
Trang 3 Từ những kiến thức ở trên và yêu cầu của đề bài, ta thiết kế một bộ vừa truyền vừa nhận UART, hiển thị ngay ra giá trị vừa truyền đi.
2 Thiết kế:
2.1 Sơ đồ khối của thiết kế:
Hình 3: Sơ đồ khối của thiết kế
- Trong đó:
• Khối điều khiển CONTROL: tiếp nhận tín hiệu điều khiển tx_in để tạo tín hiệu cho phép khối truyền UART hoạt động Đồng thời nhận các giá trị dữ liệu từ rev_data để hiển thị ra led đơn.
• Khối tạo tốc độ truyền BAUD_RATE: dựa vào tần số clock của hệ thống, khối này sẽ tính toán và tạo xung nhịp truyền dữ liệu khi truyền và lấy mẫu dữ liệu khi nhận.
• Khối truyền nối tiếp UART_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 toán trong khối BAUD_RATE.
• Khối nhận nối tiếp UART_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 uart_rx với tốc độ baud đã được tính toán ở khối BAUD_RATE.
Trang 42.2 Máy trạng thái hữu hạn:
- Máy trạng thái hữu hạn của bộ truyền:
reset=’0’ or uart_en=0’
Idle tx_enable=’1’ tx_count=”1001”
and tx_clken
Hình 4: Máy trạng thái hữu hạn của bộ truyền
- Trong đó:
• reset: tín hiệu reset hệ thống.
• uart_en: tín hiệu cho phép hệ thống làm việc.
• tx_enable: tín hiệu cho phép bộ truyền làm việc.
• tx_count: tín hiệu đếm số bit được truyền đi.
• tx_clken: xung cho phép dịch từng bit dữ liệu khi bộ truyền hoạt động.
Trạng thái hiện tại Mô tả Điều kiện Trạng thái kế tiếp Idle Trạng thái ban đầu khi bộ
truyền không hoạt động
tx_enable Load_txs
Load_txs Trạng thái nạp dữ liệu
vào thanh ghi dịch truyền
Trang 5- Máy trạng thái hữu hạn của bộ nhận:
reset=’0’ or uart_en=’0’
uart_rx_sync=’0’ rx_count=”1010”
uart_rx_sync=’1’
and samp_count=”0111”
uart_rx_sync=’0’ and samp_count=”0111”
Hình 5: Máy trạng thái hữu hạn của bộ nhận
- Trong đó:
• Reset: tín hiệu reset hệ thống.
• Uart_en: tín hiệu cho phép hệ thống làm việc.
• Uart_rx_sync: tín hiệu lấy mẫu đọc được.
• Samp_count: tín hiệu đếm số lần lấy mẫu trong từng xung vào.
• Rx_count: tín hiệu đếm xung vào.
Trạng thái hiện tại Mô tả Điều kiện Trạng thái kế tiếp Idle Trạng thái ban đầu khi
bộ nhận không hoạt động
uart_rx_sync=’0’ Check_start_bit samp_count=”0111”
Idle
Check_start_
bit
Receive_dat a
Trang 6kiểm tra bit start và uart_rx_sync=’1’
samp_count=”0111”
và uart_rx_sync=’0’ Receive_data Receive_data Trạng thái lấy mẫu các
bit dữ liệu trên đường nhận
Uncomment the following library declaration if using
arithmetic functions with Signed or Unsigned values
Trang 7entity baud_rate is
port (
clk : in std_logic; clock dong bo he thongreset : in std_logic; reset he thong Tich cuc muc thapuart_en : in std_logic; cho phep he thong lam viec Tich cuc muc cao
tx_clken : out std_logic; xung cho phep dich tung bit
du lieu khi bo truyen hoat dong
rx_clken : out std_logic xung cho phep xac dinh vi tri lay mau du lieu o bo nhan
);
end baud_rate;
architecture Behavioral of baud_rate is
signal tx_count: std_logic_vector(13 downto 0);
signal rx_count: std_logic_vector(9 downto 0);
signal tx_clken_temp: std_logic;
signal rx_clken_temp: std_logic;
constant temp: integer:=324; 9600=fo/((324+1)*16 - 1), fo=50 MHz
Trang 8end if;
end if;
end process;
Trang 9process (rx_count, rx_clken_temp)
Uncomment the following library declaration if using
arithmetic functions with Signed or Unsigned values
Trang 10entity control is
port(
clk : in std_logic; clock dong bo he thongreset : in std_logic; reset he thong Tich cuc muc thapuart_en : in std_logic; cho phep he thong lam viec Tich cuc muc cao
tx_in : in std_logic; cho phep ghi du lieu tu data_in vao bo truyen Tich cuc muc cao
rev_data : in std_logic_vector(7 downto 0); du lieu nhan duoc
led_0 : out std_logic_vector(3 downto 0); gia tri nhan duoc xuat ra led don
led_1 : out std_logic_vector(3 downto 0); gia tri nhan duoc xuat ra led don
tx_en : out std_logic tin hieu cho phep bo truyen hoat dong
);
end control;
architecture Behavioral of control is
khai bao cac tin hieu
signal data_led_0: std_logic_vector(3 downto 0);
signal data_led_1: std_logic_vector(3 downto 0);
signal tx_in_sync: std_logic;
begin
process (rev_data)
gan gia tri cho led don
begin
data_led_0 <= rev_data(3 downto 0);
data_led_1 <= rev_data(7 downto 4);
Trang 11end process;
led_0 <= data_led_0;
led_1 <= data_led_1;
process (clk, reset, uart_en, tx_in, tx_in_sync)
tao tin hieu cho phep truyen
Uncomment the following library declaration if using
arithmetic functions with Signed or Unsigned values
Trang 12use IEEE.NUMERIC_STD.ALL;
Uncomment the following library declaration if instantiating
any Xilinx primitives in this code
data_in : in std_logic_vector(7 downto 0); 8 bit du lieu ngo vao
tx_enable : in std_logic; tin hieu cho phep bo truyen hoat dong
tx_clken : in std_logic; xung cho phep dich tung bit
du lieu khi bo truyen hoat dong
uart_tx : out std_logic duong truyen du lieu dong bo
);
end uart_transmitter;
architecture Behavioral of uart_transmitter is
signal state: std_logic_vector(1 downto 0);
constant idle: std_logic_vector(1 downto 0):= "00";
constant load_txs: std_logic_vector(1 downto 0):= "01";
constant shift_data: std_logic_vector(1 downto 0):= "10";
Trang 13signal tsr: std_logic_vector(9 downto 0);
signal tx_count: std_logic_vector(3 downto 0);
Trang 14dau ra may trang thai huu han
tx_count <= tx_count + 1; bo dem truyen
end if;
when others =>
tsr <= "0000000000";
uart_tx <= '1';
Trang 15Uncomment the following library declaration if using
arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;
Uncomment the following library declaration if instantiating
any Xilinx primitives in this code
Trang 16rx_clken : in std_logic; xung cho phep xac dinh vi tri lay mau du lieu o bo nhan
uart_rx : in std_logic; duong nhan du lieu dong bo
rev_data : out std_logic_vector(7 downto 0) du lieu nhan duoc
);
end uart_receiver;
architecture Behavioral of uart_receiver is
signal rx_count: std_logic_vector(3 downto 0); tin hieu dem xung vao
signal samp_count: std_logic_vector(3 downto 0); tin hieu dem so lan de lay mau trong tung xung vao
signal uart_rx_sync: std_logic; tin hieu lay mau doc duocsignal rsr: std_logic_vector(7 downto 0);
signal state: std_logic_vector(1 downto 0);
constant idle: std_logic_vector(1 downto 0):= "00";
constant check_start_bit: std_logic_vector(1 downto 0):= "01";constant receive_data: std_logic_vector(1 downto 0):= "10";
Trang 19rx_count <= rx_count + 1;
if(rx_count<"1001") then chi dem den xung thu 9, loai bo bit start va stop ra du lieu nhan duoc
rsr <= (uart_rx_sync & rsr(7 downto 1)); dich du lieu
Uncomment the following library declaration if using
arithmetic functions with Signed or Unsigned values
USE ieee.numeric_std.ALL;
Trang 20ENTITY test_uart IS
END test_uart;
ARCHITECTURE behavior OF test_uart IS
Component Declaration for the Unit Under Test (UUT)
COMPONENT full_uart
PORT(
clk : IN std_logic; clock dong bo he thong
reset : IN std_logic; reset he thong Tich cuc muc thap uart_en : IN std_logic; cho phep he thong lam viec Tich cuc muc cao
data_in : IN std_logic_vector(7 downto 0); 8 bit du lieu ngo vao
tx_in : IN std_logic; cho phep ghi du lieu tu data_in vao bo truyen Tich cuc muc cao
uart_rx : IN std_logic; duong nhan du lieu dong bo
led_0 : OUT std_logic_vector(3 downto 0); gia tri nhan duoc xuat ra led don
led_1 : OUT std_logic_vector(3 downto 0); gia tri nhan duoc xuat ra led don
uart_tx : OUT std_logic duong truyen du lieu dong bo
Trang 21signal reset : std_logic := '0';
signal uart_en : std_logic := '0';
signal data_in : std_logic_vector(7 downto 0) := (others => '0'); signal tx_in : std_logic := '0';
signal uart_rx : std_logic := '0';
Outputs
signal led_0 : std_logic_vector(3 downto 0);
signal led_1 : std_logic_vector(3 downto 0);
signal uart_tx : std_logic;
Clock period definitions
chu ky = 20 ns, f = 50 MHz
baud_rate = 9600 => t_data = 104200 ns
constant clk_period : time := 20 ns;
constant t_data: time := 104200 ns;
BEGIN
Instantiate the Unit Under Test (UUT)
uut: full_uart PORT MAP (
Trang 22tao du lieu vao
tx_in <= '1'; cho phep bo truyen hoat dong
wait for 20 ps;
reset <= '1';
uart_en <= '1';
Trang 23wait for t_data;
Trang 24Hình 6: thời điểm uart_tx nhận giá trị bit start và ghi vào trong bit MSB của led_1
Hình 7: thời điểm uart_tx nhận giá trị bit LSB của data_in và tiếp tục ghi vào led_1
Trang 25Hình 8: thời điểm uart_tx nhận giá trị bit thứ 2 của data_in và ghi vào led_1
Hình 9: quá trình truyền nhận kết thúc, 4 bit cao của data_in được ghi vào
led_1 và 4 bit thấp của data_in được ghi vào led_0