|
在该页面中,我们去掉了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 调试观察
————————————————
版权声明:本文为CSDN博主「ciscomonkey」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ciscomonkey/article/details/84549195
|
|