原创 LPM的使用

2007-3-3 14:47 2505 4 7 分类: FPGA/CPLD

The following file, reggen.vhd, contains the Entity Declaration and Architecture Body for reggen, a parameterized register function. The Generic Clause defines the REG_WIDTH parameter.


下面的reggen.vhd文件包含了一个实体,一个结构体以及一个参数化的寄存器功能。generic子句定义了REG_WIDTH参数。


ENTITY reggen IS
GENERIC(REG_WIDTH : INTEGER);--------例化的时候照抄-------
PORT(
   d: IN STD_LOGIC_VECTOR(REG_WIDTH - 1 DOWNTO 0);
   clk : IN STD_LOGIC;
  q: OUT STD_LOGIC_VECTOR(REG_WIDTH - 1 DOWNTO 0));
END reggen;


ARCHITECTURE a OF reggen IS
BEGIN
 PROCESS
 BEGIN
    WAIT UNTIL clk = '1';
  q <= d;
 END PROCESS;
END a;


The following example, reg24gen.vhd, instantiates two copies of reggen, reg12a and reg12b. The Package Declaration specifies the value of the TOP_WIDTH constant as the integer 24; the HALF_WIDTH constant is half of TOP_WIDTH. In the Generic Map Aspect of each instance of reggen, the constant HALF_WIDTH is explicitly assigned as the value of the REG_WIDTH parameter, thereby creating two 12-bit registers.


下例reg24gen示例了reggen的两个拷贝reg12a&reg12b。包声明详细指定了TOP_WIDTH 常量为 integer 24;HALF_WIDTH常量是TOP_WIDTH 的一半。在属性映射里,the constant HALF_WIDTH 明确的被分配为参数REG_WIDTH 的值,因此创建了两个12位的寄存器。


 


PACKAGE reg24gen_package IS
CONSTANT TOP_WIDTH : INTEGER := 24; ---理解位C语言里的define吧,哈哈
CONSTANT HALF_WIDTH : INTEGER := TOP_WIDTH / 2;
END reg24gen_package;


USE work.reg24gen_package.ALL;


ENTITY reg24gen IS
PORT(
        d : IN STD_LOGIC_VECTOR(23 DOWNTO 0);
        clk : IN STD_LOGIC;
        q: OUT STD_LOGIC_VECTOR(23 DOWNTO 0));
END reg24gen;


 


ARCHITECTURE a OF reg24gen IS
    COMPONENT reggen
 GENERIC( REG_WIDTH : INTEGER);
  PORT(d : IN STD_LOGIC_VECTOR(REG_WIDTH - 1 DOWNTO 0);
             clk : IN STD_LOGIC;
             q : OUT STD_LOGIC_VECTOR(REG_WIDTH - 1 DOWNTO 0));
    END COMPONENT;
BEGIN 
 reg12a : reggen
               GENERIC MAP (REG_WIDTH => HALF_WIDTH)
               PORT MAP (d => d(HALF_WIDTH - 1 DOWNTO 0), clk => clk,
                         q => q(HALF_WIDTH - 1 DOWNTO  0));
       
 reg12b : reggen
  GENERIC MAP (REG_WIDTH => HALF_WIDTH)
         PORT MAP (d => d(HALF_WIDTH*2 - 1 DOWNTO HALF_WIDTH),
                  clk => clk,  q => q(HALF_WIDTH * 2 - 1 DOWNTO HALF_WIDTH));
END a;


 

文章评论3条评论)

登录后参与讨论

用户1276322 2007-3-12 16:26

你说得对,只有隐式映射时必须顺序相同。显示映射就无所谓了。谢谢你的补充更正!

ash_riple_768180695 2007-3-12 14:08

在FPGA编程中,用好lpm是一项必修的基本功。

ash_riple_768180695 2007-3-12 14:07

“参数的顺序必须和函数GENERIC子句的中的元件声明的顺序相同。”

我对这句话有疑义,上面的例子中的参数和端口都是采用“显式”映射进行的,只有“隐式”映射才需要相同的顺序。否则,“显式”映射就没有意义了。

相关推荐阅读
用户1276322 2007-03-26 16:47
AVR读写外部RAM时出现的问题
AVR读写外部RAM时出现的问题问:1,对AT90S8515来说,外部RAM的地址肯定是从0x0260开始的?2,我用ICE200仿真8515读写外部RAM,RAM大小为32K Bytes,地址映射到...
用户1276322 2007-03-26 15:45
理解#defineSREG(*(volatileunsignedchar*)0x5F
以前看到#define SREG    (*(volatile unsigned char *)0x5F)这样的定义,总是感觉很奇怪,不知道为什么,今天终于有了一点点心得,请大虾们多多批砖~~~   ...
用户1276322 2007-03-26 12:56
AVR复位和中断处理
AVR提供了几种不同的中断源。这些中断和复位向量在程序存储器空间内都有自己单独的程序向量。所有中断都被分配一个私有的使能位,要想使能某一中断,就要向其使能位写入逻辑1,而且要把状态寄存器中的全局中断使...
用户1276322 2007-03-26 00:28
红外线遥控原理
作者:微电  出处:微电通讯  更新时间: 2006年07月14日            红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因...
用户1276322 2007-03-26 00:22
AVR中断应用设计要点
AVR的中断源比较多,尤其是ATmega128,一共有35个外部以及内部中断源。通常情况下,Flash程序存储器空间的最低位置(0x0000-0x0045)定义为复位和中断向量空间。完整的中断向量见第...
用户1276322 2007-03-25 23:59
avr单片机中断使用心得
中断响应后由硬件自动清零全局中断,任何中断都无法响应,在执行完中断程序后,全局中断打开.如果需要中断嵌套,则在中断程序里软件添加打开全局中断.就可以响应任何中断(包括比本中断优先级低的中断).以至可以...
我要评论
3
4
关闭 站长推荐上一条 /2 下一条