IF RISING_EDGE(CLK) THEN
IF WREN='1' THEN --如果时钟有上升沿出现,且写使能为高电平,则
MEM(CONV_INTEGER(A))<=DIN;--RAM数据口的数据被写入指定地址的单元 END IF; END IF;
IF(FALLING_EDGE(CLK))THEN --如果时钟有下降沿出现,则 Q<=MEM(CONV_INTEGER(A));--读出存储器中的数据 END IF; END PROCESS; END BHV;
--解2:以图7-18代码形式设计RAM
7-3 修改例7-6,用GENERIC语句定义例7-6中的数据线宽和存储单元的深度的参数,再设计一个顶层文件例化例7-6。此顶层文件能将参数传入底层模块例7-6。顶层文件的参数设数据宽度=16,存储深度msize=1024。
--解1:用GENERIC定义DB和AB修改【例7-6】设计双边沿控制读写RAM的VHDL程序。 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;--此程序包括含转换函数CONV_INTEGERlA) USE IEEE.STD_LOGIC_UNSIGNED.ALL;--此程序包包含算符重载函数 ENTITY RAM7x8 IS
GENERIC(D_Bus: integer:=8;A_Bus: integer:=7;MEM_Num: integer:=128;init_file: string:=\
PORT( CLK: IN STD_LOGIC;--定义时钟 WREN: IN STD_LOGIC;--定义写允许控制
A: IN STD_LOGIC_VECTOR(A_Bus-1 DOWNTO 0);--定义RAM的7位地址输入端口 DIN: IN STD_LOGIC_VECTOR(D_Bus-1 DOWNTO 0);--定义RAM的8位数据输入端口 Q:OUT STD_LOGIC_VECTOR(D_Bus-1 DOWNTO 0));--定义RAM的8位数据输出端口 END;
ARCHITECTURE bhv OF RAM7x8 IS
TYPE G_ARRAY IS ARRAY(0 TO MEM_Num-1) OF STD_LOGIC_VECTOR(D_Bus-1 DOWNTO 0); SIGNAL MEM: G_ARRAY;--定义信号MEM的数据类型为用户新定义的类型G_ARRAY
attribute ram_init_file: string; --定义字符串属性的标识符ram_init_file。 attribute ram_init_file of MEM: SIGNAL IS init_file; --定义标识符ram_init_file是MEM的属性,
--并将字符串\初始化赋给ram_init_file。
BEGIN
PROCESS(CLK)
BEGIN
IF RISING_EDGE(CLK) THEN