Tài liệu Tìm hiểu về VHDL - Chương 9 Bài tập tham khảo

9.5. Bộ điều khiển máy bán hàng.

Trong ví dụ này, chúng ta sẽ thiết kế bộ điều khiển máy bán hàng, máy

bán hàng sẽ bán các thanh kẹo với giá 25 xu. Chúng ta sẽ thiết kế theo mô hình

máy FSM. Đầu ra và đầu vào của bộ điều khiển được thể hiện trong hình 9.11.

Tín hiệu vào là nickel_in, dime_in, và quarter_in thông báo rằng một

đồng tiền tương ứng được gửi vào tài khoản. Ngoài ra còn có 2 đầu vào điều

khiển: đầu vào reset (rst) và đầu vào clock (clk). Bộ điều khiển trả lời bằng 3

tín hiệu đầu ra: candy_out (để phân phát thanh kẹo), nickel_out và

dime_out(cập nhật lại thay đổi).

Trên hình 9.11 cũng chỉ ra đồ hình trạng thái của máy FSM. Các số bên

trong các vòng tròn biểu diễn tổng tài khoản của khách hàng (chỉ có các nickel,

dime và quarter là được chấp nhận)

Trạng thái 0 là trạng thái là trạng thái không làm gì cả. Từ đó nếu 1

đồng nickel được gửi vào tài khoản, máy sẽ chuyển trạng thái đến trạng thái 5,

nếu 1 đồng dime được gửi vào tài khoản thì máy chuyển tới trạng thái 10 hoặc

nếu 1 đồng quarter thì máy sẽ chuyển đến trạng thái 25. Tình huống tương tự sẽ

được lặp lại cho tất cả các trạng thái, cho tới trạng thai 20. Nếu trạng thái 25

được xác nhận, thì thanh kẹo được phân phát và không chuyển đổi. Tuy nhiên

nếu trạng thái 40 được xác nhận thì a nickel được trả lại, bởi vậy trạng thái sẽ

chuyển tới trạng thái 35, đó là 1 trạng thái mà 1 dime được trả lại và 1 candy

bar được phân phát. Có 3 trạng thái tạo ra chu trình kép, đó là từ 1 thanh kẹo

được phân phát và máy trở lại trạng thái 0. Bài toán này sẽ được chia thành 2

phần:

+ Trong phần đầu: diện mạo cơ bản liên quan đến thiết kế bộ điều khiển

máy bán hàng (như trong hình 9.11) .

+ Trong phần 2: Các chức năng mở rộng được thêm vào.

Ở đây chúng ta chỉ nghiên cứu phần một của bài toán: Nhìn vào đồ hình

trạng thái của máy ở hình 9.11, chúng ta thấy có 10 trạng thái, như vậy cần có

4 bit để mã hoá các trạng thái, tức là cần sử dụng 4 flip-flop

