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;
data: OUT BIT_VECTOR (6 DOWNTO 0); 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