Thiết kế theo kiể u1 (thiết kế theo mụ hỡnh may moore) 9 4-

Một phần của tài liệu Thiết kế mạch bằng VHDL (Trang 95)

Cú vài phương phỏp cú thể được hỡnh thành để thiết kế một FSM. Chỳng ta sẽ mụ tả chi tiết một vớ dụ mẫu mà mạch hoàn toàn được cấu trỳc và dễ dàng ỏp dụng. Trong đú phần mạch dóy c ủa mỏy trạng thỏi sẽ tỏch biệt với phần mạch tổ hợpcủa nú (hỡnh vẽ trờn).

Tất cả cỏc trạng thỏi của mỏy luụn luụn được khai bỏo rừ ràng bằng cỏch sử dụng kiểu dữ liệu liệt kờ.

Thiết kế phần mạch dóy:

Trờn hỡnh trờn, cỏc flip-flop nằm ở phần mạch dóy. Cỏc đầu vào từ bờn ngo ài của phần này là cỏc tớn hiệu clock và reset. Cỏc tớn hiệu này được nối với cỏc Flip-flop. Một đầu vào khỏc (bờn trong) là trạng thỏi tiếp theo. Đầu ra duy nhất của phần này là trang thỏi hiện tại. Để xõy dựng cho phần mạch dóy này, ta cần sử dụng cấu trỳc PROCESS. Trong cấu trỳc của PROCESS chỳng ta co thể sẽ sử dụng cỏc cõu lệnh tuần tự như lệnh IF, WAIT, CASE, LOOP.

Khuụn mẫu thiết kế của phần mạch dóy sẽ như sau:

Mó chỉ ra ở đõy là rất đơn giản. Nú chỉ chứa một tớn hiệu reset đồng bộ. Tớn hiệu reset này sẽ xỏc định trạng thỏi khởi đầu của hệ thống, sau đú là lưu trữ đồng bộ trạng thỏi tiếp theo (tại sườn dương đụng hồ),và đưa ra đầu ra của phần mạch dóy trạng thỏi hiện tại.

Việc thiết kế cho phần mạch dóy này thỡ đơn giản vỡ nú là một chuẩn cơ bản, và số lượng cỏc thanh ghi là tối thiểu. Ở phần 7.5, chỳng ta biết rằng số lượng cỏc flip – flop sẽ tớnh dựa vào số bits cần thiết để mó hoỏ tất cả cỏc trạng thỏi của FSM. Bởi vậy nếu mẫu được mó hoỏ theo cỏch mặc định (mó hoỏ nhị phõn) thỡ, chỳng ta sẽ cần log2n Flip-flop, với n là số trạng thỏi.

Thiết kế phần mạch tổ hợp:

Ở hỡnh 1, thỡ phần mạch tổ hợp là đầy đủ, vỡ vậy mó của nú sẽ khụng cần thiết theo tuần tự. Tốt nhất, chỳng ta nờn sử dụng mó đồng thời. Song trong vớ dụ mẫu dưới đõy chỳng ta sẽ sử dụng mó tuần tự với cõu lệnh CASE đúng vai trũ trung tõm.

PROCESS (input, pr_state) BEGIN CASE pr_state IS WHEN state0 => IF (input = ...) THEN output <= <value>; nx_state <= state1; ELSE ... END IF;

PROCESS (reset, clock) BEGIN

IF reset = ‘1’ THEN

Trang_thai_hien_tai <= Trang_thai_0 ;

ELSIF (clock ‘EVENT and clock = ‘’) THEN

Trang_thai_hien_tai <= Trang_thai_tiep_theo;

END IF ; END PROCESS ;

WHEN state1 => IF (input = ...) THEN output <= <value>; nx_state <= state2; ELSE ... END IF; WHEN state2 => IF (input = ...) THEN output <= <value>; nx_state <= state2; ELSE ... END IF; ... END CASE; END PROCESS;

Đoạn mó ở đõy cũng rất đơn giản, và nú sẽ thực hiện 2 cụng việc chớnh: + Gỏn giỏ trị cho đầu ra.

