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.
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
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:
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 PROCESS; END arc;
Kết luận
Ngày này việc ứng dụng VHDL trong việc thiết kế mạch và chíp ngày càng nhiều. Công nghệ này đang là xu hướng của thời đại, đơn giản vì nó không chỉ tiêu tốn ít về tiền bạc mà nó còn giúp cho chúng ta đơn giản trong việc thiết kế phần cứng.
Trên đây, chúng ta đã trình bày một cách khái quát về phương pháp thiết kế các mạch. Những mạch cơ bản nhất đã được chúng ta thiết kế một cách chi tiêt, hoàn thiện. Đây là cơ sở cho những thiết kế lơn hơn về phần cứng, để thiết kế các ứng dụng cho các FPGA, ASIC.
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 - McGraw.Hill.VHDL.Programming.by.Example.4th.Ed - Circuit Design With VHDL MIT Press eBook