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:
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 IF; 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