IP核之RAM
Xilinx 推出的 RAM IP 核分为两种类型:单端口 RAM 和双端口 RAM。其中双端口RAM 又分为简单双端口 RAM 和真正双端口 RAM。对于单端口 RAM,读写操作共用一组地址线,读写操作不能同时进行;对于简单双端口 RAM,读操作和写操作有专用地址端口(一个读端口和一个写端口),即写端口只能写不能读,而读端口只能读不能写;对于真正双端口 RAM,有两个地址端口用于读写操作(两个读/写端口),即两个端口都可以进
行读写。
单端口 RAM 接口信号
RAM 读写操作模式共分为三种:
- Write First(写优先模式):若我们在在同一个时钟沿下对同一个地址进行读写,则读出的数据为写入的数据。 Read
- First(读优先模式):若我们在在同一个时钟沿下对同一个地址进行读写,则读出的数据为该地址写入数据前存储的数据。
- Change(不变模式):在该模式下不能同时进行读写操作,输出数据为同时读写操作前输出的数据。
RAM module模块
ram_256x8 your_instance_name (
.clka(clka), // input clka
.wea(wea), // input [0 : 0] wea写使能信号,高电平有效。在 RAM中,该信号固定存在。低电平时读
.addra(addra), // input [7 : 0] addra
.dina(dina), // input [7 : 0] dina写入 RAM 的数据,位宽为 8bit。
.douta(douta) // output [7 : 0] douta读出 RAM中的数据,位宽也是 8bit。
);
注:若RAM未初始化则在第一次操作时需先写入。
IP核之ROM
ROM 的读操作是在读时钟的上升沿触发的,在读时钟上升沿我们只要给相应的地址就能在时钟的上升沿读出该地址内的数据了。
建立该文件时必须初始加载 .coe 格式文件
文件格式:
MEMORY_INITIALIZATION_RADIX=10; //表示ROM内容的数据格式是10进制
MEMORY_INITIALIZATION_VECTOR=
0,
1,
2,
3,
~~~
253,
254,
255; //每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号
rom256x8 your_instance_name
(
.clka (sys_clk) , // input clka
.addra (address) , // input [7 : 0] addra
.douta (ROM_Data) // output [7 : 0] douta
);
IP核PLL
其中 RESET 为异步复位管脚,用来对 PLL IP 进行异步复位,LOCKED 为锁定管脚,用来检测 PLL IP 核是否已经锁定,当输出时钟稳定时该信号会输出高电平表示输出稳定。
module pll
(
input wire sys_clk , //系统时钟50Mhz
output wire clk_mul_2 , //系统时钟经过
output wire locked //检测锁相环是否已经锁定,
//只有该信号为高时输出的时钟才是稳定的
);
pll_ip pll_ip_inst
( // Clock in ports
.CLK_IN1 (sys_clk ),
// Clock out ports
.CLK_OUT1 (clk1 ),
// Status and control signals
.LOCKED (locked )
);
wire clk1; //局部变量
//调用ODDR2源语使时钟信号通过普通IO口输出
ODDR2 #(
.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1"
.INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1
.SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset
)
ODDR2_inst1
(
.Q(clk_mul_2), // 1-bit DDR output data
.C0(clk1), // 1-bit clock input
.C1(~clk1), // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D0(1'b1), // 1-bit data input (associated with C0)
.D1(1'b0), // 1-bit data input (associated with C1)
.R(1'b0), // 1-bit reset input
.S(1'b0) // 1-bit set input
);