FPGA教程系列-Vivado中读取ROM中数据

FPGA教程系列-Vivado中读取ROM中数据

  • 生成coe文件教程

https://blog.csdn.net/ccsss22/article/details/124441036

本实验主要读取rom中的数据。rom中存储的数据为coe文件,用matlab可以生成。

生成coe文件

verilog 复制代码
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
% --- 1. Parameters ---
num_points = 512;         % Number of points in the sine wave (e.g., 256 for a 256-depth ROM)
amplitude_scale = 1023;   % Scaling factor to match the desired integer range.
                          % 1023 corresponds to a 10-bit unsigned range (0-1023) or
                          % an 11-bit signed range centered at 0 (-1023 to 1023).
                          % We will generate a signed sine wave.
% --- 2. Generate the Sine Wave ---
% Create a time vector from 0 to 2*pi for one full cycle
t = linspace(0, 2*pi, num_points);
% Generate the floating-point sine wave
y_continuous = sin(t);
% Quantize and scale the wave to integer values
% The result will be in the range [-1023, 1023]
y_quantized = round(amplitude_scale * y_continuous);
% --- 3. Write to .coe File ---
file_name = 'sine_wave.coe';
fid = fopen(file_name, 'w');
% Check if the file opened successfully
if fid == -1
    error('Could not open file for writing.');
end
% Write the .coe file header
fprintf(fid, 'memory_initialization_radix=10;\n');
fprintf(fid, 'memory_initialization_vector =\n');
% Write the data vector
for i = 1:length(y_quantized)
    fprintf(fid, '%d', y_quantized(i));    
    % Add a comma after each value except the last one
    if i < length(y_quantized)
        fprintf(fid, ',\n');
    else
        fprintf(fid, ';'); % End the vector with a semicolon
    end
end
% Close the file
fclose(fid);
fprintf('Successfully generated %s with %d data points.\n', file_name, num_points);
% --- 4. Plot the Generated Wave for Verification ---
figure;
plot(y_quantized);
title('Generated Quantized Sine Wave');
xlabel('Sample Index');
ylabel('Amplitude (Integer Value)');
grid on;
axis tight; % Fit the axes tightly to the data

用上述程序,生成一个sine_wave.coe文件,生成的波形如图:

生成IP核

本仿真采用ROM核,位数11位,深度512.

编写top文件

verilog 复制代码
`timescale 1ns / 1ps

module rom_top(
input clka,
input rsta,
output signed[10:0] douta
    );
    
reg[8:0] addra;
always @(posedge clka or posedge rsta)
begin
     if(rsta)
     begin
     addra <= 9'd0;
     end
else begin
          if(addra == 9'd511)
          addra <= 9'd0;
          else
          addra <= addra+ 9'd1;
     end
end
   
    
blk_mem_gen_0 blk_mem_gen_u (
  .clka(clka),            // input wire clka
  .rsta(rsta),            // input wire rsta
  .addra(addra),          // input wire [8 : 0] addra
  .douta(douta),          // output wire [10 : 0] douta
  .rsta_busy()  // output wire rsta_busy
);

endmodule

编写Testbench

verilog 复制代码
`timescale 1ns / 1ps

module rom_top_tb;
reg clka;
reg rsta;
wire signed[10:0]douta;
rom_top rom_top_u(
.clka  (clka),
.rsta  (rsta),
.douta (douta)
);
initial
begin
clka = 1'b1;
rsta = 1'b1;
#100
rsta = 1'b0;
end
always #5 clka = ~clka;
endmodule

仿真分析

最终输出的结果,就是读取coe文件中的波形,即sin函数。当然可以用matlab生成各种各样的波形来进行读取。

工程文件:https://download.csdn.net/download/fantasygwh2015/92292030

相关推荐
码农小韩7 天前
FPGA学习(一)——LED点灯与开发流程
学习·fpga开发·入门·环境配置·仿真·点灯
兜里只有三分钱~8 天前
启元机器人 π0 与 GR00T N1 对比:VLA 模型的两条技术路线
机器人·微调·预训练·仿真·vla
兜里只有三分钱~8 天前
从 URDF 到 SDK:开发者视角拆解启元 T1/Q1 机器人架构
机器人·sdk·仿真·ros2·urdf
cyf3110 天前
用 VMware 虚拟机跑通阿里 SimAI:不买 GPU 服务器,也能研究大模型训练(超详细版)
vmware·gpu·仿真·simai·ai大模型训练
Soonyang Zhang18 天前
aisimulate分析(一)——算子workload建模
仿真·1024程序员节·vllm·推理框架·sglang
广州智造19 天前
Radioss破坏模型FAILJOHNSON (Johnson-cook) 和 FAILTAB1
运维·数据库·自动化·仿真·建模·后处理·前处理
七夜zippoe19 天前
启元 Q1 三份 MJCF 仿真文件对比:显示 / 运动学 / 全范围怎么选
ai·机器人·仿真·robot·mjcf
今宏科技1 个月前
2026 仿真软件怎么选?从结构、CFD 到多物理场的工程选型指南
仿真·cae·西门子·simcenter
玖石书1 个月前
LVGL的windows开发环境安装指南
windows·数字人·lvgl·仿真
风合星语2 个月前
2026 机器人工程实例(五):让 Allegro Hand 在 MuJoCo 中完成接触抓取——抓取状态机、稳定抬升与受控释放
c++·python·机器人·仿真