7宏功能模块应用
BEGIN cout <= sub_wire0; q <= sub_wire1(3 DOWNTO 0); LPM_COUNTER_component : LPM_COUNTER GENERIC MAP ( lpm_direction => "UNUSED", lpm_port_updown => "PORT_USED", lpm_type => "LPM_COUNTER", lpm_width => 4 ) PORT MAP ( aclr => aclr, clk_en => clk_en, clock => clock, data => data, sload => sload, updown => updown, cout => sub_wire0, q => sub_wire1 ); END SYN;
: STD_LOGIC ; : STD_LOGIC_VECTOR (3 DOWNTO 0);
: : : :
STRING; STRING; STRING; NATURAL
: : : : : : : :
IN STD_LOGIC ; IN STD_LOGIC ; IN STD_LOGIC ; IN STD_LOGIC_VECTOR (3 DOWNTO 0); OUT STD_LOGIC ; OUT STD_LOGIC_VECTOR (3 DOWNTO 0); IN STD_LOGIC ; IN STD_LOGIC
7.3 LPM随机存储的设置和调用
7.3.1 存储器初始化文件
1. .mif格式文件
#include <stdio.h> #include <math.h> #define PI 3.141592 #define DEPTH 128 /*数据深度,即存储单元的个数*/ #define WIDTH 8 /*存储单元的宽度*/ int main(void) { int i,temp; float s; FILE *fp; fp = fopen("TestMif.mif","w"); /*文件名随意,但扩展名必须为.mif*/ if(NULL==fp) printf("Can not creat file!\r\n"); else { printf("File created successfully!\n"); /* * 生成文件头:注意不要忘了“;” */ fprintf(fp,"DEPTH = %d;\n",DEPTH); fprintf(fp,"WIDTH = %d;\n",WIDTH); fprintf(fp,"ADDRESS_RADIX = HEX;\n"); fprintf(fp,"DATA_RADIX = HEX;\n"); fprintf(fp,"CONTENT\n"); fprintf(fp,"BEGIN\n");
3. 枚举类型定义 TYPE 枚举类型名 IS (元素1,元素2,......); 【例】 TYPE boolean IS ( false ,true ); TYPE my_logic IS ( ‘1’,‘z’,‘u’ ,‘0’ ); TYPE m_state IS (state1, state2, state3, state4, state5 ); TYPE x IS (low ,high ); TYPE data_bus IS ARRAY (0 TO 7,x) OF bit ; 综合时默认编码值: 000 001 010 011 100
【例】 TYPE matrix IS ARRAY (127 DOWNTO 0) OF std_logic_vector(7 DOWNTO 0);
定义一个128×8的二维数组类型matrix;每个元素的数据类型都是 std_logic_vector类型。利用这种数组可以定义一个存储器。
2. 非限定性数组类型定义 TYPE 数组类型名 IS ARRAY ( natural RANE<> ) OF
BEGIN PROCESS( clk ) BEGIN IF rising_edge(clk) THEN IF wren = ‘1’ THEN --同步写 mem(conv_integer(a)) <= din; END IF; END IF;
IF falling_edge(clk) THEN --同步读 q<=mem(conv_integer(a)); END IF; END PROCESS; END bhv; 对存储器的读写操作分别发生在clk信号的下降沿和上升沿,需要注意 的是这里的同步读写是对两个不同的信号进行的。
EDA技术 第7章 宏功能模块应用
7.1 计数器LPM模块调用
7.1.1 计数器模块文本的调用与参数设置
LIBRARY ieee; USE ieee.std_logic_1164.all; LIBRARY lpm; USE lpm.all; ENTITY cnt IS PORT (
aclr clk_en clock data sload updown cout q
7.3 LPM随机存储器的设置和调用
7.3.5 数据类型定义语句
1. 限定性数组类型定义 TYPE 数组类型名 IS ARRAY ( 数组范围 ) OF
【例】
基本数据类型;
TYPE stb IS ARRAY (7 DOWNTO 0) OF std_logic; 定义一个数组类型stb;有8个元素,分别为 stb(7),stb(6),stb(5)„stb(0);每个元素的数据类型都是std_logic类 型。
4. 枚举子类型定义 SUBTYPE 枚举子类型名 IS 基本数据类型 RANGE 约束范围; 【例】 SUBTYPE natural IS integer RANGE 0 TO integer'high; SUBTYPE positive IS integer RANGE 1 TO integer'high; SUBTYPE digits IS integer RANGE 0 TO 9;
7.3 LPM随机存储器的设置和调用
7.3.6 存储器配置文件属性定义和结构设置
【例7-7】 „ ARCHITECTURE bhv OF ram78 IS TYPE g_array IS ARRAY(0 TO 127) OF std_logic_vector(7 DOWNTO 0); SIGNAL mem : g_array; ATTRIBUTE ram_init_file : string ; ATTRIBUTE ram_init_file OF mem : SIGNAL IS “data7x8.mif”; BEGIN „
/* * 以十六进制输出地址和数据
*/
for(i=0;i<DEPTH;i++) { /*周期为128个点的正弦波*/ s = sin(PI*i/64); /*将-1~1之间的正弦波的值扩展到0-255之间*/ temp = (int)((s+1)*255/2); /*以十六进制输出地址和数据*/ fprintf(fp,"%x\t:\t%x;\n",i,temp); }//end for fprintf(fp,"END;\n"); fclose(fp); } }
7.3 LPM随机存储器的设置和调用
7.3.4 VHDL的存储器描述及相关属性
【例7-6】 „ USE ieee.std_logic.arith.all; --包含conv_integer(a) USE ieee.std_logic_unsigned.all; --包含算术重载函数 ENTITY ram78 IS PORT ( clk,wren: IN std_logic; --时钟,写允许信号 a: IN std_logic_vector(6 DOWNTO 0 ); --7位地址信号 din: IN std_logic_vector(7 DOWNTO 0); --8位数据输入信号 q: OUT std_logic_vector(7 DOWNTO 0) --8位数据输出信号 ); END; ARCHITECTURE bhv OF ram78 IS TYPE g_array IS ARRAY(0 TO 127) OF std_logic_vector(7 DOWNTO 0); SIGNAL mem : g_array;
);
END cnt;
ARCHITECTURE SYN OF cnt IS SIGNAL sub_wire0 SIGNAL sub_wire1 COMPONENT lpm_counter GENERIC ( lpm_direction lpm_port_updown lpm_type lpm_width ); PORT ( aclr clk_en clock data cout q sload updown ); END COMPONENT;
: : : : : : : :
IN STD_LOGIC ; IN STD_LOGIC ; IN STD_LOGIC ; IN STD_LOGIC_VECTOR (3 DOWNTO 0); IN STD_LOGIC ; IN STD_LOGIC ; OUT STD_LOGIC ; OUT STD_LOGIC_VECTOR (3 DOWNTO 0)
【例】
基本数据类型;
TYPE bit_vector IS ARRAY ( natural RANE<> ) OF bit; VARABLE va: bit_vector (1 TO 6); 这是在std库的standard程序包中bit_vector类型的定义。 使用非限定性数组类型定义一个数据对象时,要给出数组下标的取值 范围。