vivado学习笔记——ROM IP核调用

server/2024/9/23 10:25:03/

ROM为只读存储器。可以从任意地址上读取数据,但是不能写入。所以ROM中的数据,就需要提前存放进去。在IP核中,可以通过.coe文件进行数据存放,文件格式可以参考Xilinx官方标准。
使用matlab生成.coe文件,数据为正弦波波形数据

% 1. 定义一个数据数组,范围从0到255
data = 0:1:255;% 2. 打开一个名为'sin_data.coe'的文件以供写入
fid = fopen('sin_data.coe','w');% 3. 写入COE文件的头部信息,表示数据是十进制的
fprintf(fid,'memory_initialization_radix = 10;\n');% 4. 写入COE文件的头部信息,表示接下来的数据向量
fprintf(fid,'memory_initialization_vector = \n');% 5. 开始循环,生成1024个数据点
for i = 1:1:1024% 6. 计算sin函数值并将其舍入到整数,然后写入文件fprintf(fid,'%d',round(127*sin(2*pi/1024*i)+127));% 8-9. 检查是否到达数据末尾,如果是,写入分号,否则写入逗号if i == 1024fprintf(fid,';');elsefprintf(fid,',');end% 14-16. 每打印1个数据点后,检查是否需要换行if mod(i,1) == 0fprintf(fid,'\n');end
end% 18. 关闭文件
fclose(fid);

成功生成coe文件
建立vivado工程
新建IP核,打开IP Catalog,在窗口搜索block
在这里插入图片描述
双击打开
选择单端口ROM,修改一下数据的位宽以及深度,位宽默认使用8bit,深度为1024。因为前面做了一个数据量为1024的.coe文件,所以这里深度改为1024。数据输出使能选择为Always Enabled。使输出使能一直有效。输出寄存器:输出会在时钟下输出,导致结果会慢一拍,在此处我们不需要这个选项,因此取消勾选。ROM复位的设置,如果有需要,可以进行勾选。此处,没有使用复位信号,在使用时可自行选择。
在这里插入图片描述
在这里插入图片描述
新建顶层文件
写入代码

module rom(input   wire           clk,
input   wire           rst_n,
output   wire     [7:0]    q
);wire     [9:0]      addr;addr_ctrl addr_ctrl_inst(.clk      (clk),
.rst_n      (rst_n),
.addr      (addr)  
);blk_mem_gen_0 blk_mem_gen_0_inst (
.clka(clk),    // input wire clka
.addra(addr),  // input wire [9 : 0] addra
.douta(q)  // output wire [7 : 0] douta
);endmodule

写地址控制模块:

module addr_ctrl(input   wire           clk,
input   wire           rst_n,
output   reg     [9:0]    addr
);always @ (posedge clk, negedge rst_n)
begin
if(rst_n == 1'b0)addr <= 10'd0;
else if(addr == 10'd1023)addr <= 10'd0;
elseaddr <= addr + 1'b1;
endendmodule

编写testbench代码

module rom_tb;reg            clk;reg            rst_n;
wire     [7:0]    q;initial begin
clk = 0;
rst_n = 0;
#105;
rst_n = 1;
#10000;
$stop;
endalways #10 clk = ~clk;rom rom_inst(.clk      (clk  ),
.rst_n      (rst_n  ),
.q        (q    )
);endmodule

进行仿真
在这里插入图片描述
选中输出q,右键选择wavaform style,然后选择analog就可以看到数字信号变成了模拟信号。
在这里插入图片描述


http://www.ppmy.cn/server/21206.html

相关文章

【Elasticsearch<三>✈️✈️】常见基本属性的用法以及与MySQL的区别

目录 &#x1f378;前言 &#x1f37b;一、索引 1.1 映射关系 &#xff08;mappings) 1.2 映射关系查看 &#x1f37a;二、文档 2.1 删除文档 2.2 更新文档 2.3 批量操作 &#x1f379;三、高级查询&#xff08;Query 检索) &#x1f377;四、章末 &#x1f378;前言 继本…

stm32_HAL_串口不定长数据接收发送

串口代码思路//不包括初始化 变量 uint8_t tx1[256];//缓冲区uint8_t Tx1_size0;//记录数据的个数 接收 产生第一个数据接收-----进入中断----复制数据-----继续接收----在进入中断----复制数据---在接收直到串口第一次数据全部接收完 中断源码 利用中断经行计算字符个数…

MySQL数据库总结

作者&#xff1a;爱塔居-CSDN博客 专栏&#xff1a;数据库 目录 前言 一、数据库操作 1.1 创建数据库 1.2 显示当前数据库 1.3 使用数据库 1.4 删除数据库 二、表的操作 2.1 查看表结构 2.2 创建表 2.3 删除表 三、表的增删改查操作&#xff08;CRUD) 3.1 新增 3.…

Linux中文件描述符与重定向的深入探索

目录 1. 理解C语言的文件操作函数 2. 操作系统的文件操作接口 3. 文件描述符详解和其内核本质 4. 如何理解Linux下一切皆文件 5. Linux中的重定向 5.1 输出重定向 5.2 追加重定向 5.3 输入重定向 6. 结合文件描述符理解重定向 7.重定向的系统调用 在Linux操作系统中&a…

面试逻辑题,有8个小球和一个天平,一个小球偏重,其它小球一样重,问最少称几次可以找出那个重球?

1. 问题描述 现在有8个小球和一个天平&#xff0c;已知其中1个小球偏重&#xff0c;其余小球重量相等。问&#xff1a;最少称几次一定可以找出那个重量更大的小球&#xff1f; 2. 解题思路 第一次称重&#xff1a;将任意三个小球放在天平的左边&#xff0c;将另外三个小球放…

ChatGPT助力测试领域!探索人工智能编写测试用例的新前景

简介 测试用例是测试人员的核心工作内容&#xff0c;是测试人员思想的“实现类”&#xff0c;其充分体现了测试的思路&#xff0c;可以为后续的测试行为提供指导&#xff0c;是测试人员了解业务的重要根据和质量之根本。如果测试用例设计得不完成&#xff0c;出现了遗漏&#x…

B站无限评论暴力截留协议及教程

B站无限评论暴力截留协议及教程 B站无限评论暴力截留协议及教程&#xff0c;需要抓CK &#xff0c;教程里面有讲如何抓取 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

Spring - 4 ( 11000 字 Spring 入门级教程 )

一&#xff1a;Spring IoC&DI 在前⾯的章节中, 我们学习了 Spring Boot 和 Spring MVC 的开发, 可以完成⼀些基本功能的开发了, 但是什么是 Spring 呢? Spring, Spring Boot 和 SpringMVC 又有什么关系呢? 咱们还是带着问题去学习.我们先看什么是Spring 1.1 Spring 是什…