END PROCESS;

Một phần của tài liệu đồ án tốt nghiệp thiết kế vi mạch bằng vhdl (Trang 68)

s: OUT INTEGER RANGE TO 255; c8: OUT STD_LOGIC);

END PROCESS;

END behavior;

6.7. Bad Clocking.

Trỡnh biờn dịch núi chung khụng cú khả năng tổng hợp cỏc mó chứa cỏc phộp gỏn cho tớn hiệu giống nhau tại cả chuyển tiếp của tớn hiệu đồng hồ (clock) tham chiếu (tại sườn dương cộng tại sườn õm). Trong trường hợp này, trỡnh biờn dịch cú thể thụng bỏo một thụng điệp “signal does not hold value after clock edge” hoặc tương tự.

Vớ dụ:

Bộ đếm phải được tăng tại mọi sự chuyển tiếp của tớn hiệu clock (sườn dương cộng sườn dương)

PROCESS (clk) BEGIN

IF (clk'EVENT AND clk='1') THEN counter <= counter + 1; ELSIF(clk'EVENT AND clk='0') THEN

counter <= counter + 1; END IF;

...END PROCESS; END PROCESS;

Trỡnh biờn dịch cú thể cũn thụng bỏo rằng tớn hiệu counter bị nhõn dồn. Trong trường hợp này, việc biờn dịch sẽ bị treo.

Khớa cạnh quan trọng khỏc là thuộc tớnh EVENT phải cú liờn quan tới điều kiện kiểm tra. Vớ dụ: lệnh IF (clk’EVENT and clk=’1’) là đỳng, nhưng chỉ sử dụng IF (clk’EVENT) cú thể trỡnh biờn dịch giả sử một giỏ trị kiểm tra mặc định (and clk=’1’) hoặc thụng bỏo một thụng điệp “clock not locally stable”.

