Verilog RAM/ROM的数据初始化

文章目录

  • 一、初始化方式
  • 二、测试

FPGA设计中RAM和ROM作为存储器用来存储可变或不可变类型的数据。
ROM初始化一般是加载固定数据,RAM声明时默认为不定态数据,初始化时可以让数据为全1或者全0。

一、初始化方式

  1. 复位时按地址写入初值
    always@ (posedge clk_in or negedge rst_n_in ) beginif( !rst_n_in ) beginram_reg[0] <= xxx;ram_reg[1] <= xxx;...ram_reg[n-1] <= xxx;end else begin...end
    end
    
  2. 使用initial 和 for循环来初始化
    用于初始化为有规律的数据,RAM初始化常使用这种方式。
    initial begin : ram_initinteger i;for(i=0;i<n;i++) beginram_reg[i] = xxx;end
    end
    
    变量的定义必须在命名块中,因此这里需要使用命名的initial块。
  3. 通过读文件的方式初始化
    将数据存储在.dat文件中,通过读文件实现初始化。
    这种方式RAM使用较少,一般ROM初始化时喜欢采用这种做法。
    initial begin$readmemh("filepath",rom_reg);
    end
    

二、测试

方式1的正确性不言而喻。
方式2和方式3中,initial块一般来说是用在仿真中的,对其能否综合,编写如下的测试代码:

  1. 定义了两块寄存器,用来实现RAM

  2. ram_1通过方式2初始化

  3. ram_2通过方式3初始化,dat文件内容从0x0f ~ 0x08
    [图片]

  4. 循环对ram中的内容进行读取

  5. 调用ila核,来抓取读取的数据