pdf31 trang | Chia sẻ: Thành Đồng | Ngày: 11/09/2024 | Lượt xem: 57 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Tài liệu Tìm hiểu về VHDL - Chương 9 Bài tập tham khảo, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
c bằng số chia thì gán y =1 và thay số bị chia bằng hiệu của số bị chia với số chia. Ngược lại thì y =0 + Quá trình thực hiện liên tục cho đến khi hết n lần. + Thương là dãy bit của y, số dư là sô bị chia cuối cùng. Để thiết kế bộ chia này thì chúng ta có 2 phương pháp: Cả 2 phương pháp đều thực hiện theo mã tuần tự: Phương pháp thứ nhất chỉ thực hiện bằng câu lện if, phương pháp thứ 2 thực hiện bằng cả câu lện if và loop. Mã thiết kế bộ chia sẽ như sau: Thiết kế theo phương pháp 1: ----- Phuong phap 1: step-by-step ------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; -------------------------------------------------- ENTITY Bo_chia IS PORT ( a, b: IN INTEGER RANGE 0 TO 15; y: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); rest: OUT INTEGER RANGE 0 TO 15; err : OUT STD_LOGIC); END Bo_chia; -------------------------------------------------- ARCHITECTURE arc OF Bo_chia IS BEGIN PROCESS (a, b) VARIABLE temp1: INTEGER RANGE 0 TO 15; VARIABLE temp2: INTEGER RANGE 0 TO 15; BEGIN ----- Khoi tao vaµ bat loi: ------- temp1 := a; temp2 := b; IF (b=0) THEN err <= '1'; ELSE err <= '0'; END IF; ----- y(3): --------------------------- IF (temp1 >= temp2 * 8) THEN y(3) <= '1'; temp1 := temp1 - temp2*8; ELSE y(3) <= '0'; END IF; ----- y(2): --------------------------- IF (temp1 >= temp2 * 4) THEN y(2) <= '1'; temp1 := temp1 - temp2 * 4; ELSE y(2) <= '0'; Trường ĐHSPKT Hưng Yên Tìm hiểu về VHDL - 129 - END IF; ----- y(1): --------------------------- IF (temp1 >= temp2 * 2) THEN y(1) <= '1'; temp1 := temp1 - temp2 * 2; ELSE y(1) <= '0'; END IF; ----- y(0): --------------------------- IF (temp1 >= temp2) THEN y(0) <= '1'; temp1 := temp1 - temp2; ELSE y(0) <= '0'; END IF; ----- Phan du: ---------------------- rest <= temp1; END PROCESS; END arc; -------------------------------------------------- Kết quả mô phỏng: Hình 9.10.1. Kết quả mô phỏng bộ chia Thiết kế theo phương pháp 2: ------ Phuong phap 2:----------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; -------------------------------------------------- ENTITY Bo_chia2 IS GENERIC(n: INTEGER := 3); PORT ( a, b: IN INTEGER RANGE 0 TO 15; y: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); rest: OUT INTEGER RANGE 0 TO 15; err : OUT STD_LOGIC); END Bo_chia2; -------------------------------------------------- ARCHITECTURE arc OF Bo_chia2 IS BEGIN Trường ĐHSPKT Hưng Yên Tìm hiểu về VHDL - 130 - PROCESS (a, b) VARIABLE temp1: INTEGER RANGE 0 TO 15; VARIABLE temp2: INTEGER RANGE 0 TO 15; BEGIN ----- Khoi tao gia tri va bat loi: ------- temp1 := a; temp2 := b; IF (b=0) THEN err <= '1'; ELSE err <= '0'; END IF; ----- thuong: ------------------------------ FOR i IN n DOWNTO 0 LOOP IF(temp1 >= temp2 * 2**i) THEN y(i) <= '1'; temp1 := temp1 - temp2 * 2**I; ELSE y(i) <= '0'; END IF; END LOOP; ----- phan du: ---------------------- rest <= temp1; END PROCESS; END arc; -------------------------------------------------- Kết quả mô phỏng: Hình 9.10.2.Kết quả mô phong bộ chia thứ 2 9.5. Bộ điều khiển máy bán hàng. Trong ví dụ này, chúng ta sẽ thiết kế bộ điều khiển máy bán hàng, máy bán hàng sẽ bán các thanh kẹo với giá 25 xu. Chúng ta sẽ thiết kế theo mô hình máy FSM. Đầu ra và đầu vào của bộ điều khiển được thể hiện trong hình 9.11. Tín hiệu vào là nickel_in, dime_in, và quarter_in thông báo rằng một đồng tiền tương ứng được gửi vào tài khoản. Ngoài ra còn có 2 đầu vào điều khiển: đầu vào reset (rst) và đầu vào clock (clk). Bộ điều khiển trả lời bằng 3 tín hiệu đầu ra: candy_out (để phân phát thanh kẹo), nickel_out và dime_out(cập nhật lại thay đổi). Trên hình 9.11 cũng chỉ ra đồ hình trạng thái của máy FSM. Các số bên trong các vòng tròn biểu diễn tổng tài khoản của khách hàng (chỉ có các nickel, dime và quarter là được chấp nhận). Trường ĐHSPKT Hưng Yên Tìm hiểu về VHDL - 131 - Hình 9.11. Đồ hình trạng thái của bộ điều khiển máy bán hàng Trạng thái 0 là trạng thái là trạng thái không làm gì cả. Từ đó nếu 1 đồng nickel được gửi vào tài khoản, máy sẽ chuyển trạng thái đến trạng thái 5, nếu 1 đồng dime được gửi vào tài khoản thì máy chuyển tới trạng thái 10 hoặc nếu 1 đồng quarter thì máy sẽ chuyển đến trạng thái 25. Tình huống tương tự sẽ được lặp lại cho tất cả các trạng thái, cho tới trạng thai 20. Nếu trạng thái 25 được xác nhận, thì thanh kẹo được phân phát và không chuyển đổi. Tuy nhiên nếu trạng thái 40 được xác nhận thì a nickel được trả lại, bởi vậy trạng thái sẽ chuyển tới trạng thái 35, đó là 1 trạng thái mà 1 dime được trả lại và 1 candy bar được phân phát. Có 3 trạng thái tạo ra chu trình kép, đó là từ 1 thanh kẹo được phân phát và máy trở lại trạng thái 0. Bài toán này sẽ được chia thành 2 phần: + Trong phần đầu: diện mạo cơ bản liên quan đến thiết kế bộ điều khiển máy bán hàng (như trong hình 9.11) . + Trong phần 2: Các chức năng mở rộng được thêm vào. Ở đây chúng ta chỉ nghiên cứu phần một của bài toán: Nhìn vào đồ hình trạng thái của máy ở hình 9.11, chúng ta thấy có 10 trạng thái, như vậy cần có 4 bit để mã hoá các trạng thái, tức là cần sử dụng 4 flip-flop. Trường ĐHSPKT Hưng Yên Tìm hiểu về VHDL - 132 - Mã thiết kế sẽ như sau: ------------------------------------------------------ LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------------ ENTITY Bo_dieu_khien_may_bh IS PORT ( clk, rst: IN STD_LOGIC; nickel_in, dime_in, quarter_in: IN BOOLEAN; candy_out, nickel_out, dime_out: OUT STD_LOGIC); END Bo_dieu_khien_may_bh; ------------------------------------------------------ ARCHITECTURE state_machine OF Bo_dieu_khien_may_bh IS TYPE state IS (st0, st5, st10, st15, st20, st25, st30, st35, st40, st45); SIGNAL present_state, next_state: STATE; BEGIN ---- Lower section of the FSM (Sec. 8.2): --------- PROCESS (rst, clk) BEGIN IF (rst='1') THEN present_state <= st0; ELSIF (clk'EVENT AND clk='1') THEN present_state <= next_state; END IF; END PROCESS; ---- Upper section of the FSM (Sec. 8.2): --------- PROCESS (present_state, nickel_in, dime_in, quarter_in) BEGIN CASE present_state IS WHEN st0 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '0'; IF (nickel_in) THEN next_state <= st5; ELSIF (dime_in) THEN next_state <= st10; ELSIF (quarter_in) THEN next_state <= st25; ELSE next_state <= st0; END IF; WHEN st5 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '0'; IF (nickel_in) THEN next_state <= st10; ELSIF (dime_in) THEN next_state <= st15; ELSIF (quarter_in) THEN next_state <= st30; ELSE next_state <= st5; END IF; WHEN st10 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '0'; IF (nickel_in) THEN next_state <= st15; Trường ĐHSPKT Hưng Yên Tìm hiểu về VHDL - 133 - ELSIF (dime_in) THEN next_state <= st20; ELSIF (quarter_in) THEN next_state <= st35; ELSE next_state <= st10; END IF; WHEN st15 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '0'; IF (nickel_in) THEN next_state <= st20; ELSIF (dime_in) THEN next_state <= st25; ELSIF (quarter_in) THEN next_state <= st40; ELSE next_state <= st15; END IF; WHEN st20 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '0'; IF (nickel_in) THEN next_state <= st25; ELSIF (dime_in) THEN next_state <= st30; ELSIF (quarter_in) THEN next_state <= st45; ELSE next_state <= st20; END IF; WHEN st25 => candy_out <= '1'; nickel_out <= '0'; dime_out <= '0'; next_state <= st0; WHEN st30 => candy_out <= '1'; nickel_out <= '1'; dime_out <= '0'; next_state <= st0; WHEN st35 => candy_out <= '1'; nickel_out <= '0'; dime_out <= '1'; next_state <= st0; WHEN st40 => candy_out <= '0'; nickel_out <= '1'; dime_out <= '0'; next_state <= st35; WHEN st45 => candy_out <= '0'; nickel_out <= '0'; dime_out <= '1'; next_state <= st35; END CASE; END PROCESS; END state_machine; ------------------------------------------------------ Trường ĐHSPKT Hưng Yên Tìm hiểu về VHDL - 134 - Kết quả mô phỏng: Hình 9.12.Kết quả mô phỏng bộ điều khiển máy bán hàng 9.6. Bộ nhận dữ liệu nối tiếp. 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. Trường ĐHSPKT Hưng Yên Tìm hiểu về VHDL - 135 - 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; ------------------------------------------------- Trường ĐHSPKT Hưng Yên Tìm hiểu về VHDL - 136 - Kết quả mô phỏng: Hình 9.14.Kết quả mô phỏng bộ nhận dữ liệu 9.7. Bộ chuyển song song thành nối tiếp. Bộ chuyển song song thành nối tiếp là một loại ứng dụng của thanh ghi dịch. Bộ chuyển đổi này sẽ thực hiện việc gửi đi một khối dữ liệu nối tiếp. Việc sử dụng bộ chuyển đổi này là rất cần thiết ví dụ: Trong các con chip ASIC, khi không có đủ các chân dư để cho ra đồng thời tất cả các bit dữ liệu. Khi đó chúng ta cần thiết phải sử dụng bộ chuyển đổi song song thành nối tiếp. Sơ đồ khối của bộ chuyển đổi song song thánh nối tiếp được trình bày trong hình 9.15. Hình 9.15.Bộ chuyển song song thành nối tiếp Trong đó: + d(7:0) là vector dữ liệu để gửi đi + dout là đầu ra thực tế. + clk: Đầu vào của xung clock + load: Đầu vào xác nhận Vector d được lưu trữ đồng bộ trong thanh ghi dịch reg. Khi load ở trạng thái cao thì dữ liệu được nạp vào thanh ghi dịch theo thư tự bit MSB là bít gần đầu ra nhất, và đầu ra là d(7). Mỗi khi load trả lại “0” thì bit tiếp theo Trường ĐHSPKT Hưng Yên Tìm hiểu về VHDL - 137 - được xuất hiện tại đầu ra của mỗi sườn dương của xung đồng hồ. Sau khi tất cả 8 bit được gửi đi, đầu ra trở lại mức thấp cho đến lần chuyển đổi tiếp theo. Mã thiết kế như sau: LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------- ENTITY Bo_chuyen_dl_ss_nt IS PORT ( d: IN STD_LOGIC_VECTOR (7 DOWNTO 0); clk, load: IN STD_LOGIC; dout: OUT STD_LOGIC); END Bo_chuyen_dl_ss_nt; ------------------------------------------------- ARCHITECTURE Bo_chuyen_dl_ss_nt OF Bo_chuyen_dl_ss_nt IS SIGNAL reg: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN IF (load='1') THEN reg <= d; ELSE reg <= reg(6 DOWNTO 0) & '0'; END IF; END IF; END PROCESS; dout <= reg(7); END Bo_chuyen_dl_ss_nt; ------------------------------------------------- Kết quả mô phỏng: Hình 9.16. Kết quả mô phỏng cho bộ chuyển song song thành nối tiếp 9.8. Trò chơi trên led 7 thanh. Chúng ta thiết kế trò chơi với SSD (seven – segment display). Sơ đồ của mạch được chỉ ra trong hình 9.17. Nó bao gồm 2 đầu vào là clk và stop, và một đầu ra là dout(6:0), đầu ra này sẽ được hiển thị trên SSD. Chúng ta phải đảm bảo rằng fdk = 1khz Trường ĐHSPKT Hưng Yên Tìm hiểu về VHDL - 138 - Hình 9.17. Sơ đồ của SSD Mạch của chúng ta sẽ tạo ra một sự chuyển động liên tục theo chiều kim đồng hồ của các đoạn SSD. Đồng thời nó còn tạo ra sự dịch chuyển chồng lắp giữa các thanh kề nhau. Chúng ta có thể biểu diễn quy trình của nó như sau: a->ab->b->bc->c->cd->d->de->e->ef->f->fa->a. Hình 9.18. Đồ hình trạng thái Quá trình sẽ dừng lại khi có tín hiệu Stop, và khi đó mạch sẽ trở lại trạng thái a và chờ cho đến khi stop xuống thấp trở lại. Hệ thống của chúng ta sẽ giữ lại ở các trạng thái a, b, c, d , e, f trong khoảng thời gian time1 = 80ms và ở các trạng thái ab, bc, cd, de, ef, fa là time2 = 30ms. Mã chương trình của chúng ta sẽ như sau: -------------------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; -------------------------------------------------------- ENTITY Trochoiled7thanh IS PORT ( clk, stop: IN BIT; dout: OUT BIT_VECTOR (6 DOWNTO 0)); END Trochoiled7thanh; Trường ĐHSPKT Hưng Yên Tìm hiểu về VHDL - 139 - -------------------------------------------------------- ARCHITECTURE arc OF Trochoiled7thanh IS CONSTANT time1: INTEGER := 4; -- Gia tri thuc te hien thi la 80 CONSTANT time2: INTEGER := 2; -- Gia tri thuc te hien thi is 30 TYPE states IS (a, ab, b, bc, c, cd, d, de, e, ef, f, fa); SIGNA

Các file đính kèm theo tài liệu này:

  • pdftai_lieu_tim_hieu_ve_vhdl_chuong_9_bai_tap_tham_khao.pdf