PROCESS (clk) BEGIN IF (clk'EVENT) THEN counter := counter + 1; END IF; ... END PROCESS;

Khi PROCESS được chạy mọi thời điểm clk thay đổi, bộ đếm cú thể được tăng hai trờn mỗi chu kỳ clock. Tuy nhiờn, điều này khụng xảy ra. Nếu trỡnh biờn dịch giả thiết một giỏ trị mặc định, một mạch lỗi sẽ được tổng hợp, bởi vỡ chỉ một sườn của clk sẽ được quan tõm; nếu khụng cú giỏ trị mặc định giả thiết, thỡ một thụng điệp lỗi và khụng cú sự biờn dịch được mong muốn.

Nếu một tớn hiệu xuất hiện trong danh sỏch nhạy, nhưng khụng xuất hiện trong bất kỳ phộp gỏn nào của PROCESS, thỡ xem như trỡnh biờn dịch sẽ bỏ qua. Tuy nhiờn, một thụng điệp “ignored unnecessary pin clk” cú thể được thụng bỏo.

PROCESS (clk) BEGIN

counter := counter + 1; ...

END PROCESS;

Hai đoạn mó PROCESS sau sẽ được tổng hợp chớnh xỏc bởi bất kỳ trỡnh biờn dịch nào. Tuy nhiờn, chỳ ý rằng sử dụng một tớn hiệu khỏc nhau trong mỗi PROCESS.

PROCESS (clk) BEGIN

IF (clk'EVENT AND clk='1') THEN x <= d;

END IF;END PROCESS; END PROCESS; PROCESS (clk) BEGIN

IF (clk'EVENT AND clk='0') THEN y <= d;

END IF;END PROCESS; END PROCESS;

Vớ dụ 6.7a:

RAM (Random Acess Memory), dung lượng 16 từ nhớ x 8 bit

Hỡnh 6.7a.1. RAM wr_ena clk addr data_in data_out ns 50 100 150 200 250 300 350 400 450 500 550 600 3 4 5 2 3 4 5 32 33 34 35 36 37 38 UU 32 UU 33 UU 34 UU 32 33 34 Hỡnh 6.7a.2. Kết quả mụ phỏng

Mạch cú bus dữ liệu vào (data_in), bus dữ liệu ra (data_out), bus địa chỉ (addr), cộng tớn hiệu clock (clk) và cỏc chõn cho phộp ghi (wr_ena). Khi

wr_ena được xỏc nhận, tại sườn dương tiếp theo của clk, vector cú mặt tại data_in phải được lưu trữ tại địa chỉ được mụ tả bởi addr. Đầu ra, data_out, bằng cỏch xử lý khỏc, phải hiển thị liờn tục dữ liệu chọn bởi addr.

Khi wr_ena ở mức thấp, q được nối với đầu vào của flip-flop, và d được mở, vỡ vậy khụng cú dữ liệu mới sẽ được ghi vào bộ nhớ. Khi wr_ena trở về mức cao, d được nối với đầu vào của thanh ghi, vỡ vậy tại sườn dương tiếp theo của clk, d sẽ ghi đố giỏ trị liền trước.

LIBRARY ieee;

USE ieee.std_logic_1164.all;

ENTITY ram IS

GENERIC ( bits: INTEGER := 8;-- # of bits per word

words: INTEGER := 16);--#of words in the mem PORT ( wr_ena, clk: IN STD_LOGIC;

addr: IN INTEGER RANGE 0 TO words-1;

data_in: IN STD_LOGIC_VECTOR (bits-1 DOWNTO 0); data_out: OUT STD_LOGIC_VECTOR (bits-1 DOWNTO 0)); END ram;

ARCHITECTURE ram OF ram IS

TYPE vector_array IS ARRAY (0 TO words-1) OF STD_LOGIC_VECTOR (bits-1 DOWNTO 0); SIGNAL memory: vector_array;

BEGIN

PROCESS (clk, wr_ena) BEGIN

IF (wr_ena='1') THEN

IF (clk'EVENT AND clk='1') THEN memory(addr) <= data_in; END IF; END IF; END PROCESS; data_out <= memory(addr); END ram; 6.8. Sử dụng mó tuần tự để thiết kế cỏc mạch tổ hợp.

Mó tuần tự cú thể được sử dụng để thực hiện cỏc hệ dóy hay tổ hợp. Trong trường hợp hệ dóy, cỏc thanh ghi là cần thiết, vỡ vậy sẽ được suy ra bởi trỡnh biờn dịch. Tuy nhiờn, điều này sẽ khụng xảy ra trong trường hợp hệ tổ hợp. Hơn nữa, nếu mó được dựng cho hệ tổ hợp, thỡ bảng thật đầy đủ nờn được mụt tả rừ ràng trong mó.

Để thoả món cỏc tiờu chuẩn trờn cú cỏc luật được xột:

- Luật 1: Đảm bảo tất cả tớn hiệu đầu vào sử dụng trong PROCESS xuất hiện trong danh sỏch nhạy của nú. Trỡnh biờn dịch đưa ra cảnh bỏo nếu một tớn hiệu đầu vào đó cho khụng được chứa trong danh sỏch nhạy, và sau đú xử lý nếu tớn hiệu đó được chứa.

- Luật 2: Đảm bảo tất cả tổ hợp cỏc tớn hiệu đầu vào/đầu ra được bao gồm trong mó, bảng thật đầy đủ của mạch cú thể được chứa (điều này đỳng với cả mó tuần tự và mó đồng thời). Cỏc đặc tả khụng đầy đủ của cỏc tớn hiệu đầu ra cú thể gõy cho việc tổng hợp để suy ra cỏc chốt để giữ cỏc giỏ trị liền trước.

Vớ dụ 6.8a: Thiết kế mạch tổ hợp sai Hỡnh 6.8a.1. Mạch tổ hợp sai và cỏc bảng thật a b c d sel x y ns 50 100 150 200 250 300 350 400 450 500 550 600 0 3 1 Hỡnh 6.8a.2. Kết quả mụ phỏng

x hoạt động như một bộ dồn kờnh, y = 0 khi sel = “00”, hoặc = 1 nếu sel = “01”. Tuy nhiờn cỏc đặc tả được cung cấp cho y khụng dầy đủ.

LIBRARY ieee;

USE ieee.std_logic_1164.all; ENTITY example IS

PORT (a, b, c, d: IN STD_LOGIC;

sel: IN INTEGER RANGE 0 TO 3; x, y: OUT STD_LOGIC);

END example;

ARCHITECTURE example OF example IS BEGIN

PROCESS (a, b, c, d, sel) BEGIN

IF (sel=0) THEN x<=a; y<='0';

ELSIF (sel=1) THEN x<=b;

y<='1';

ELSIF (sel=2) THEN x<=c;

ELSE

x<=d; END IF;

Một phần của tài liệu đồ án tốt nghiệp thiết kế vi mạch bằng vhdl (Trang 68)