当前位置: 首页 > news >正文

FPAG IP核调用小练习

一、调用步骤

1、打开Quartus
右上角搜索ROM,如图所示
请添加图片描述
2、点击后会弹出如图所示
在这里插入图片描述
其中文件路径需要选择你自己的
3、点击OK弹出如图所示
请添加图片描述
图中红色改为12与1024在这里插入图片描述
4、然后一直点NEXT,直到下图请添加图片描述
这里要选择后缀为 .mif的文件
5、用C语言生成 .mif文件
在这里插入图片描述

// 生成1024点正弦波表(C程序)
#include <stdio.h>
#include <math.h>#define PI 3.14159265358979323846
#define DEPTH 1024  // ROM深度
#define WIDTH 12    // 数据宽度(12位)int main() {FILE *fp = fopen("sine_rom.mif", "w");if (!fp) return -1;fprintf(fp, "WIDTH=%d;\nDEPTH=%d;\nADDRESS_RADIX=HEX;\nDATA_RADIX=HEX;\nCONTENT BEGIN\n", WIDTH, DEPTH);for (int i = 0; i < DEPTH; i++) {float phase = (float)i / DEPTH * 2 * PI;short value = (short)(sin(phase) * (pow(2, WIDTH-1) - 1));fprintf(fp, "%03x : %03x;\n", i, value & 0xFFF);}fprintf(fp, "END;\n");fclose(fp);return 0;
}

然后运行.c文件,会在文件所在目录下生成一个.mif文件,然后你就在第4步中选择它就行。
然后一直next,直到finish

二 、核心模块

1、相位累加器

module phase_accumulator (input wire clk,          // 50MHz系统时钟input wire [23:0] K,     // 频率控制字(24位)output reg [23:0] phase  // 相位累加值
);always @(posedge clk) beginphase <= phase + K;  // 相位累加end
endmodule

2、波形选择器

module waveform_selector (input wire [23:0] phase, // 相位地址(24位)input wire sel,          // 波形选择(0:正弦,1:方波)output reg [11:0] data_out
);reg [11:0] sine_data;    // 正弦波数据reg [11:0] square_data;  // 方波数据// 正弦ROMreg [11:0] sine_rom [0:1023];initial begin$readmemh("sine_rom.mif", sine_rom);endassign sine_data = sine_rom[phase[22:12]]; // 取中间12位地址// 方波ROMreg [11:0] square_rom [0:1023];initial begin$readmemh("square_rom.mif", square_rom);endassign square_data = square_rom[phase[22:12]];always @(*) beginif (sel) data_out = square_data;else     data_out = sine_data;end
endmodule

3、时钟分频器

module clock_divider (input wire clk_in,    // 50MHz输入时钟output reg clk_out    // 分频后的时钟(10MHz)
);reg [1:0] cnt;always @(posedge clk_in) begincnt <= cnt + 1;if (cnt == 2'b11) // 分频系数为4(50MHz → 12.5MHz),或调整为5(10MHz)clk_out <= ~clk_out;end
endmodule

4、顶层模块

module dds_top (input wire clk_50m,    // 系统时钟(50MHz)input wire [23:0] K,   // 频率控制字(来自拨码开关)input wire sel,        // 波形选择(按钮控制)output reg [11:0] dac_data // DAC数据输出
);wire [23:0] phase;     // 相位累加值wire clk_out;          // 分频后的时钟// 相位累加器phase_accumulator phase_acc (.clk(clk_50m),.K(K),.phase(phase));// 波形选择器waveform_selector wave_sel (.phase(phase),.sel(sel),.data_out(dac_data));// 时钟分频(可选,用于DAC时钟)clock_divider clk_div (.clk_in(clk_50m),.clk_out(clk_out) // 连接到DAC时钟输入);
endmodule

5、波形图
请添加图片描述
请添加图片描述
参考博客https://blog.csdn.net/weixin_50722839/article/details/109960391

相关文章:

  • 无人机自主导航与路径规划技术要点!
  • 6.DJI-PSDK:psdk订阅无人机高度/速度/GPS/RTK/时间/经纬度等消息及问题解决
  • Playwright与Selenium详细对比及Playwright快速入门
  • Hadoop:大数据时代的基石
  • A008-Web 功能测试 – 咪咕音乐UI自动化,selenium
  • uniapp的通用页面及组件基本封装
  • 公司内部自建知识共享的方式分类、详细步骤及表格总结,分为开源(对外公开)和闭源(仅限内部),以及公共(全员可访问)和内部(特定团队/项目组)四个维度
  • Android四大组件
  • 视频分析设备平台EasyCVR安防视频管理系统,打造电石生产智能视频监控新体系
  • docker安装ES
  • AIDL 语言简介
  • Node.js入门
  • 从大模型到AI基础设施,商汤的反向求解
  • qiankun 微前端主应用使用 iframe 加载子应用中的某个页面
  • 解决 Maven 500 错误:无法传输 maven-metadata.xml 文件
  • 汽配快车道解决chrome backgroud.js(Service Worker) XMLHttpRequest is not defined问题
  • conda 创建、激活、退出、删除环境命令
  • 【HD-RK3576-PI】定制用户升级固件
  • Fab-ME: 基于视觉状态空间与注意力增强的织物缺陷检测框架详解
  • arcgis几何与游标(2)
  • 罗马尼亚临时总统博洛让任命普雷多尤为看守政府总理
  • 胡塞武装称以色列所有机场均为其打击目标
  • 心期末后有人传——《钱谦益年谱长编》在钱氏故里首发
  • 经济日报:以人工智能激活产业新增长
  • 黎巴嫩9年来首次举行地方选举
  • 体坛联播|赵心童晋级世锦赛决赛,德布劳内一球制胜