您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

存储器IP核生成 非对齐读写 vivado

存储器制作(含非对齐读写)

1. 创建ROM 和 RAM IP核

参考马德老师lab0PPT

1.新建一个项目ROM,选择芯片,创建。

image-20220419220043759

2.搜索memory generator.

image-20220419220228201

3.双击

4.设置好后点击OK

width写32 另一个写1024

5.编写ROM.coe

memory_initialization_radix=16;
memory_initialization_vector=
0000000, 11111111, 22222222, 33333333, 44444444, 55555555, 66666666, 77777777, 88888888, 99999999, aaaaaaaa, bbbbbbbb, cccccccc, dddddddd, eeeeeeee, ffffffff, 557EF7E0, D7BDFBD9, D7DBFDB9, DFCFFCFB, DFCFBFFF, F7F3DFFFF, FFFFDF3D, FFFF9DB9, FFFFBCFB, DFCFFCFB, DFCFBFFF, D7DB9FFF, D7DBFDB9, D7BDFBD9, FFFF07E0, 007E0FFF, 03bdf020, 03def820, 08002300;

用记事本编写然后保存设置后缀(全部文件)。

6.双击xci

image-20220419220406392

7.点击RST & initialization,导入ROM.coe

8.点击IP Sources,查看调用模式

RAM基本相同,在memory generator处选择上一个有时钟输入的即可。

2. TOP文件编写

要求是在指定的地址写入32’h12345678

    assign wired=32'h12345678;

    always @(posedge clk)begin
        //读数的低16
        //给寄存器赋值
        if(flag==3'b000)begin
            adr<=add[0]?add+2'b10:add;
            flag<=3'b001;
        end
        //第一次赋值成功后 赋值第二次
        else if(flag==3'b001)begin
            adr<=add;
            flag<=3'b010;
        end
        //RAM读出第一次adr的值 给低16位输出
        else if(flag==3'b010)begin
            //result[31:16]<=add[0]?result1[15:0]:result1[31:16];
            store_result[63:32]<=result1;
            result[15:0]<=add[0]?result1[31:16]:result1[15:0];
            flag<=3'b011;
        end
        else if(flag==3'b011)begin
            store_result[31:0]<=result1;
            result[31:16]<=add[0]?result1[15:0]:result1[31:16];
            flag<={LES,2'b00};
        end
        else if(flag==3'b100)begin
            //wr<=add[0]?{store_result[31:16],wired[15:0]}:wired;
            wr<=add[0]?{result1[31:16],wired[31:16]}:wired;
            myLES<=1;
            flag<=3'b101;
        end
        else if(flag<=3'b101)begin
            wr<=add[0]?{wired[15:0],store_result[47:32]}:wired;
            myLES<=add[0]?1'b1:1'b0;
            adr<=add+2'b10;
            flag<=3'b110;
        end
        else if(flag<=3'b110)begin
            myLES<=1'b0;
            flag<=3'b000;
        end
    end

简单实现一个状态机。

  • 寄存器每次要在下一个时钟周期才能更新值。
  • RAM在寄存器更新之后需要一个时钟周期才能读出地址的值(write first RAM)
  • 通过myLES信号实现只给特定时钟周期的写使能。

进行引脚约束下板即可。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进