`timescale 1ns / 1ps
//
// Engineer: wkk 
// Create Date: 2023/12/23 20:50:45
// Module Name: init_value_test
//
module init_value_test(input   clk_in    ,input   rst_n_in  ,output  nc_out 
);reg [7:0]  ram_1 [7:0];
reg [7:0]  ram_2 [7:0];reg  [2:0]  ram_addr ;
wire [7:0]  ram_1_out;
wire [7:0]  ram_2_out;initial begin : init_ram1integer i;for( i=0;i<7;i = i+1 ) beginram_1[i] = i+1;end
endinitial begin : init_ram2$readmemh("E:/FPGA/init_value_test/init_value_test.srcs/data/ram_data.dat",ram_2);
endalways @( posedge clk_in or negedge rst_n_in ) beginif( !rst_n_in ) beginram_addr <= 'b0;end else beginram_addr <= ram_addr + 1'b1;end
endassign ram_1_out = ram_1[ram_addr];
assign ram_2_out = ram_2[ram_addr];ila_0 ila_0_inst (.clk(clk_in), // input wire clk.probe0(ram_1_out), // input wire [7:0]  probe0  .probe1(ram_2_out), // input wire [7:0]  probe1 .probe2(ram_addr)   // input wire [2:0]  probe2
);endmodule

增加了一个nc_out 端口,实际上是没有什么作用的,但是必须要加,否则会报错:

[Place 30-494] The design is empty
Resolution: Check if opt_design has removed all the leaf cells of your design.  Check whether you have instantiated and connected all of the top level ports.

原因:顶层文件没有输出接口

测试结果
[图片]

通过ila核抓出的数据,表明方式2和方式3成功的实现了初始化操作。

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

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

相关文章

基于阿里云服务网格流量泳道的全链路流量管理(二):宽松模式流量泳道

作者&#xff1a;尹航 在前文基于阿里云服务网格流量泳道的全链路流量管理&#xff08;一&#xff09;&#xff1a;严格模式流量泳道中&#xff0c;我们介绍了使用服务网格 ASM 的严格模式流量泳道进行全链路灰度管理的使用场景。该模式对于应用程序无任何要求&#xff0c;只需…

Linux poll 和 select 机制

poll select 介绍 使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个 或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来 读或写.…

Linux 宝塔mysql莫名其妙数据库不见了恢复数据库

起因&#xff1a;宝塔安装的mysql 线上运行突然表包括库都不见了&#xff0c;想办法恢复数据库 登陆mysql cd /www/server/mysql/binmysql -u root -p查看binlog日志是否打开 show variables like log_%;log_bin如果为 ON 则为开启状态&#xff0c;如果开启了才可以进行下一…

C# WPF上位机开发(从demo编写到项目开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 C# WPF编程&#xff0c;特别是控件部分&#xff0c;其实学起来特别快。只是后面多了多线程、锁、数据库、网络这部分稍微复杂一点&#xff0c;不过…

【贪心】单源最短路径Python实现

文章目录 [toc]问题描述Dijkstra算法Dijkstra算法应用示例时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;贪心算法 问题描述 给定一个带权有向图 G ( V , E ) G (V , E) G(V,E)&#xff0c;其中每条边的权是非负实数&#xff0c;给定 V V V中的一个…

计算机网络-网络层

计算机网络-网络层 以下笔记整理为哔哩哔哩湖科大教书匠的《计算机网络微课堂》的教学视频。 链接&#xff1a;计算机网络微课堂 1. 网络层概述 1.1 网络层的主要任务是实现网络互联&#xff0c;进而实现数据包在各网络之间的传输。 1.2 要实现网络层任务&#xff0c;需要解决…

nodejs+vue+微信小程序+python+PHP计算机网络在线考试系统-计算机毕业设计推荐

信息数据的处理完全依赖人工进行操作&#xff0c; 所以电子化信息管理的出现就能缓解以及改变传统人工方式面临的处境&#xff0c;一方面可以确保信息数据在短时间被高效处理&#xff0c;还能节省人力成本&#xff0c;另一方面可以确保信息数据的安全性&#xff0c;可靠性&…

python实现批量替换目录下多个后缀为docx文档内容

批量替换目录下多个后缀为docx文档内容 摘要&#xff1a; 本文将介绍如何使用Python实现批量替换目录下多个后缀为docx文档内容。通过使用Python的os和glob模块&#xff0c;我们可以轻松地遍历目录下的所有文件&#xff0c;并对每个文件进行操作。此外&#xff0c;我们还将使用…

Netty Review - 深入理解Netty: ChannelHandler的生命周期与事件处理机制

文章目录 概述CodeLifeCycleInBoundHandler 验证 概述 Netty的ChannelHandler是处理网络事件&#xff08;如数据读取、数据写入、连接建立、连接关闭等&#xff09;的核心组件。 在Netty中&#xff0c;ChannelHandler的生命周期与Channel的状态紧密相关&#xff0c;主要涉及到…

WEB 3D技术 three.js 通过lil-gui 控制x y z轴数值 操作分组 设置布尔值控制 颜色材质控制

上文 WEB 3D技术 three.js 通过lil-gui管理公共事件中 我们用 lil-gui 处理了一下基础事件和按钮的管理 那么 本文 我们来具体说说它能做的其他事 我们先将基础代码改成这样 import ./style.css import * as THREE from "three"; //引入lil-gui import { GUI } fro…

【23-24 秋学期】NNDL 作业12 优化算法2D可视化

1.简要介绍图中的优化算法&#xff0c;编程实现并2D可视化 SGD&#xff1a;随机梯度下降&#xff0c;每次迭代采集1个样本&#xff08;随机&#xff09;。 AdaGrad算法&#xff1a;一种梯度下降法&#xff0c;是对批量梯度下降法的改进&#xff0c;但并不是对动量法的改进。它…

SysTick 定时器

SysTick定时器定义&#xff1a; SysTick 是一个 24 位的倒计数定时器&#xff0c;当计到 0 时&#xff0c;将从 RELOAD 寄存器中自动重装载定时初值。只要不把它在 SysTick 控制及状态寄存器中的使能位清除&#xff0c;就永不停息。 SysTick定时器分类&#xff1a; SysTic…