Verilog基础之十三、ROM实现

news2024/9/30 11:35:28

目录

一、前言

二、非IP核设计

2.1 工程设计文件读取初始化

2.2 测试代码

2.3 仿真结果

三、IP核创建ROM

3.1 IP核生成ROM

3.2 设计代码

3.3 测试代码

3.4 仿真结果

四、modelsim设置

4.1 模拟信号显示

4.2 信号范围显示设置

五、数据文件


一、前言

    对于工程中的存储逻辑分为两种,一种是可读可写的RAM,另一种是只能读取的ROM,两者的数据读取都是通过地址来查找。对于ROM,因为是只能读取不能写入,里面的数据在初始化时进行存入。

二、非IP核设计

    通常ROM的实现是调用IP核,在IP核创建时使用coe文件进行初始化,coe文件中存储了初始化的数据,工程设计中IP核和data文件(如txt文件)读取两种方式来设计ROM。

2.1 工程设计文件读取初始化

    设计用初始化ROM使用txt文件的数据,使用了正弦波,方波,三角波三种波形的txt文件数据,初始化都再对齐进行读取,存储器的数据宽度为8,深度为512。

module ROM( rst,clk,o_sine,o_squ,o_tri );
input clk;
input rst;   //复位信号
output  o_sine,o_squ,o_tri;
reg [7:0] o_sine,o_squ,o_tri;    //存储的数据位宽为8位
//parameter INIT_FILE = "../dat/ram_init.dat"reg [7:0] ROM [255:0];
parameter SINE_FILE = "sine.txt";  //正弦波形数据
parameter SQUARE_FILE = "square.txt";  //方波数据
parameter TRI_FILE = "triangle.txt";   //三角波数据
reg [7:0] sine_rom [511:0];       //存储器的深度为512
reg [7:0] square_rom[511:0];
reg [7:0] tri_rom [511:0];
reg [8:0] cnt;
initial
begin: file 
$readmemh(SINE_FILE, sine_rom);    //对数据进行读取
$readmemh(SQUARE_FILE, square_rom);
$readmemh(TRI_FILE, tri_rom);
end
always@(posedge clk,negedge rst)
begin
if(!rst)
begin
o_sine<=8'b0;
o_squ<=8'b0;
o_tri<=8'b0;
cnt<=0;
end
else if(cnt<512)
begin
o_sine<=sine_rom[cnt];
o_squ<=square_rom[cnt];
o_tri<=tri_rom[cnt];
cnt<=cnt+1;
end
else
cnt<=0;
end

2.2 测试代码

