altera sdram ip 核 verilog_只读存储器IP核ROM

  作者:贺磊

一、 简单介绍

所谓rom就是只读存储器,也就是说,我们不能对其内部写入数据,属于一个内部存储器,但存储数据有限。

二、 操作步骤

1. 创建一个rom的初始化文件———mif文件(用来存储初始化数据),立刻另存为num.mif,如图1所示。

c342923d597c9d81be87d94c1968a0c2.png 

图1

2. 定义位宽和深度(在此次设计中,选择位宽为8,深度为256),如图2所示。

559c4551dc24c5768d659eb186c05785.png

图2 

3. 填充数据(选择从0-255递增的填充方式),如图3,图4所示。

69c2a05b3334722b75a04bfb0e21c3ce.png

图3

99b7caa17e8759d7c38f67fb63d74e09.png

图4

4. Mif文件创建成功,数据从0开始,每次递增1,如图5,6,7所示。

5ddc196c98a2560949e260b997f29410.png

图5

779a8de1a1b37e4b2fdd1aa28433486c.png

图6

48b919be2ca292128b2297f004f516cf.png

图7 

5. 在ip核中创建rom,选择rom:1-port,如图8,9。

38f5a8812b0fbdcd68c86557e2066488.png

图8

5c72c847b1db9c94b35b745b7b76eac4.png

图9 

6. 选择语言类型为verilog,同时为ip核命名,如图10。

a510112cde48ec8af02697bce3285b0e.png

图10 

7. 进入到rom的设置向导,设置深度和位宽(与mif文件保持一致),如图11。

c51538f5a42bbc36df6c8cf1ade33725.png 

图11

8. 去掉端口的寄存器(如果不去掉的话,就会使输出延迟一拍),如图12。

b712ee768deccfa7c8f265134556020d.png 

图12

9. 把我们之前生成的mif文件添加进去,如图13。

ea051c3df11917b3004a3e2dc89c3986.png

如图13

10. 完成rom的设置,如图14。

510be3f3d28414ea90d5f30291fc43db.png

 图14

三、 设计需求

设计一个rom控制器,该控制器负责输出0-255递增的地址数据,将地址总线连接到rom地址输入端,看输出的数据是否正确。

四、 顶层架构设计

ccf1f09207d85a38b600d80cbaaccd69.png

说明:由于是rom是只读存储器,需要我们指定地址,它才能输出地址对应的数据。

五、 建模与验证

        /*Author : 贺磊

          Data :2017/2/19

          Mode : rom_control

        */

        00module rom_control(clk, rst_n, addr);

        01

        02input clk;//系统时钟50m

        03input rst_n;//复位低电平有效

        04output reg [7:0] addr;

        05

        06always @ (posedge clk or negedge rst_n)

        07begin

        08if(!rst_n)

        09addr <= 0;

        10else if(addr < 255)

        11addr <= addr + 1;

        12else

        13addr <= 0;

        14end

        15

        16endmodule 

        17

        /*Author : 贺磊

          Data :2017/2/19

          Mode : rom

        */

        00module rom(clk, rst_n, q);

        01

        02input clk;//系统时钟50m

        03input rst_n;//低电平复位有效

        04output [7:0] q; //rom输出数据

        05

        06wire [7:0] addr;//中间地址寄存器

        07

        08rom_control rom_con(

        09.clk(clk), 

        10.rst_n(rst_n), 

        11.addr(addr)

        12);

        13

        14my_rom my_rom(

        15.address(addr),

        16.clock(clk),

        17.q(q)

        18);

        19

        20endmodule 

        21

RTL级视图如下:

c747b4083911e4ef3adf4a567870a2be.png 

Testbench的验证:

        /*Author : 贺磊

          Data :2017/2/19

          Mode : rom_tb

        */

        00`timescale 1ns/1ps

        01module rom_tb;

        02

        03reg clk;

        04reg rst_n;

        05wire [7:0] q;

        06

        07rom rom_dut(

        08.clk(clk), 

        09.rst_n(rst_n), 

        10.q(q)

        11);

        12

        13initial

        14begin

        15clk = 1;

        16rst_n = 0;

        17#200.1

        18rst_n = 1;

        19end

        20

        21initial

        22#6000 $stop;

        23

        24always #10 clk = ~clk;

        25

        26endmodule 

        27

仿真结果如下:

1249d65d678ecb7a8bfb610de30d7f36.png

97833b290b0efe8bfe7384981ef987c5.png

说明:从仿真我们可以清楚的看到,当地址开始变化的时候(从0-255),数据也在随着地址的变化而变化,也就是说地址递增一位,数据也会在下一拍递增一位。而这下一拍是由rom内部结构决定的,从而验证我们设计正确。

——END——

注:至芯科技已开设FPGA初级直播课,有需要的小伙伴可以分享这篇文章并截图。发送到以下微信,即可获取直播链接。并有机会加入直播授课群,和志同道合的朋友一起探讨、学习

f2f67c9ea43d510a5380c9e9d2197f9a.png

欢迎关注FPGA设计论坛,实时获取更多FPGA相关资讯

3a8f70b2bd84812aef56b08fbe0e9076.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值