FPGA自学——存储器模型

发布于:2025-07-23 ⋅ 阅读:(20) ⋅ 点赞:(0)

FPGA自学——存储器模型

一、IP核

一)概念:是指芯片中具有独立功能的电路模块的成熟设计

二)常见IP核:

1.逻辑运算:与、或、非、异或等基本逻辑运算单元和复用器、循环位移器、三态缓存器和解码器等相对复杂的逻辑运算模块

2.数学运算:分为整数运算和浮点运算

整数运算:加法器、减法器、乘法器、除法器、比较器、计数器和绝对值计算器

浮点运算:浮点数加法器、浮点数减法器、浮点数乘法器、浮点数除法器、浮点数平方根计算器、浮点数指数计算器

3.存储器IP:移位寄存器、触发器、锁存器的简单的存储器IP核和较为复杂ROM、RAM、FIFO和Flash存储器等模块

4.输入/输出IP核:时钟控制器、锁相环(PLL),低电压差分信号(LVDS)、收发器、双数据速率(DDR)I/O、访问外部存储器的DQ-DQS I/O,I/O缓存器

5.数字信号处理IP核:有限冲激响应滤波(FIR)编译器,级联积分梳状(CIC)滤波器编译器、数控振荡器(NCO)编译器以及快速傅里叶交换(FFT)等IP核,用于数字信号系统设计

6.数字通信IP核:RS码编通器、循环冗余校验(CRC)编译器、8B/10B编/译码器、SONET/SDH物理层IP核

7.图像处理IP核:2D FIR滤波器、2D中值滤波器、α混合器、视频监视器、色度重采样器、图像裁剪器、视频输入和输出模块、测试模板生成器、视频跟踪系统模块

8.芯片接口IP核:数字视频广播(DVB)的异步串行接口(AS1)、10/100/1000Mbps以太网接口、DDR和DDR2 SDRAM控制器、存储器物理层访问接口、PCI/PCI Expresso编译器、Rapidlo和用于数字电视信号传输的串行数字接口(SDI)

9.设计调试IP核:ILA逻辑分析仪、串行和并行Flash加载器、系统内的源和探测模块、虚拟JTAG

10.其他

三)应用示例

情况1: 某芯片,有500个寄存器,需要在上电的时候由FPGA向这些寄存器中写入初始值,初始值通过相应的文档给出来了具体值,这些值都是已知的

特点: 数据量较多; 数值已知固定;上电工作(一次);只需要读取

功能选用: ROM:只读存储器

情况2: 信号源(ADC)以1微妙一个的速率产生12位的数据现要求获得连续1毫秒内的数据,通过串口以115200的波特率发送到电脑

特点: 数据量1000(总数有限); 数据内容未知;数据的使用速度低于数据的产生速度(速率不匹配);需要重复利用(位宽不同)

速度计算: 串口——以两次六位的方式进行传输,每次传输的bit数((起始位+停止位)+6)bit = 8bit

​ 每个bit传输的时间为1000_000_000ns/115200 ≈ 8680ns ,一组数据传输8680ns*8 = 69440ns = 69.4微妙

​ 数据源——1微妙产生两组数据,一组数据的产生 = 0.5微妙

存在问题: 数据生产(12)和消耗(6)的位宽不同——需要重复利用

功能选用: RAM:可读可写

二、ROM(read only memory)

定义:只读存储器

特点:非易失性,断电后数据不会丢失

应用:嵌入电脑主板或者做移动存储介质,体积够小,提供的容量可以比光盘核软盘的大,速度也不慢

延展:

EPROM Erasable Program ROM (可擦除编程ROM) 紫外线光擦除
EEPROM Electric Erasable Program ROM (电可擦除编程ROM) 一次擦除一个字节
FLASH 按块擦除

三、ROM的IP核调用

1.新建一个rom_test的工程文件

2.选择对应的IP核,选择块存储器生存器

在这里插入图片描述

3.配置相关参数
在这里插入图片描述
在这里插入图片描述

4.生成并加载rom的初始化文件

【原创】Mif精灵/mif(coe)文件生成器 - 芯路恒资料与技术支持专区 - 芯路恒电子技术论坛 - Powered by Discuz!下载Mif_Make_V2.4_exe.zip文件,并压缩打开使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5.查看总结

在这里插入图片描述

6.生成

在这里插入图片描述

7.查看IP核相关的代码

找到例化代码

在这里插入图片描述

8.编写测试文件

在这里插入图片描述

