分享

【FPGA学习】三步让你从零开始成为ram控制器的设计达人

 西北望msm66g9f 2018-06-28

导读:本文是电子发烧友电子说专栏“FPGA学习交流”作者发布内容,编者觉得对基于FPGA项目开发很具有实用参考价值,特分享给大家~


设计背景:


随机存取存储器(random access memory,RAM)又称作'随机存储器',是与CPU直接交换数据的内部存储器,也叫主存(内存)。


它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。


设计原理: 


本次设计我们通过调用我们的RAM的IP核来给它写我们的控制器,来实现RAM的可读可写的特点。


我们设计的是RAM的深度为256,我们先写256个数,然后再读出我们写的256个数。值得一说的是,我们的读写标志是高位为写标志,低位为读标志。


设计步骤,打开我么的调用IP核的界面,然后下一步:



在下面的选项中选出我们RAM,如图所示,然后起一个我们的输出名,然后下一步:



在下面的页面中我们设置我们的位宽和深度,然后设置如下,下一步:



下面的页面中,问我们设置不设置我们的输出寄存器,我们不要设置,如下,然后下一步:



然后下一步,下一步,直接到下面的界面,选择生成.inst文件,然后完成。



设计架构图:



设计代码:


顶层模块


0 module ram(clk ,rst_n ,q); //输入输出端口设置

1  input clk;

2  input rst_n;

4  output [7:0] q;

6  wire [7:0] data;

7  wire wren;

8  wire [7:0] address;

10 ram_contl ram_contl( //例化我们的RAM控制器

11   .clk(clk),

12   .rst_n(rst_n),

13   .data(data),

14   .wren(wren),

15   .address(address)

16   );

17 my_ram my_ram_inst (   //例化ip核

18   .address ( address),

19   .clock ( clk),

20   .data ( data),

21   .wren ( wren ),

22   .q (q)

23 );

24 endmodule 


设计模块


0 module ram_contl(clk,rst_n,data,wren,address);

1  input clk;

2  input rst_n;

4  output reg [7:0] data;   //输出

5  output reg wren;    //读写位

6  output reg [7:0] address;  //地址位

8  reg state;

9  always @(posedge clk or negedge rst_n)

10  if(!rst_n)

11   begin

12    data <>

13    wren <>

14    address <>

15    state <>

16   end

17  else

18   begin

19    case (state)

20     0:begin

21      wren <= 1'b1;  >

22      if(address <>

23       begin

24        address <= address + 1'b1; >

25        data <= data + 1'b1;     >

26       end

27      else

28       begin

29        address <= 1'b0;  >

30        data <>

31        state <>

32        wren <>

33       end

34      end

35     1:begin

36      if(address < 255)   >

37       begin

38        address <>

39       end

40      else

41       begin

42        address <>

43        state <>

44       end

45      end

46     default: state <>

47    endcase

48   end

49 endmodule 


测试模块


0 `timescale 1ns/1ps

2 module ram_tb();

3  reg clk;

4  reg rst_n;

6  wire [7:0] q;

8  initial begin

9    clk = 1'b1;

10   rst_n = 1'b0;

11

12   #100.1 rst_n = 1'b1;

13

14   #200000.1 $stop;

15

16  end

17

18 always #10 clk = ~clk;

19

20ram ram_dut (

21  .clk(clk) ,

22  .rst_n(rst_n),

23  .q(q)

24  );

25

26endmodule 


仿真图:


在图中我们可以看到,我们写入的数据,和我们读出的数据是相同的。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多