FPGA系统设计原则和技巧之:FPGA系统设计的3种常用IP模块
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
FPGA系统设计 存储器 IP模块 锁相环 高速串行收发器 相关文章:
- FPGA系统设计原则和技巧之:FPGA系统设计的3个基本原则(06-05)
- FPGA系统设计原则和技巧之:FPGA系统设计的3种常用技巧(06-05)
- 基于闪烁存储器的TMS320VC5409 DSP并行引导装载方法(05-23)
- DSP外部Flash存储器在线编程的软硬件设计(07-10)
- 一种新型的多DSP红外实时图像处理系统设计(02-03)
- DSP与普通MCU的比较(02-23)