Verilog基础之十三、ROM实现

目录

一、前言

二、非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;
endROM 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;
elseaddr<=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.hqwc.cn/news/5322.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HashMap源码分析

文章目录 1、put方法流程2 、扩容机制3 、get方法 分析源码我们一般从三个方面入手&#xff1a; 常见属性&#xff08;成员变量&#xff09;构造方法关键方法 下面分析一下HashMap源码&#xff1a; 首先常见属性有&#xff1a; DEFAULT_INITIAL_CAPACITY 1 << 4; // a…

Flink 自定义源算子之 读取MySQL

1、功能说明&#xff1a; 在Flink 自定义源算子中封装jdbc来读取MySQL中的数据 2、代码示例 Flink版本说明&#xff1a;flink_1.13.0、scala_2.12 自定义Source算子&#xff0c;这里我们继承RichParallelSourceFunction&#xff0c;因为要使用open方法来初始化数据库连接对…

docker快速部署oracle19c、oracle12c,测试环境问题复现demo快速搭建笔记

Oracle 19c测试环境快速搭建 安装 # 下载镜像 19.3.0.0.0 docker pull registry.cn-hangzhou.aliyuncs.com/laowu/oracle:19c # 创建文件 mkdir -p /mymount/oracle19c/oradata # 授权&#xff0c;不授权会导致后面安装失败 chmod 777 /mymount/oracle19c/oradatadocker run …

微服务-基于Docker安装Sentinel

目录 1、拉取Sentinel镜像 2、构建Sentinel容器 3、访问Sentinel 1、拉取Sentinel镜像 代码&#xff1a; docker pull bladex/sentinel-dashboard:1.8.0 实例&#xff1a; rootlocalhost howlong]# docker pull bladex/sentinel-dashboard:1.8.0 1.8.0: Pulling from blade…

小程序data-*的误区

场景&#xff1a;点击按钮获取data-*的值跳转页面&#xff0c;跳转页获取传过来的参数 binnie: 华哥&#xff0c;为什么有的部分参数传不过去然后显示undefined&#xff1f; 华哥&#xff1a; binnie, 我看了一下你的代码&#xff0c;你错在属性名有大写字母了。我给你写了个…

MySQL之MHA高可用配置及故障切换实例

目录 一、MHA概述1.1 什么是MHA&#xff1f;1.2 MHA的组成<font colorblue>MHA Node &#xff08;数据节点&#xff09;<font colorblue>MHA Manager &#xff08;管理节点&#xff09;1.3 MHA 的特点 二、 MHA搭建准备2.1 实验思路2.2 实验准备 三、 MHA搭建的步骤…

变压器铜铝材质分析仪技术参数

一、主要技术指标 1.输入特性 有源部分&#xff1a; 电压测量范围&#xff1a;0~10V 电流测量范围&#xff1a;0~10A 无源部分&#xff1a; 电压测量范围&#xff1a;0~750V 宽量限&#xff08;可以外接电压互感器&#xff09;。 电流测量范围&#xff1a;0~100A内部自动…

kubernetes

目录 一、Kubernetes概述 为什么需要Kubernetes kubernetes为何能脱颖而出 传统部署时代 虚拟化部署时代 容器部署时代 二、Kubernetes 特性 自我修复 弹性伸缩 服务发现和负载均衡 存储编排 自动部署和回滚 自动完成装箱计算 密钥与配置管理 任务批处理运行 三…

文件上传靶场upload-labs通关

文章目录 前言Pass-01&#xff08;JavaScript绕过&#xff09;Step1、分析源码Step2、修改webshell文件后缀名Step3、修改报文重新发送Step4、使用webshell程序测试是否能连接 Pass-02&#xff08;MIME-Type绕过&#xff09;Step1、分析源码Step2、burp抓包&#xff0c;修改数据…

区块链中的共识机制以及共识算法

目录 什么是共识 什么是共识机制 共识机制类型 1、基于工作证明&#xff08;Proof of Work PoW&#xff09; PoW的特点 PoW是如何工作的&#xff1f; 挖矿 挖矿中的能源和时间消耗 挖矿奖励 比特币的PoW系统 工作证明的挑战 2、基于权益证明&#xff08;Proof of St…

Spring Boot 中的 Spring Cloud Feign

Spring Boot 中的 Spring Cloud Feign Spring Boot 是一个非常流行的 Java Web 开发框架&#xff0c;它提供了很多工具和组件来简化 Web 应用程序的开发。其中&#xff0c;Spring Cloud Feign 是 Spring Boot 中的一个非常重要的组件&#xff0c;它可以帮助我们实现声明式的 R…

tomcat多台应该怎么能设置

一个tomcat一般能处理5000-1000的并发量但是还是远远不够我们可以设置多台来满足我们的要求 首先进入tomcat目录 配置tomcat环境变量 vim /etc/profile.d/tomcat.sh 然后刷新 source /etc/profile.d/tomcat.sh 修改tomcat1里面的配置文件 然后进入tomcat1中的启动bin程序中…