全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 可编程逻辑 >

FPGA学习系列:16. rom控制器设计

时间:2018-06-13 11:21

人气:

作者:admin

标签:

导读:设计背景: ROM是只读存储器(Read-Only Memory)的简称,是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的电...

设计背景:

ROM是只读存储器(Read-Only Memory)的简称,是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的电子或电脑系统中,并且资料不会因为电源关闭而消失。

ROM是由英文Read only Memory的首字母构成的,意为只读存储器。顾名思义,就是这样的存储器只能读,不能像RAM一样可以随时读和写。它只允许在生产出来之后有一次写的机会,数据一旦写入则不可更改。它另外一个特点是存储器掉电后里面的数据不丢失,可以存放成百上千年。此类存储器多用来存放固件,比如计算机启动的引导程序,手机、MP3、MP4、数码相机等一些电子产品的相应的程序代码

设计原理:

我们的设计是读ROM的数据,然后读到最后一个数据的时候,然后又从最后的地址往回读数据,来实现循环读数。

首先我们先创建一个.mif文件,然后给对应的地址中写如数据,然后设计一个IP核,之后通过读ROM的地址,来读出ROM中存在的数据,具体的操作如下面的操作。

下一步,建立一个深度256,位宽为8的 .mif。

然后在第一个地址右键。

填写开始地址以及结束地址,我们给每一位的地址位写上和地址一样的数据,那么就是数据从0开始,步进为1,如下,然后然后完成,保存。

这样我们写好我们.mif文件,然后进行下面的步骤。

选择我们所选的硬件描述语言,我们都是verilog HDL,然后选择我们文件生成的路径,下一步。

设置我们的输出的位宽,和深度,我们的深度256,位宽8,下一步。

去掉输出是否有寄存器的对勾,如果选了输出会晚一拍,因为加了一个输出寄存器。

然后出现下面的界面,点击,选择我们生成的.mif文件,添加进来,然后下一步,下一步完成。

设计架构图:

设计代码:

顶层模块

0modulerom(clk,rst_n,data);

1 inputclk;

2 inputrst_n;

3

4 output[7:0]data;

5

6 wire[7:0]address;

7

8 rom_r rom_r ( //例化ROM控制器模块

9 .clk(clk),

10 .rst_n(rst_n),

11 .address(address)

12 );

13

14 my_rom my_rom_inst (//例化IP核模块

15 .address (address ),

16 .clock (clk ),

17 .q (data )

18 );

19

20endmodule

设计模块

0modulerom_r(clk,rst_n,address);

1

2 inputclk;

3 inputrst_n;

4

5 outputreg[7:0]address;

6

7 reg[1:0]state;

8 always@(posedgeclk ornegedgerst_n)

9 if(!rst_n)

10 begin

11 address <= 1'b0;

12 state <= 1'b0;

13 end

14 else

15 begin

16 case(state)

17 0:begin

18 if(address < 255)    //判断地址

19 begin

20 address <= address + 1'b1; //地址激增

21 end

22 else

23 begin

24 if(address ==255)//判断是否读完

25 begin

26 address <= address - 1'b1; 

27 state <= 1;

28 end

29

30 end

31 end

32 1:begin

33 if(address >0)//读完就跳转一状态后让地址减1

34 begin

35 address <= address - 1'b1;

36 end

37 else

38 begin

39 address <= address + 1'b1;

40 state <= 0;

41 end

42 end

43 default:state <= 0;

44 endcase

45 end

46endmodule

测试模块

0`timescale1ns/1ps

1

2modulerom_tb();

3

4 regclk;

5 regrst_n;

6

7 wire[7:0]data;

8

9 initialbegin

10 clk =1'b1;

11 rst_n =1'b0;

12

13 #100.1rst_n =1'b1;

14

15 #20000$stop;//20000NS后停止仿真

16

17 end

18

19 always#10clk =~clk;//产生50M时钟

20

21 rom rom_dut ( //例化顶层模块

22 .clk(clk),

23 .rst_n(rst_n),

24 .data(data)

25 );

26endmodule

仿真图:

仿真中我们可以看到和我们的设计一样,我们先从0地址读数据,当读到最后一个数后,然后返回来从最后一个地址开始读数。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信