Trong đoạn này, chúng ta sẽ thiết kế các mạch bộ nhớ sau:
+ ROM
+ RAM với bus dữ liệu vào ra tách rời. + ROM với bus dữ liệu vào ra hai chiều
ROM (Read Only Memory): Bộ nhớ chỉ đọc và ghi: Sơ đồ của ROM được chỉ ra trong hình 9.23. Vì ROM là bộ nhớ chỉ đọc, không có tín hiệu clock, chân cho phép ghi, nó chỉ có tín hiệu vào bus địa chỉ và tín hiệu ra là bus dữ liệu.
Hình 9.23.Sơ đồ của ROM Mã thiết kế ROM như sau:
--- LIBRARY ieee;
USE ieee.std_logic_1164.all;
--- ENTITY rom IS
GENERIC ( bits: INTEGER := 8; -- # of bits per word
words: INTEGER := 8); -- # of words in the memory PORT ( addr: IN INTEGER RANGE 0 TO words-1;
data: OUT STD_LOGIC_VECTOR (bits-1 DOWNTO 0)); END rom;
--- ARCHITECTURE rom OF rom IS
TYPE vector_array IS ARRAY (0 TO words-1) OF STD_LOGIC_VECTOR (bits-1 DOWNTO 0);
CONSTANT memory: vector_array := ( "00000000",
"00000010", "00000100", "00001000", "00010000", "00100000", "01000000", "10000000"); BEGIN data <= memory(addr); END rom; --- Kết quả mô phỏng:
Hình 9.24. Kết quả mô phỏng thiết kế ROM
RAM với đường bus vào ra riêng biệt: Sơ đồ của RAM với đường bus vào ra riêng biệt được thể hiện trong hình 9.25
Hình 9.25. RAM với đường dữ liệu tách rời
Như chúng ta thấy trên hình, RAM có các bus dư liệu vào data_in, bus dữ liệu ra data_out, bus địa chỉ, tín hiệu clk và tín hiệu cho phép đọc/ghi. Khi tín hiệu cho phép ghi/đọc được xác nhận là ghi thì tại mỗi xung lên tiếp theo của clk thì dữ liệu đầu vào (data_in) phải được lưu trữ tại vị trí addr, và dữ liệu ra phải được đọc từ địa chỉ addr.
Mã thiết kế RAM sẽ như sau:
--- --- 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 --- memory---
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; ---
Kết quả mô phỏng:
Hình 9.26. Kết quả mô phỏng RAM có đương dữ liệu vào ra khác nhau. RAM với đường bus song song:
Sơ đồ của RAM với đường bus song song được thể hiện trong hình 9.27. Dữ liệu được ghi vào RAM hay được đọc từ RAM thực hiện trên cùng 1 đường bus.
Hình 9.27. RAM với đường dữ liệu chung Mã thiết kế sẽ như sau:
--- LIBRARY ieee;
USE ieee.std_logic_1164.all;
--- ENTITY ramc IS
GENERIC ( bits: INTEGER := 8; -- # of bits per word words: INTEGER := 16); -- # of words in the -- memory
PORT ( clk, wr_ena: IN STD_LOGIC;
addr: IN INTEGER RANGE 0 TO words-1;
bidir: INOUT STD_LOGIC_VECTOR (bits-1 DOWNTO 0)); END ramc;
--- ARCHITECTURE arc OF ramc 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='0') THEN bidir <= memory(addr); ELSE bidir <= (OTHERS => 'Z');
IF (clk'EVENT AND clk='1') THEN memory(addr) <= bidir; END IF; END IF; END PROCESS; END arc; ---
Tài liệu tham khảo:
- Circuit design with VHDL , Voilnei A.Pedroni - VHDL language.
- The vhdl – cookbook , Peter J.Ashedo
- Thiết kế mạch bằng máy tính, Nguyễn Linh Giang …..