`timescale 1ns / 1ps
module ROM_tb(  );
reg rst,clk;
wire [7:0] o_sine,o_squ,o_tri;
initial 
begin
clk=0;
rst=1;      //低电平复位信号赋初始值1
#40 rst=0;
#60 rst=1;
end

ROM ROM_test(.rst(rst),.clk(clk),.o_sine(o_sine),.o_squ(o_squ),.o_tri(o_tri) );
always #1 clk=~clk;    //时钟周期为2ns
endmodule

2.3 仿真结果

结果中红色,绿色,粉红分别为正弦波,方波,三角波,因clk周期为2ns,深度为512,故一个大波形周期为1024ns,根据1、2号框的坐标差3169-2145=1024ns符合预期。

三、IP核创建ROM

    本章节介绍使用ROM的IP核穿穿件ROM,并通过coe文件进行初始化ROM,再进行读取,使用的器件为xc7k480tffv1156-1

3.1 IP核生成ROM

    Flow Navigator窗口中IP Catalog进行创建

双击IP Catalog进入创建界面,在Search栏输入ROM,选择分布式方式创建

memory config配置界面中Depth为存储器深度,Data Width为存储数据的宽度,类型为ROM

Port config配置界面默认即可,重点为RST&Initialization界面

coe文件格式,第一行指定数据的进制,第二行为数据,以空格区分不同的地址,如7d和7b表示两个不同地址的数据。

3.2 设计代码

module ROM_top( clk,rst,addr,data);
input clk,rst;
output [8:0] addr;
output [7:0] data;
ROM_IP ROM_addr(.clk(clk),.rst(rst),.addr(addr));  //调用ROM_IP获取地址
dist_mem_gen_0 IP_test(.a(addr),.spo(data));	//调用ROM的IP核读取数据

endmodule

获取地址的代码

module ROM_IP( clk,rst,addr);
input clk,rst;
output reg [8:0] addr;
always@(posedge clk,negedge rst)
begin
if(!rst)
    addr<=9'b0;
else
    addr<=addr+1;
end
endmodule

文件结构

3.3 测试代码

module ROMIP_tb;
reg clk,rst;
wire [8:0] addr;
wire [7:0] data;
initial
begin
clk=0;
rst=0;
#40 rst=1;
end
always#1 clk=~clk;  //时钟clk周期为2
ROM_top ROM_toptest(.clk(clk),.rst(rst),.addr(addr),.data(data));
endmodule

3.4 仿真结果

输出结果为正弦波,周期为1024ns

四、modelsim设置

4.1 模拟信号显示

modelsim默认显示数字信号,需要显示模拟信号时,如上述章节结果中的正弦波,三角波显示时,进入“Format->Format->analog(automatic)”,即显示为模拟信号

4.2 信号范围显示设置

    在4.1中设置模拟信号显示后,容易出现该信号与其他信号重叠  ,下图中不仅重叠,也显示不全

原因为信号显示的高度height默认为17,将其调大即可,设置路径Format->Height

此处为140

设置后显示信号完整直观

五、数据文件

初始化用到正弦波,三角波的数据文件coe和txt获取路径,下载后将文件直接放入和.v文件同路径目录下即可无需修改源文件中代码路径直接使用

链接:https://pan.baidu.com/s/1MEsTEZJdDjaxNTUB9RF8ww  

提取码:60eu

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IMX6ULL系统移植篇-uboot启动Log信息

一. 进入uboot 命令模式 只有启动 uboot&#xff0c;进入 uboot的命令行模式时&#xff0c;才能使用 uboot 的命令。 当开发板启动时&#xff0c;快速按下回车键即可进入 uboot命令行模式。这时&#xff0c;进入 uboot 的命令行模式以后输入“help” 或者 “&#xff1f;” &a…

基因遗传进化算法-找最优路径

import random import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"]["SimHei"] #设置字体 plt.rcParams["axes.unicode_minus"]False #该语句解决图像中的“-”负号的乱码问题# 创建初始种群 def create_initial_population():popu…

1024天,CSDN上的时间之旅

1024天&#xff0c;CSDN上的时间之旅 感想收获未来规划职业规划创作规划 感想 今天是在CSDN这个博客上成为博主已经迈入了1024天。这个数字对于计算机领域来说&#xff0c;具有特殊的含义和重要性。 在计算机科学中&#xff0c;1024是2的十次方&#xff0c;也就是2^10。这意味…

rt-thread------串口V1(三)接收

系列文章目录 rt-thread 之 fal移植 rt-thread 之 生成工程模板 STM32------串口理论篇 rt-thread------串口V1版本&#xff08;一&#xff09;配置 rt-thread------串口V1版本&#xff08;二&#xff09;发送篇 文章目录 系列文章目录一、串口的接收中断接收DMA接收 一、串口…

从一次netty分享漫谈

从一次netty分享漫谈 1.前言 上周五&#xff0c;笔者所在的开发小组&#xff0c;组织了一场分享&#xff0c;内容是netty的入门。笔者所在的团队&#xff0c;基本上就是在各条业务线中活蹦乱跳&#xff0c;有经验的看官&#xff0c;到这里已经可以给出分享效果的总体预测&…

Gradle 各个版本下载

每次都要找下载地址&#xff0c;还是记录一下好找点。 http://services.gradle.org/distributions

Unreal 5 官方在Niagara里模拟大型群体笔记

官方视频地址&#xff1a;https://www.bilibili.com/video/BV1FX4y1T7z2/ 如果需要&#xff0c;请查看官方视频。 性能测试 在讲解Niagara之前&#xff0c;视频首先做了一个性能测试&#xff0c;首先放置了100个AI角色&#xff0c;可以想目标角色移动的ai&#xff0c;然后测试…

C语言:猜凶手

题目&#xff1a; 日本某地发生了一件谋杀案&#xff0c;警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说&#xff1a;不是我。 B说&#xff1a;是C。 C说&#xff1a;是D。 D说&#xff1a;C在胡说 已知3个人说了真话&#xff0c;1个人说的是假话。…

山西电力市场日前价格预测【2023-07-03】

日前价格预测 预测明日&#xff08;2023-07-03&#xff09;山西电力市场全天平均日前电价为333.50元/MWh。其中&#xff0c;最高日前电价为398.66元/MWh&#xff0c;预计出现在15: 15。最低日前电价为280.73元/MWh&#xff0c;预计出现在24: 00。 以上预测仅供学习参考&#x…

Spring第一讲:Spring基础概念和环境搭建

一、Spring是什么 Spring 是 Java EE 编程领域的一款轻量级的开源框架&#xff0c;由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立&#xff0c;它的目标就是要简化 Java 企业级应用程序的开发难度和周期。 Spring 自诞生以来备受青睐&#xff0c;一直被广大开发…

二叉树各种函数的实现

如果你觉得迷茫&#xff0c;那就尽可能选择比较困难的路。 目录 前言&#xff1a; &#x1f340;一.通过前序遍历创建二叉树 &#x1f341;二.二叉树的四种遍历 &#x1f342;1.二叉树的前序遍历 &#x1f33c;2.二叉树的中序遍历 &#x1f34c;3.二叉树的后序遍历 …

Mac VSCode配置运行单个C++文件

题外话&#xff1a;VSCode一键整理代码快捷键&#xff1a;ShiftoptionF 方法一&#xff1a;命令行直接编译 g -o 想创建的可执行文件名 ./cpp文件名 ./可执行文件名 以test.cpp为例&#xff0c;我创建的可执行文件名为test&#xff0c;运行结果如下&#xff1a; 方法二&#…

SpringCloud-Nacos配置管理

文章目录 Nacos配置管理统一配置管理在nacos中添加配置文件从微服务拉取配置 配置热更新方式一方式二 配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09;运行两个UserApplication&#xff0c;使用不同的profile3&#xff09;运…

React教程(由浅到深)

文章目录 1. 基本语法1.1 初体验Hello React1.2 JSX语法的基本使用1.2.1 语句与表达式说明 1.3. React面向组件编程1.3.1 函数组件与类组件 1.4 组件实例的三大特性1.4.1 state数据存储状态1.4.2 props的使用1.4.2.1基本使用1.4.2.2 做限制类型&#xff0c;默认值使用1.4.2.3 简…

2、boostrap 多数据类型表单

fileinput 视频图片文本数据表单 插件下载地址&#xff1a;https://github.com/kartik-v/bootstrap-fileinput/ 1、多类型数据from测试 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</tit…

Jeston Xavier NX 模块将系统迁移到NVME存储

大家好&#xff0c;我是虎哥&#xff0c;最近完成了自己设计的第一个Xavier NX的载板设计和打样&#xff0c;虽然还有一些小的不完善的地方&#xff0c;但是可以正常使用&#xff0c;这里记录和分享一下我自己设计的载板上如何实现系统迁移。 我自己使用SDK Manager 安装了所有…

c# Invoke使用

在多线程编程中&#xff0c;我们经常要在工作线程中去更新界面显示&#xff0c;而在多线程中直接调用界面控件的方法是错误的做法&#xff0c;Invoke 和 BeginInvoke 就是为了解决这个问题而出现的&#xff0c;使你在多线程中安全的更新界面显示。 正确的做法是将工作线程中涉…

青少年机器人技术一级考试备考重点(三):简单机械

随着机器人技术的飞速发展&#xff0c;越来越多的青少年开始关注并参与其中。青少年机器人技术考试作为一项评估学生机器人技术水平的重要考试&#xff0c;备受广大青少年和家长的关注。为了更好地备战青少年机器人技术一级考试&#xff0c;了解考试的学习要点和备考重点是非常…

【C++初阶】11. list的使用及模拟实现

1. list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。list与…

清华青年AI自强作业hw5:基于CNN实现CIFAR10分类任务

清华青年AI自强作业hw5&#xff1a;基于CNN实现CIFAR10分类任务 简述作业实现遇到的问题相关链接 一起学AI系列博客&#xff1a;目录索引 简述 hw5作业为利用深度卷积神经网络实现CIFAR_10数据集十分类问题&#xff0c;帮助理解CNN的前向传播结构。 CIFAR-10是一个常用的彩色图…