微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > FPGA系统设计原则和技巧之:FPGA系统设计的3种常用IP模块

FPGA系统设计原则和技巧之:FPGA系统设计的3种常用IP模块

时间:06-05 来源:互联网 点击:

3个文件,如图9.19所示。

(10)FIFO模块实例化。

将模块文件加入工程后,设计者就可以调用这个片上FIFO,并实例化了。

首先我们看一下QuartusII是如何构建这个FIFO的。打开fifo_test.v文件,这是FIFO模块的构造设计文件。该构造设计文件主要可以分为下面4个部分。

第一部分是端口声明和说明,这部分是根据用户自定义选择的控制信号及深度、宽度等参数决定的,代码如下:

modulefifo_test(

data, //数据输入

wrreq, //写请求

rdreq, //读请求

clock, //时钟

aclr, //异步清零

q, //数据输出

full, //满信号

empty, //空信号

usedw); //字节使用信号

input [31:0]data; //输入数据宽度

input wrreq;

input rdreq;

input clock;

input aclr;

output [31:0]q; //输出数据宽度

output full;

output empty;

output [10:0]usedw; //自动计算出的字节使用控制信号宽度

第二部分是FIFO端口信号与Altera宏模块之间的连线声明,其中只有输出信号需要声明,而输入信号可以直接调用,代码如下:

wire[10:0]sub_wire0; //usedw输出类型声明

wiresub_wire1; //空信号输出类型声明

wire[31:0]sub_wire2; //数据输出类型声明

wiresub_wire3; //满信号输出类型声明

wire[10:0]usedw=sub_wire0[10:0]; //usedw连线

wireempty=sub_wire1; //空信号连线

wire[31:0]q=sub_wire2[31:0]; //数据输出连线

wirefull=sub_wire3; //满信号连线

第三部分是实例化FIFO所调用的宏模块,这里调用的是scfifo模块,代码如下:

scfifoscfifo_component( //scfifo模块实例化

.rdreq(rdreq), //读请求

.aclr(aclr), //异步清零

.clock(clock), //时钟

.wrreq(wrreq), //写请求

.data(data), //输入数据

.usedw(sub_wire0), //字节使用信号

.empty(sub_wire1), //空信号

.q(sub_wire2), //数据输出

.full(sub_wire3) //满信号

.almost_empty(), //几乎空信号

.almost_full(), //几乎满信号

.sclr() //清零信号

.);

第四部分是参数设置,这里设置的是scfifo模块的参数,包括宽度、深度以及之前生成步骤中设置的那些参数,代码如下:

defparam

scfifo_component.lpm_width=32, //宽度为32位

scfifo_component.lpm_numwords=2048, //深度为2048字节

scfifo_component.intended_device_family=Cyclone,//器件族为Cyclone

scfifo_component.lpm_type=scfifo, //调用lpm为scfifo

scfifo_component.lpm_showahead=OFF, //关闭showahead模式

scfifo_component.overflow_checking=ON, //打开溢出校验

scfifo_component.underflow_checking=ON, //打开读空校验

scfifo_component.add_ram_output_register=ON; //使用输出寄存器

在生成的3个FIFO模块文件中,还包含一个fifo_test_bb.v文件,这个文件包含的是fifo_test.v文件的第一部分内容,也就是说这个文件是FIFO模块的端口声明模块。

剩下的一个文件是fifo_test_inst.v,inst是实例化的简称。在这个文件里面提供了FIFO模块实例化的模板,代码如下:

fifo_test fifo_test_inst( //fifo_test模块实例化

.data(data_sig), //输入数据

.wrreq(wrreq_sig), //写请求

.rdreq(rdreq_sig), //读请求

.clock(clock_sig), //时钟

.aclr(aclr_sig), //异步清零

.q(q_sig), //输出数据

.full(full_sig), //满信号

.empty(empty_sig), //空信号

.usedw(usedw_sig) //字节使用信号

);

通过复制这个模板至工程设计文件中,即可实现FIFO模块的实例化。在进行实例化时,可以修改实例化的名称以及FIFO模块端口信号线的连线资源名称。

下面是将FIFO实例化在IP_Generate_Test工程中的代码。

moduleIP_Generate_Test(...); //调用FIFO模块的设计文件模块

... //连线资源声明

fifo_test fifo_test_inst1( //实例化为fifo_test_inst1

.data(fifo_data), //FIFO数据输入为fifo_data

.wrreq(fifo_wrreq),

.rdreq(fifo_rdreq),

.clock(fifo_clock),

.aclr(fifo_aclr),

.q(fifo_q),

.full(fifo_full),

.empty(fifo_empty),

.usedw() //未实例化的端口保留空白表示不使用该端口

);

...

endmodule

至此,已经在一个工程中实现了片上FIFO的调用。

2.RAM

这里主要介绍双口RAM模块的生成方法,模块的构造方法及调用方法与FIFO模块类似,不详细介绍。

(1)打开宏模块向导管理器并新建宏模块。

具体方法参见FIFO的方法。

(2)选择宏模块。

在本例中,我们选择LPM_RAM_DP模块进行实现,如图9.20所示。

图9.20选择宏模块

(3)设置DPRAM端口数及容量单位。

在宏模块向导管理器(DPRAM)的第3页,可以设置DPRAM的端口数及容量单位。支持两种DPRAM:1个读端口和1个写端口的DPRAM,2个读端口和2个写端口的DPRAM

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top