Để mã hoá trạng thái của máy trạng thái, chúng ta có thể chọn một trong vài kiểu có sẵn. Kiểu mã hoá mặc định là nhị phân. Ưu điểm của kiểu mã hoá này là nó yêu cầu số lượng flip-flop ít nhất. Trong trường hợp này, với n mạch flip-flop thì có thể chúng ta có thể mã hoá được 2n trạng thái. Nhược điểm của kiểu mã hoá này là nó yêu cầu về logic nhiều hơn và nó chậm hơn so với những kiểu khác.
Cái cuối cùng là kiểu mã hoá onehot, với kiểu mã hoá này, chúng ta cần sử dụng 1 flip-flop cho 1 trạng thái. Vì vậy, nó đòi hỏi số lượng flip-flop lớn nhất. Trong trường hợp này, với n flip-flop (n bit) chỉ có thể mã hoá được n trạng thái. Nhưng bù lại, phương pháp này lại yêu cầu tính toán logic it nhất, và tốc độ nhanh nhất
Một kiểu nằm giữa 2 kiểu trên là kiểu mã hoá twohot (trong một trạng thái chỉ có 2 bit 1). Vì vậy với n flip-flop (n bit), thì chúng ta có thể mã hoá
được n(n-1)/2 trạng thái.
Kiểu mã hoá onehot được giới thiệu trong các ứng dụng mà số lượng các flip-flop nhiều như trong các chip FPGA. Nhưng trong các mạch ASIC thì mã nhị phân lại được ưu tiên hơn.
Ví dụ: Giả sử chúng ta có một máy trạng thái có 8 trang thái như trong bảng dưới đây:
Với 8 trạng thái của máy này thì số lượng flip-flop được yêu cầu ứng với các kiểu mã hoá sẽ bằng:
+ 3 (=log28), ứng với kiểu mã hoá nhị phân.
+ 5 ( n(n-1)/2= 8 => n = 5 ), ứng với kiểu mã hoá twohot + 8, ứng với kiểu mã hoá onehot.
Chương 9: Bài tập tham khảo
Phần này chúng ta sẽ trình bày các mạch sau: + Barrel shifter + Bộ so sánh không dấu và có dấu. + Bộ cộng + Bộ chia dấu chấm tĩnh. + Bộđiều khiển máy bán hàng. + Bộ nhận dữ liệu nối tiếp.
+ Bộ chuyển đổi song song sang nối tiếp. + SSD
+ Bộ phát tín hiệu + Bộ nhớ
9.1. Barrel Shifter.
Sơđồ của mạch của bộ dịch barrel được chỉ ra trong hình 9.1. Đầu vào là vector 8 bit. Đầu ra là phiên bản dịch của đầu vào, với lượng dịch được định nghĩa bởi 8 đầu vào “shift” (từ o đến 7). Mạch gồm có 3 bộ dịch barrel riêng lẻ, mỗi một cái giống như trong ví dụ 6.9. Nhưng chúng ta phải chu ý rằng, barrel đầu tiên có chỉ có 1 đầu “0” được kết nối với một bộ dồn kênh, trong khi barrel thứ 2 có 2 đầu vào “0” và barrel cuối cùng có tới 4 đầu vào “0”. Để
vector lớn hơn thì chúng ta phải dữ 2 đầu vào là “0”. Ví dụ nếu shift = “001” thì chỉ barrel đầu tiên gây ra dịch, còn nếu shift = “111” thì tất các đều gây ra dịch.
Mã thiết kế sẽ như sau: --- LIBRARY ieee; USE ieee.std_logic_1164.all; --- ENTITY barrel IS
PORT ( inp: IN STD_LOGIC_VECTOR (7 DOWNTO 0); shift: IN STD_LOGIC_VECTOR (2 DOWNTO 0); outp: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END barrel;
--- ARCHITECTURE behavior OF barrel IS
BEGIN
PROCESS (inp, shift)
VARIABLE temp1: STD_LOGIC_VECTOR (7 DOWNTO 0); VARIABLE temp2: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN
---- Bo dich thu nhat --- IF (shift(0)='0') THEN
temp1 := inp; ELSE
temp1(0) := '0';
FOR i IN 1 TO inp'HIGH LOOP temp1(i) := inp(i-1); END LOOP; END IF; ---- Bo dich thu 2 --- IF (shift(1)='0') THEN temp2 := temp1; ELSE FOR i IN 0 TO 1 LOOP temp2(i) := '0'; END LOOP;
FOR i IN 2 TO inp'HIGH LOOP temp2(i) := temp1(i-2); END LOOP; END IF; ---- Bo dich thu 3 --- IF (shift(2)='0') THEN outp <= temp2; ELSE FOR i IN 0 TO 3 LOOP outp(i) <= '0'; END LOOP;
FOR i IN 4 TO inp'HIGH LOOP outp(i) <= temp2(i-4); END LOOP;
END IF; END PROCESS; END behavior;
---
Kết quả mô phỏng:
Hình 9.2.Kết quả mô phỏng cho bộ dịch barrel