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

Một phần của tài liệu Ngôn ngữ mô tả phần cứng với VHDL (Trang 135 - 137)

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 nhn d liu ni 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ô phng b nhn d liu

Một phần của tài liệu Ngôn ngữ mô tả phần cứng với VHDL (Trang 135 - 137)

Tải bản đầy đủ (PDF)

(150 trang)