Từ một tín hiệu clock, chúng ta mong muốn thu được một tín hiệu có dang sóng như trong hình 9.20. Với bài toán loại này, chúng ta có thể sử dụng phương pháp FSM hoặc phương pháp truyền thống. Cả 2 phương pháp đều
được chúng ta trình bày dưới đây:
Phương pháp FSM:
Hình 9.20 Hình dạng sóng cần phát
Tín hiệu của hình 9.20 có thể được mô hình như một FSM 8 trạng thái. Sử dụng bộ đếm từ 0 đến 7. Chúng ta có thể thiết lập một sóng bằng ‘0’ khi biến đếm = ‘0’ (ở xung thứ nhất) và bằng 1 khi biến đếm = ‘1’ (xung thứ
hai),…vv…như trong hình 9.20. Để thực thi được bộ tạo sóng này thì yêu cầu 4 flip-flop: trong đó có 3 cái để lưu trữ số đếm (3 bit), một cái để lưu trữ sóng (1 bit ). Để thiết kế bộ tạo sóng này, chúng ta thiết kế theo kiểu 2, cụ thể sẽ như
sau: --- LIBRARY ieee; USE ieee.std_logic_1164.all; --- ENTITY Bo_phat_tin_hieu IS PORT (clk: IN STD_LOGIC; wave: OUT STD_LOGIC); END Bo_phat_tin_hieu;
--- ARCHITECTURE arc OF Bo_phat_tin_hieu IS
TYPE states IS (zero, one, two, three, four, five, six, seven);
SIGNAL present_state, next_state: STATES; SIGNAL temp: STD_LOGIC;
BEGIN
--- Phan mach day: --- PROCESS (clk)
BEGIN
IF (clk'EVENT AND clk='1') THEN present_state <= next_state; wave <= temp;
END PROCESS;
--- Phan mach to hop: --- PROCESS (present_state) BEGIN
CASE present_state IS
WHEN zero => temp<='0'; next_state <= one; WHEN one => temp<='1'; next_state <= two; WHEN two => temp<='0'; next_state <= three; WHEN three => temp<='1'; next_state <= four; WHEN four => temp<='1'; next_state <= five; WHEN five => temp<='1'; next_state <= six; WHEN six => temp<='0'; next_state <= seven; WHEN seven => temp<='0'; next_state <= zero; END CASE; END PROCESS; END arc; --- Kết quả mô phỏng: Hình 9.2.1. Kết quả mô phỏng tạo sóng Phương pháp truyền thống:
Chúng ta thiết kế bộ phát tín hiệu theo phương pháp truyền thống với câu lệnh IF như sau: --- LIBRARY ieee; USE ieee.std_logic_1164.all; --- ENTITY Bo_phat_tin_hieu2 IS PORT (clk: IN BIT; wave: OUT BIT); END Bo_phat_tin_hieu2;
--- ARCHITECTURE arc OF Bo_phat_tin_hieu2 IS BEGIN
PROCESS
VARIABLE count: INTEGER RANGE 0 TO 7; BEGIN
WAIT UNTIL (clk'EVENT AND clk='1'); CASE count IS
WHEN 0 => wave <= '0'; WHEN 1 => wave <= '1'; WHEN 2 => wave <= '0'; WHEN 3 => wave <= '1';
WHEN 4 => wave <= '1'; WHEN 5 => wave <= '1'; WHEN 6 => wave <= '0'; WHEN 7 => wave <= '0'; END CASE; if count = 7 then count := 0; else count := count + 1; end if ; END PROCESS; END arc; --- Kết quả mô phỏng:
Hình 9.22. Kết quả mô phỏng tạo sóng theo phương pháp truyền thống