+ Thiết lập trang thỏi tiếp theo.

Mẫu mỏy trạng thỏi cho kiểu thiết kế 1:

Dưới đõy là khuụn mẫu hoàn chỉnh về kiểu thiết kế 1:

LIBRARY ieee;

USE ieee.std_logic_1164.all;

--- ENTITY <entity_name> IS

PORT ( input: IN <data_type>; reset, clock: IN STD_LOGIC; output: OUT <data_type>); END <entity_name>;

--- ARCHITECTURE <arch_name> OF <entity_name> IS

TYPE state IS (state0, state1, state2, state3, ...); SIGNAL pr_state, nx_state: state;

BEGIN

--- Phần mạch dóy: --- PROCESS (reset, clock)

BEGIN

IF (reset='1') THEN

pr_state <= state0;

ELSIF (clock'EVENT AND clock='1') THEN pr_state <= nx_state;

END IF; END PROCESS;

---Phần mạch tổ hợp: --- PROCESS (input, pr_state)

BEGIN CASE pr_state IS WHEN state0 => IF (input = ...) THEN output <= <value>; nx_state <= state1;

ELSE ... END IF; WHEN state1 => IF (input = ...) THEN output <= <value>; nx_state <= state2; ELSE ... END IF; WHEN state2 => IF (input = ...) THEN output <= <value>; nx_state <= state3; ELSE ... END IF; ... END CASE; END PROCESS; END <arch_name>; Vớ dụ 8.1: Bộ đếm BCD

Một bộ đếm là một vớ dụ của mỏy Moore, đầu ra chỉ phụ thuộc vào kết quả của trạng thỏi hiện tại. Giống như một mạch thanh ghi và một mạch dóy đơn giản. Để thiết kế mạch này, chỳng ta cú thể dựng phương phỏp thụng thường như những phần mạch mạch tổ hợp, nhưng ở đõy ta sẽ dựng phương phỏp FSM.

Giả sử ta cần thiết kế bộ đếm modul 10. Như vậy chỳng ta sẽ cần cú một may cú 10 trang thỏi. Cỏc trạng thỏi ở đõy được gọi là zero, one,…,nine. Đồ hỡnh trạng thỏi của mỏy được cho như sau:

Hỡnh 8.2. Sơ đồ trạng thỏi của bộ đếm BCD

Mó VHDL cũng giống như khuụn mẫu của thiết kế mẫu 1. Trong đú: kiểu dữ liệu liệt kờ sẽ xuất hiện ở dũng 11 – 12, thiết kế của phần mạch dóy sẽ từ dũng 16 đến dong 23, thiết kế của phần mạch tổ hợp(mạch tổ hợp) sẽ xuất

hiện từ dũng 25 – 29. Do cú 10 trang thỏi nờn số lượng cac thanh ghi bằng là [log210 ]= 4.

Mó thiết kế sẽ như sau:

--- LIBRARY ieee; USE ieee.std_logic_1164.all; --- ENTITY counterBCD IS PORT ( clk, rst: IN STD_LOGIC;

count: OUT STD_LOGIC_VECTOR (3 DOWNTO 0));

END counterBCD;

--- ARCHITECTURE state_machine OF counterBCD IS

TYPE state IS (zero, one, two, three, four,

five, six, seven, eight, nine);

SIGNAL pr_state, nx_state: state; BEGIN

--- Phan mach day: --- PROCESS (rst, clk)

BEGIN

IF (rst='1') THEN

pr_state <= zero;

ELSIF (clk'EVENT AND clk='1') THEN

pr_state <= nx_state;

END IF;

END PROCESS;

--- Phan mach to hop: --- PROCESS (pr_state) BEGIN CASE pr_state IS WHEN zero => count <= "0000"; nx_state <= one; WHEN one => count <= "0001"; nx_state <= two; WHEN two => count <= "0010"; nx_state <= three; WHEN three => count <= "0011"; nx_state <= four; WHEN four => count <= "0100"; nx_state <= five; WHEN five => count <= "0101"; nx_state <= six; WHEN six => count <= "0110"; nx_state <= seven; WHEN seven =>

count <= "0111"; nx_state <= eight; WHEN eight => count <= "1000"; nx_state <= nine; WHEN nine => count <= "1001"; nx_state <= zero; END CASE; END PROCESS; END state_machine; --- Mụ phỏng kết quả: Hỡnh 8.3. Kết quả mụ phỏng của bộ đếm BCD

Vớ dụ 8.2: Mỏy tr ạng thỏi kết thỳc kiểu 1

Hỡnh 4 là sơ đồ khối của 1 FSM đơn giản. Hệ thống cú 2 trạng thỏi: trạng thỏi A và trạng thỏi B. Mỏy phải chuyển trạng thỏi khi nhận được d = 1 và đầu ra mong muốn là x = a khi mỏy ở trạng thỏi A hoặc x = b khi mỏy ở trạng thỏi B.

Hỡnh 8.4. Mỏy trạng thỏi của vớ dụ 8.2

Mó thiết kế sẽ như sau:

--- LIBRARY ieee; USE ieee.std_logic_1164.all; --- ENTITY vd_FSM IS PORT ( a, b, d, clk, rst: IN BIT; x: OUT BIT);

END vd_FSM;

--- ARCHITECTURE state_machine OF vd_FSM IS

TYPE state IS (stateA, stateB);

SIGNAL pr_state, nx_state: state;

BEGIN

--- Phan mach day: --- PROCESS (rst, clk)

BEGIN

IF (rst='1') THEN

pr_state <= stateA;

ELSIF (clk'EVENT AND clk='1') THEN

pr_state <= nx_state;

END IF;

END PROCESS;

--- Phan mach to hop: --- PROCESS (a, b, d, pr_state)

BEGIN

CASE pr_state IS

WHEN stateA =>

x <= a;

IF (d='1') THEN nx_state <= stateB;

ELSE nx_state <= stateA;

END IF;

WHEN stateB =>

x <= b;

IF (d='1') THEN nx_state <= stateA;

ELSE nx_state <= stateB;

END IF; END CASE; END PROCESS; END state_machine; --- Kết quả mụ phỏng: Hỡnh 8.5. Kết quả mụ phỏng cho vớ dụ 8.2 8.3. Thiết kế kiểu 2.

Như chỳng ta thấy trong kiểu thiết kế 1 thỡ chỉ cú trạng thỏi hiện tại được lưu trữ. Tất cả cỏc mạch như vậy sẽ được túm tắt như trong hỡnh 8.6.1. Trong trường hợp này nếu mạch là mỏy Mealy (đầu ra của nú phụ thuộc vào

đầu vào hiện tại), đầu ra cú thể thay đổi khi đầu vào thay đổi (đầu ra khụng đồng bộ).

Trong nhiều ứng dụng, tớn hiệu được yờu cầu là đồng bộ, thỡ đầu ra sẽ chỉ cập nhật khi thay đổi sườn clock. Để tạo ra mỏy đồng bộ Mealy, đầu ra phải được lưu trữ tốt, như trong hỡnh 8.6.2

Hỡnh 8.6.1 Sơ đồ mạch kiểu 1 Hỡnh 8.6.2. Sơ đồ mạch kiểu 2

Cấu trỳc như trong hỡnh 8.6.2 sẽ là đối tượng của thiết kế kiểu 2.

Để thực hiện cấu trỳc mới này, chỳng ta cần cú vài sự thay đổi so với thiết kế kiểu 1. Vớ dụ, chỳng ta cú thể sử dụng một tớn hiệu thờm (như tớn hiệu trung gian) để tớnh toỏn giỏ trị đầu ra (đoạn trờn), nhưng chỉ chuyển cỏc giỏ trị của nú thành tớn hiệu đầu ra khi sự kiện clock thay đổi (phần mạch dóy). Sự thay đổi này chỳng ta sẽ thấy trong khuụn mẫu chỉ ra dưới đõy:

Khuụn mẫu mỏy trạng thỏi của thiết kế 2

LIBRARY ieee;

USE ieee.std_logic_1164.all;

--- ENTITY <ent_name> IS

PORT (input: IN <data_type>; reset, clock: IN STD_LOGIC; output: OUT <data_type>); END <ent_name>;

--- ARCHITECTURE <arch_name> OF <ent_name> IS

TYPE states IS (state0, state1, state2, state3, ...); SIGNAL pr_state, nx_state: states;

SIGNAL temp: <data_type>; BEGIN

--- Phan mach day: --- PROCESS (reset, clock)

BEGIN

IF (reset='1') THEN

pr_state <= state0;

ELSIF (clock'EVENT AND clock='1') THEN output <= temp;

pr_state <= nx_state; END IF;

So sỏnh khuụn mẫu của thiết kế kiểu 2 với thiết kế kiểu 1, chỳng ta thấy chỉ cú một sự khỏc nhau duy nhất, đú là xuất hiện tớn hiệu trung gian temp. Tớn hiệu này sẽ cú tỏc dụng lưu trữ đầu ra của mỏy. Chỉ cho cỏc giỏ trị chuyển thành đầu ra khi khi cú sự thay đổi sự kiện clock.

Vớ dụ 8.3:

Chỳng ta sẽ nhỡn lại thiết kế của vớ dụ 8.2. Tuy nhiờn ở đõy chỳng ta muốn đầu ra là đồng bộ (chỉ thay đổi khi cú sự kiện thay đổi clock). Vỡ vậy trong vớ dụ này chỳng ta sẽ thiết kế theo kiểu 2.

--- library IEEE; use IEEE.STD_LOGIC_1164.all; --- ENTITY VD_FSM2 IS PORT ( a, b, d, clk, rst: IN BIT; x: OUT BIT); END VD_FSM2; --- ARCHITECTURE VD_FSM2 OF VD_FSM2 IS

TYPE state IS (stateA, stateB); SIGNAL pr_state, nx_state: state; SIGNAL temp: BIT;

BEGIN

--- Phan mach day: --- PROCESS (rst, clk)

--- Phan mach to hop: --- PROCESS (pr_state)

BEGIN

CASE pr_state IS WHEN state0 =>

temp <= <value>;

IF (condition) THEN nx_state <= state1; ...

END IF; WHEN state1 =>

temp <= <value>;

IF (condition) THEN nx_state <= state2; ...

END IF; WHEN state2 =>

temp <= <value>;

IF (condition) THEN nx_state <= state3; ... END IF; ... END CASE; END PROCESS; END <arch_name>;

BEGIN

IF (rst='1') THEN

pr_state <= stateA;

ELSIF (clk'EVENT AND clk='1') THEN x <= temp;

pr_state <= nx_state; END IF;

END PROCESS;

--- Phan mach to hop: --- PROCESS (a, b, d, pr_state)

BEGIN

CASE pr_state IS WHEN stateA =>

temp <= a;

IF (d='1') THEN nx_state <= stateB; ELSE nx_state <= stateA;

END IF; WHEN stateB =>

temp <= b;

IF (d='1') THEN nx_state <= stateA; ELSE nx_state <= stateB;

END IF; END CASE;

END PROCESS; END VD_FSM2;

---

Ở đõy chỳng ta thấy cú 2 flip – flop được sử dụng, một cỏi để mó hoỏ trạng thỏi của mỏy, một cỏi để lưu trữ đầu ra.

Bộ mụ phỏng kết quả được chỉ ra trong hỡnh dưới đõy:

Hỡnh 8.7.Kết quả mụ phỏng cho vớ dụ 8.3

Vớ dụ 8.4. Bộ phỏt hiện chuỗi

Chỳng ta muốn thiết kế một mạch mà đầu vào là luồng bit nối tiếp và đầu ra là 1 khi đầu cú xuõt hiện chuỗi “111”, là 0 trong cỏc trường hợp cũn lại

Đồ hỡnh trạng thỏi của mỏy được chỉ ra trong hỡnh 8. Ở đõy chỳng ta cú

Một phần của tài liệu Thiết kế mạch bằng VHDL (Trang 95)

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

(141 trang)