verilog基础篇RAM IP核的使用

在这里插入图片描述
在这里插入图片描述
在该页面中,我们去掉了q output port(去掉输出寄存器),并且添加了一个rden读使能信号,所谓rden读使能信号就是,当该信号为高电平时,我们才可以读取RAM IP核中的数据。
其余的页面我们使用默认设置即可,不要忘记勾选inst初始化模板文件。

//该代码主要实现了先往RAM IP核中的0-31地址写入0-31数据,
//每个地址对应一个数据,比如0地址对应0数据,1地址对应1数据,以此类推
//写完了32个数据之后,我们在将RAM IP核中的0-31地址中的数据读出
//当写数据时,我们需要将写使能信号拉高,当读数据时,我们需要将读使能信号拉高

//该代码主要实现了先往RAM IP核中的0-31地址写入0-31数据,
//每个地址对应一个数据,比如0地址对应0数据,1地址对应1数据,以此类推
//写完了32个数据之后,我们在将RAM IP核中的0-31地址中的数据读出
//当写数据时,我们需要将写使能信号拉高,当读数据时,我们需要将读使能信号拉高

module verilog_ip_RAM
(
input clk_50M,
input   RST_N,
/*RAM端口*/
output reg [4:0] address,  //RAM的地址端口
output reg [7:0] wrdata,   //RAM的写数据端口
output [7:0] rddata,   //RAM的读数据端口
output reg [5:0] time_cnt,  //计数器
output  wren,					//RAM的写使能端口
output  rden					//RAM的读使能端口
);

//计数器
reg [5:0] time_cnt_n;//time_cnt的下一个状态
 //RAM的地址端口
reg [4:0] address_n;  //address的下一个状态
 //RAM的写数据端口
reg [7:0] wrdata_n;  //wrdata的下一个状态

//时序逻辑电路,用来给time_cnt寄存器赋值
always @ (posedge clk_50M or negedge RST_N)
begin
if(!RST_N)
	time_cnt<=1'b0;
else
	time_cnt<=time_cnt_n;
end

/*组合电路*/
always @ (*)
begin
	if(time_cnt==6'd63)
		time_cnt_n=0;
	else
		time_cnt_n=time_cnt+1;
end

/*时序电路,用来给address寄存器赋值*/
always @ (negedge clk_50M or negedge RST_N)
begin
	if(!RST_N)
		address<=1'b0;
	else
		address<=address_n;
end

/*组合电路,用来生成RAM地址*/
always @ (*)
begin
	if(address==5'd31)
		address_n=1'b0;
	else
		address_n=address+1'b1;
end

/*组合电路,根据计数器用来生成RAM写使能*/
assign wren = (time_cnt>=1'b0&&time_cnt<=5'd31)?1'b1:1'b0;

/*时序电路,用来给wrdata寄存器赋值*/
always @ (negedge clk_50M or negedge RST_N)
begin
		if(!RST_N)
			wrdata<=1'b0;
		else
			wrdata<=wrdata_n;	
end

/*组合电路,根据计数器用来生成写入RAM的数据*/
always @ (*)
begin
	if(time_cnt>=1'b0&&time_cnt<=5'd31)
		wrdata_n=time_cnt;
	else
		wrdata_n=wrdata;

end

/*组合电路,根据计数器用来生成RAM读使能*/
assign rden =(time_cnt>=6'd32&&time_cnt<=6'd63)?1'b1:1'b0;

/*RAM IP核模块*/

RAM	RAM_inst (
	.address ( address ),  //RAM的地址端口
	.clock ( clk_50M ),  //时钟端口
	.data ( wrdata ),//RAM的写数据端口
	.rden ( rden ),	//RAM的读使能端口
	.wren ( wren ),   //RAM的写使能端口
	.q ( rddata )     //RAM的读数据端口
	);
	
endmodule

在这里插入图片描述
写数据如上图所示
从图中可以看到写使能信号为高,读使能信号为低时候,该操作就是往RAM IP核里面写数据。
上升沿,数据生成由time_cnt生成,在下降沿进行写数据,由上图可以看到在地址30的时候,就写入数据30,在地址31的时候,就写入数据31.

在这里插入图片描述
读数据如上图所示
读数据由于有一个寄存器的延时,在下降沿的地址递增,在下一个上升沿输出对应地址的数据。
也可以用signal tap II 调试观察

在这里插入图片描述
在这里插入图片描述

  • 11
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值