Chương 4: Toỏn tử và thuộc tớnh.
4.4. Chồng toỏn tử.
Cũng giống như cỏc thuộc tớnh được định nghĩa bởi người dựng. Trong VHDL ta cũng cú thể xõy dựng chồng cỏc toỏn tử toỏn học. Để xõy dựng chồng cỏc toỏn tử này ta cần phải chỉ rừ loại dữ liệu tham gia. Vớ dụ như toỏn tử + ở trờn chỉ ỏp dụng cho cỏc loại dữ liệu cựng kiểu số.Bõy giờ ta xõy dựng toỏn tử + dựng để cộng một số INTEGER với một BIT.
FUNCTION "+" (a: INTEGER, b: BIT) RETURN INTEGER IS BEGIN
IF (b='1') THEN RETURN a+1; ELSE RETURN a;
END IF;END "+"; END "+";
4.5. GENERIC.
GENERIC là một cỏch tạo cỏc tham số dựng chung (giống như cỏc biến static trong cỏc ngụn ngữ lập trỡnh). Mục đớch là để cho cỏc đoạn code mềm dẻo và dễ sử dụng lại hơn.
Một đoạn GENERIC khi được sử dụng cần phải được mụ tả trong ENTITY. Cỏc tham số phải được chỉ rừ. Cấu trỳc như sau:
GENERIC (parameter_name : parameter_type := parameter_value);
Vớ dụ: Vớ dụ sau sẽ định nghĩa biến n cú kiểu INTEGER và là GENERIC nú cú giỏ trị mặc định là 8. Khi đú khi n được gọi ở bất kỳ đõu, trong một ENTITY hay một ARCHITECTURE theo sau đú giỏ trị của nú luụn là 8.
ENTITY my_entity IS
GENERIC (n : INTEGER := 8); PORT (...);
END my_entity;
ARCHITECTURE my_architecture OF my_entity IS ...
END my_architecture;
Cú thể cú nhiều hơn 1 tham số GENERIC được mụ tả trong một ENTITY. Vớ dụ:
GENERIC (n: INTEGER := 8; vector: BIT_VECTOR := "00001111");
4.6. Vớ dụ.
Để làm rừ hơn cỏc vấn đề đó núi ở trờn chỳng ta sẽ xem xột một vài vớ dụ sau:
Hỡnh vẽ sau đõy mụ phỏng một bộ giải mó cú hai đầu vào. Một tớn hiệu vào dữ liệu sel gồm m bớt và một tớn hiệu là ena. Nú cú một đầu ra dữ liệu gồm n bớt. Cú m = log2(n).
Hỡnh 4.1. Bộ mó hoỏ cho vớ dụ 4.1
Khi tớn hiệu ena = ‘0’ thỡ tất cả cỏc bớt đầu ra x = ‘1’. Đầu ra được chọn theo đầu vào sel. Chương trỡnh sau đõy mụ tả về đối tượng này với 3 đầu vào sel và phớa đầu ra cú 8 đường x.
LIBRARY ieee;
USE ieee.std_logic_1164.all; ENTITY decoder IS
PORT ( ena : IN STD_LOGIC;
sel : IN STD_LOGIC_VECTOR (2 DOWNTO 0);
x : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END decoder; END decoder;
ARCHITECTURE generic_decoder OF decoder IS BEGIN
PROCESS (ena, sel)
VARIABLE temp1 : STD_LOGIC_VECTOR (x'HIGH
DOWNTO 0);
VARIABLE temp2 : INTEGER RANGE 0 TO x'HIGH;
BEGIN
temp1 := (OTHERS => '1'); temp2 := 0;
IF (ena='1') THEN
FOR i IN sel'RANGE LOOP IF (sel(i)='1') THEN temp2:=2*temp2+1; ELSE temp2 := 2*temp2; END IF; END LOOP; temp1(temp2):='0'; END IF; x <= temp1; END PROCESS;
END generic_decoder;
Hỡnh sau đõy mụ tả kết quả hoạt động của bộ giải mó trờn.
Hỡnh 4.2 Mụ phỏng kết quả của bộ mó hoỏ
Như chỳng ta thấy khi ena =0 thỡ tất cả cỏc bớt phớa đầu ra đều bằng 1. Khi ena = 1 thỡ chỉ một bớt phớa đầu ra được chọn tức là bằng 0. Vớ dụ như khi sel=’000’ thỡ đầu ra x = ‘11111110’, sel = ‘001’ x = ‘11111101’….
Trong vớ dụ trờn ta đó sử dụng cỏc toỏn tử +, * , cỏc toỏn tử gỏn và thuộc tớnh RANGE.
Vớ dụ 2 : Generic parity detector.
Vớ dụ sau đõy mụ phỏng một mạch phỏt hiện tớnh parity. Nú bao gồm một đầu vào n bớt và một đầu ra. Đầu ra sẽ cú giỏ trị bằng 0 khi số đầu vào cú giỏ trị là một là một số chẵn và bằng 1 trong cỏc trường hợp cũn lại.
Hỡnh 4.3. Bộ phỏt hiện bớt chón lẻ
Sau đõy là mó nguồn mụ tả mạch trờn.
ENTITY parity_det IS
GENERIC (n : INTEGER := 7);
PORT ( input: IN BIT_VECTOR (n DOWNTO 0); output: OUT BIT);
END parity_det;
ARCHITECTURE parity OF parity_det IS BEGIN
PROCESS (input)
VARIABLE temp: BIT; BEGIN
temp := '0';
temp := temp XOR input(i); END LOOP; output <= temp; END PROCESS; END parity;
Trong đoạn mó trờn chỳng ta đó sử dụng một mệnh để GENERIC định nghĩa n =7. Khi đú tất cả cỏc lần n xuất hiện nú đều cú giỏ trị là 7.
Kết quả của mạch được biểu diễn bởi hỡnh sau. Khi đầu vào input =’00000000’ thỡ đầu ra output =’0’. Khi input =’00000001’ thỡ đầu ra output = ‘1’ vỡ số đầu vào là 1 là một số lẻ.
Hỡnh 4.4. Mụ phỏng kết quả của hỡnh 4.2
Vớ dụ 3: Parity Generator
Mạch sau sẽ thờm một bớt parity vào tớn hiệu input. Bớt này là 0 khi số đầu vào =1 của input là một số chẵn và bằng 0 trong trường hợp ngược lại. Như vậy mạch sẽ gồm n-1 đầu vào dữ liệu và n đầu ra, trong đú n-1 đầu ra bờn phải giống như n-1 đầu vào, đầu ra cũn lại là giỏ trị kiểm tra parity.
Hỡnh 4.5. Bộ phỏt bit chẵn lẻ của vớ dụ 4.3
ENTITY parity_gen IS
GENERIC (n : INTEGER := 7);
PORT ( input: IN BIT_VECTOR (n-1 DOWNTO 0); output: OUT BIT_VECTOR (n DOWNTO 0)); END parity_gen;
ARCHITECTURE parity OF parity_gen IS BEGIN
PROCESS (input)
VARIABLE temp1: BIT;
VARIABLE temp2: BIT_VECTOR (output'RANGE);
BEGIN
temp1 := '0';
FOR i IN input'RANGE LOOP
temp1 := temp1 XOR input(i); temp2(i) := input(i);