Bộ nhận dữ liệu nối tiếp 12 6-

Một phần của tài liệu 221640 (Trang 127 - 129)

Sơ đồ khối của bộ nhận dữ liệu nối tiếp được chỉ ra trong hỡnh 9.13. Nú bao gồm một đầu vào dữ liệu nối tiếp (din) và một đầu ra dữ liệu song song (data(6:0)). Ngoài ra cũn cú tớn hiệu điều khiển clk (tớn hiệu clock). Hai tớn hiệu giỏm sỏt được tạo ra bởi mạch là: tớn hiệu err (error) và tớn hiệu data_valid. Đầu vào xử lý chứa 10 bớt. Bit đầu tiờn là bit bắt đầu, nếu bit là 1 thỡ mạch bắt đầu nhận dữ liệu. 7 bit tiếp theo là cỏc bit dữ liệu hoạt động. Bit thứ 9 là bit chẵn lẻ: bit này = „0‟ nếu số lượng cỏc bit 1 trong dữ liệu la chẵn và bằng „1‟ trong trường hợ cũn lại. Bit 10 là bit stop: bit này sẽ mang giỏ trị là 1 nếu quỏ trỡnh chuyển đổi là đỳng. Một lỗi được phỏt hiện khi bit chẵn lẻ khụng được kiểm tra hoặc bit stop khụng phải la „1‟. Khi quỏ trỡnh nhận kết thỳc mà khụng cú lỗi nào được phỏt hiện thỡ dữ liệu được lưu trữ trong cỏc thanh ghi bờn trong sẽ chuyển vào data(6:0) và đầu ra data_valid được xỏc nhận.

Hỡnh 9.13. Sơ đồ bộ nhận dữ liệu nối tiếp

Để thiết kế mạch này chỳng ta sẽ sử dụng một vài biến để làm cỏc biến đếm, biến xỏc nhận số bit nhận được, biến lưu trữ dữ liệu, biến tớnh toỏn lỗi và biến trung gian.

Mó thiết kế bộ nhận dữ liệu nối tiếp sẽ như sau:

--- LIBRARY ieee;

USE ieee.std_logic_1164.all;

--- ENTITY Bo_nhan_du_lieu_nt IS

PORT ( din, clk, rst: IN BIT;

err, data_valid: OUT BIT); END Bo_nhan_du_lieu_nt;

--- ARCHITECTURE arc OF Bo_nhan_du_lieu_nt IS BEGIN

PROCESS (rst, clk)

VARIABLE count: INTEGER RANGE 0 TO 10; VARIABLE reg: BIT_VECTOR (10 DOWNTO 0); VARIABLE temp : BIT;

BEGIN IF (rst='1') THEN count:=0; reg := (reg'RANGE => '0'); temp := '0'; err <= '0'; data_valid <= '0';

ELSIF (clk'EVENT AND clk='1') THEN IF (reg(0)='0' AND din='1') THEN

reg(0) := '1'; ELSIF (reg(0)='1') THEN

count := count + 1; IF (count < 10) THEN

reg(count) := din; ELSIF (count = 10) THEN

temp := (reg(1) XOR reg(2) XOR reg(3) XOR reg(4) XOR reg(5) XOR reg(6) XOR

reg(7) XOR reg(8)) OR NOT reg(9); err <= temp;

count := 0; reg(0) := din;

IF (temp = '0') THEN data_valid <= '1';

data <= reg(7 DOWNTO 1); END IF; END IF; END IF; END IF; END PROCESS; END arc; --- Kết quả mụ phỏng:

Hỡnh 9.14.Kết quả mụ phỏng bộ nhận dữ liệu

Một phần của tài liệu 221640 (Trang 127 - 129)