`timescale 1ns / 1ps

module rom_tb();

    reg clka;
    reg [9:0] addra;
    wire [9:0] douta;

rom rom_inst0 (
  .clka(clka),    // input wire clka
  .addra(addra),  // input wire [9 : 0] addra
  .douta(douta)  // output wire [9 : 0] douta
);
    //产生时钟,以50MHz为准
    initial clka = 1;
    always #10 clka = ~clka;//也可以写为clka = !clka;
    
    initial begin
        addra = 100;
        #201;
        repeat(30000) begin //repeat循环
            addra = addra + 1'b1;
            #20;
        end
        #2000;
        $stop;
    end
endmodule

9.查看波形

数字波形,修改为十进制进行查看

在这里插入图片描述

模拟波形

在这里插入图片描述

四、RAM(random access memory)

一)介绍

定义:随机存储器,它可以随时把数据写入到任何一指定地址的存储单元,也可以随时从任一指定地址读出数据,其读写速度由时钟频率决定,主要用来存放程序以及程序执行过程中产生的数据,运算结果等

种类:

在这里插入图片描述

五、RAM的IP核调用

1.创建一个ram_test的项目工程文件

2.选用block ram的IP核

3.设计数据流向模块图

在这里插入图片描述

4.根据数据流向模块图选择配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5.点击生成即可

三)仿真测试

1.跟上面rom的步骤基本一致

2.仿真代码实现

`timescale 1ns / 1ns


module ram_tb();

reg          clka     ;
reg          ena      ;
reg          wea      ;
reg [15 : 0] addra    ;
reg [15 : 0] dina     ;
reg          clkb     ;
reg          enb      ;
reg [15 : 0] addrb    ;
wire [15 : 0] doutb    ;


ram ram_inst0 (
  .clka     (clka),    // input wire clka
  .ena      (ena),      // input wire ena
  .wea      (wea),      // input wire [0 : 0] wea
  .addra    (addra),  // input wire [15 : 0] addra
  .dina     (dina),    // input wire [15 : 0] dina
  .clkb     (clkb),    // input wire clkb
  .enb      (enb),      // input wire enb
  .addrb    (addrb),  // input wire [15 : 0] addrb
  .doutb    (doutb)  // output wire [15 : 0] doutb
);

initial clka = 1;
always #10 clka = ~clka;
initial clkb = 1;
always #15 clkb = ~clkb;

initial begin
    //初始化
    ena   = 0 ;
    wea   = 0 ;
    addra = 0 ;
    dina  = 0 ;
    
    enb   = 0 ;
    addrb = 0 ;
    
    //写入
    #201
    repeat(65536) begin
        ena = 1;
        wea = 1;
        #20;
        addra = addra + 1'b1;
        dina = dina + 1'b1;
        
    end
    ena = 0;
    wea = 0;
    #2000;
    
    //读出
    addrb = 65536;
    #300
    repeat (65535) begin
        enb = 1;
        #30 
        addrb = addrb - 1'b1;
    end
    #2000
    $stop;
end

endmodule

3.仿真结果

在这里插入图片描述

总结

1.不同波形的使用的存储器

在这里插入图片描述

2.块与分布式的选择

区别 distributed(分布式) block(块式)
资源 LUT(查找表——本质是很小的ram) Block Memory(嵌入式的硬件RAM)
调用方式 需要多少拿多少 成块拿取
用户需求 需求小,选用分布式 需求大,选用块式

3.FPGA与模块的容量资源计算

以TFT屏幕为例:

**计算FPGA的最大容量:**RGB565 -> 需要16位宽 -> 选取的配置为16K×2 -> xc7z015-2(blocl ram有95)-> 计算最大容量:16K×95 = 190K

**TFT模块:**RGB565 -> 需要16位宽 -> 屏幕大小800×480 =384K -> 需要容量 = 384K × 16 =

**资源不足时解决方法:**选择部分屏幕进行显示

4.控制写入的ena和wea的区别

区别 ena wea
名称 Enable的缩写 Write Enable A的缩写
作用 控制RAM块是否激活或工作 控制数据是否写入到指定地址的RAM中

wea使用时要注意位宽给限定字节大小的整数倍,wea的位宽位数就是倍数

在这里插入图片描述

手册wea的使用案例
在这里插入图片描述

5.下载手册资源的方式

1.使用vivado自带功能进行下载

在这里插入图片描述

2.查看文件

在这里插入图片描述

3.如果无法成功下载,或下载后的文件打不开,使用自动打开的官网入口

在这里插入图片描述

4.根据关键字进行搜索

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到