FPGA学习——DE2-115开发板上设计波形发生器

news2025/7/15 6:25:16
1. 实验目的
  1. 掌握直接数字频率合成(DDS)技术的基本原理和应用。
  2. 使用DE2-115开发板实现正弦波和方波的生成。
  3. 使用SignalTap II嵌入式逻辑分析仪测试输出波形的离散数据。
2. 实验原理
  • DDS技术:通过相位累加器生成相位信息,结合波形存储器(ROM)输出波形数据。
  • 波形存储器:使用ROM存储正弦波和方波的采样数据。
  • 频率控制:通过调整相位累加器的步长实现不同频率的输出。
3. 实验步骤
  1. 生成波形数据:使用C语言或MATLAB生成正弦波和方波的采样数据,并保存为MIF文件。
  2. 调用ROM IP核:在Quartus中生成ROM IP核,并加载生成的MIF文件。
  3. 设计DDS模块:实现相位累加器和波形选择逻辑。
  4. 顶层模块设计:将DDS模块与开发板的时钟、复位、按键等信号连接。

在这里插入图片描述

4. 代码实现
4.1 顶层模块代码
module DE2_115_DDS_top(
    input CLOCK_50,
    input [3:0] KEY,
    input [17:0] SW,
    output [12:0] GPIO_0,
    output [0:0] LEDG
);
    wire CLOCK_100;
    assign GPIO_0[12] = CLOCK_100;
    wire RSTn = KEY[3];
    wire [1:0] WaveSel = SW[17:16];
    wire [12:0] K = SW[12:0];
    wire [11:0] WaveValue;
    assign GPIO_0[11:0] = WaveValue;

    DDS_top DE2(
        .CLOCK_50(CLOCK_50),
        .RSTn(RSTn),
        .WaveSel(WaveSel),
        .K(K),
        .WaveValue(WaveValue),
        .LEDG(LEDG),
        .CLOCK_100(CLOCK_100)
    );
endmodule
4.2 DDS核心模块代码
module DDS_top(
    input CLOCK_50,
    input RSTn,
    input [1:0] WaveSel,
    input [12:0] K,
    output reg [11:0] WaveValue,
    output reg [0:0] LEDG,
    output CLOCK_100
);
    reg [31:0] PhaseAcc;
    reg [10:0] ROMAddr;
    reg [11:0] SineValue, SquareValue;

    // 时钟分频
    reg [24:0] ClockDiv;
    wire Clock_100;
    always @(posedge CLOCK_50 or negedge RSTn) begin
        if (!RSTn) begin
            ClockDiv <= 0;
        end else begin
            if (ClockDiv == 10000000) begin
                ClockDiv <= 0;
                Clock_100 <= ~Clock_100;
            end else begin
                ClockDiv <= ClockDiv + 1;
            end
        end
    end

    // 相位累加器
    always @(posedge CLOCK_50 or negedge RSTn) begin
        if (!RSTn) begin
            PhaseAcc <= 0;
        end else begin
            PhaseAcc <= PhaseAcc + K;
        end
    end

    // ROM地址生成
    assign ROMAddr = PhaseAcc[31:21];

    // 波形选择
    always @(posedge CLOCK_50 or negedge RSTn) begin
        if (!RSTn) begin
            SineValue <= 0;
            SquareValue <= 0;
            WaveValue <= 0;
            LEDG <= 0;
        end else begin
            case (WaveSel)
                2'b00: begin
                    WaveValue <= SineValue;
                    LEDG <= 1'b0;
                end
                2'b01: begin
                    WaveValue <= SquareValue;
                    LEDG <= 1'b1;
                end
                default: begin
                    WaveValue <= 0;
                    LEDG <= 0;
                end
            endcase
        end
    end

    // ROM模块
    rom_sine rom_sine_inst(
        .address(ROMAddr),
        .clock(CLOCK_50),
        .q(SineValue)
    );

    rom_square rom_square_inst(
        .address(ROMAddr),
        .clock(CLOCK_50),
        .q(SquareValue)
    );
endmodule
4.3 ROM模块代码
// 正弦波ROM
module rom_sine(
    input [10:0] address,
    input clock,
    output reg [11:0] q
);
    reg [11:0] mem [0:2047];
    initial begin
        $readmemb("Sine1024.mif", mem);
    end
    always @(posedge clock) begin
        q <= mem[address];
    end
endmodule

// 方波ROM
module rom_square(
    input [10:0] address,
    input clock,
    output reg [11:0] q
);
    reg [11:0] mem [0:2047];
    initial begin
        $readmemb("Square1024.mif", mem);
    end
    always @(posedge clock) begin
        q <= mem[address];
    end
endmodule
4.4 波形数据生成代码
// 生成正弦波MIF文件
#include <stdio.h>
#include <math.h>

#define PI 3.141592
#define DEPTH 1024
#define WIDTH 12

int main(void)
{
    int n, temp;
    float v;
    FILE *fp;

    fp = fopen("Sine1024.mif", "w+");
    if (NULL == fp) {
        printf("Can not creat file!\r\n");
        return -1;
    } else {
        printf("File created successfully!\n");
        fprintf(fp, "DEPTH=%d;\n", DEPTH);
        fprintf(fp, "WIDTH=%d;\n", WIDTH);
        fprintf(fp, "ADDRESS_RADIX=HEX;\n");
        fprintf(fp, "DATA_RADIX=HEX;\n");
        fprintf(fp, "CONTENT\n");
        fprintf(fp, "BEGIN\n");
        for (n = 0; n < DEPTH; n++) {
            v = sin(2 * PI * n / DEPTH);
            temp = (int)((v + 1) * 4095 / 2);
            fprintf(fp, "%04x : %03x;\n", n, temp);
        }
        fprintf(fp, "END;\n");
        fclose(fp);
    }
    return 0;
}

在这里插入图片描述

5.定制ROM IP核设置

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

6.查看生成RTL

在这里插入图片描述

7.Signal Tap采样分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.结果

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【springsecurity oauth2授权中心】简单案例跑通流程

项目被拆分开&#xff0c;需要一个授权中心使得每个项目都去授权中心登录获取用户权限。而单一项目里权限使用的是spring-security来控制的&#xff0c;每个controller方法上都有 PreAuthorize("hasAuthority(hello)") 注解来控制权限&#xff0c;想以最小的改动来实…

2025TGCTF Web WP复现

AAA 偷渡阴平 <?php$tgctf2025$_GET[tgctf2025];if(!preg_match("/0|1|[3-9]|\~|\|\|\#|\\$|\%|\^|\&|\*|\&#xff08;|\&#xff09;|\-|\|\|\{|\[|\]|\}|\:|\|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $tgctf2025)){//hint&#xff1a;你可以对着键盘…

「GitHub热榜」AIGC系统源码:AI问答+绘画+PPT+音乐生成一站式

—零门槛搭建私有化AI内容工厂&#xff0c;源码开放商业落地指南 为什么全栈AIGC系统成为企业刚需&#xff1f; 1. 传统方案的致命缺陷 痛点 使用ChatGPTMidjourneyCanva 本全栈方案 工具割裂 需切换5平台 一个系统全搞定 成本 年费50万 一次部署永久免费 数据安全 …

【C++】 —— 笔试刷题day_19

一、小易的升级之路 题目解析 小易现在要打游戏&#xff0c;现在游戏角色的初始能力值为a&#xff0c;我们会遇到n个怪&#xff0c;这些怪物的防御值为b1、b2、b3...&#xff0c;如果我们的能力值要高于或者等于怪物的防御值&#xff0c;那我们的能力值就会加bi&#xff1b;如…

Kubernetes》》K8S》》Pod的健康检查

K8s概念总结 》》》Pod的生命周期阶段 Pod的生命周期可以简单描述&#xff1a;首先Pod被创建&#xff0c;紧接着Pod被调度到Node节点进行部署。 Pod是非常忠诚的&#xff0c;一旦被分配到Node节点后&#xff0c;就不会离开这个Node节点&#xff0c;直到它被删除&#xff0c;删除…

计算机视觉——基于使用 OpenCV 与 Python 实现相机标定畸变校正

概述 相机标定是一种旨在通过确定相机的内参&#xff08;焦距、光学中心、畸变系数&#xff09;和外参&#xff08;相机的位置和方向&#xff09;&#xff0c;提高图像在现实世界中的几何精度的过程。该过程可以纠正相机拍摄的图像中的畸变&#xff0c;使相机能够准确感知现实…

Python作业4 文本词云统计,生成词云

编写程序&#xff0c;统计两会政府工作报告热词频率&#xff0c;并生成词云。 2025两会政府工作报告 import jieba import wordcloud from collections import Counter import re# 读取文件 with open("gov.txt", "r", encoding"gbk") as f:t …

Jenkins 2.492.2 LTS 重置管理员密码

文章目录 1. Jenkins 关闭用户认证2. jenkins 修改密码 如果忘记了 Jenkins 的管理员密码的话&#xff0c;也不用担心&#xff0c;只要你有权限访问 Jenkins 的根目录&#xff0c;就可以轻松地重置密码。 1. Jenkins 关闭用户认证 // 查看 jenkins 家目录&#xff08;使用 doc…

【裁判文书网DES3数据解密】逆向分析

点击翻页&#xff0c;出现请求&#xff0c;可以看到请求参数有个ciphertext密文&#xff0c;响应数据也是密文 打上断点&#xff0c;点击翻页&#xff0c;断住 可以看到postData里面的ciphertext已经生成 往前跟栈&#xff0c;可以发现是var ciphertext cipher(); funct…

花园灌溉问题

#include <bits/stdc.h> using namespace std;// 设置最大行列数&#xff08;题目限制 n, m ≤ 100&#xff09; const int N 104;// 标记某个格子是否已经被水浇灌 bool used[N][N];// 队列&#xff0c;用于 BFS&#xff0c;存储当前水源的位置 queue<pair<int,i…

《AI大模型应知应会100篇》第22篇:系统提示词(System Prompt)设计与优化

第22篇&#xff1a;系统提示词(System Prompt)设计与优化 摘要 在大语言模型&#xff08;LLM&#xff09;应用中&#xff0c;系统提示词&#xff08;System Prompt&#xff09;是控制模型行为的核心工具之一。它不仅定义了模型的身份、角色和行为规范&#xff0c;还直接影响输…

Jsp技术入门指南【六】jsp脚本原理及隐式对象

Jsp技术入门指南【六】jsp脚本原理及隐式对象 前言一、JSP 脚本元素1.1 声明1.2 表达式1.3 脚本标签 二、JSP 的隐式对象是什么三、隐式对象详解outrequestsessionapplicationconfigexception 前言 在之前的博客中&#xff0c;我们已经介绍了JSP的环境搭建、编译文件查找以及生…

Jsp技术入门指南【五】详细讲解jsp结构页面

Jsp技术入门指南【五】详细讲解jsp结构页面 前言一、JSP页面的结构二、JSP页面的部件1. 指令&#xff08;核心控制部件&#xff09;2. 动作&#xff08;页面交互部件&#xff0c;了解即可&#xff09;3. 脚本&#xff08;Java逻辑嵌入部件&#xff09; 三、JSP指令详解1.1 JSP指…

Beyond Compare 30天评估到期 解决方法

Beyond Compare 30天评估到期 解决方法 一、问题二、解决办法2.1 第一步&#xff1a;打开注册表2.2 第二步&#xff1a;删除cacheID 三、效果 一、问题 Beyond Compare提示评估到期&#xff0c;重装也无效&#xff0c;只需简单两步&#xff0c;轻轻松松出困境。 二、解决办法…

Arduino无线体感机器手——问题汇总

文章不介绍具体参数&#xff0c;有需求可去网上搜索。 特别声明&#xff1a;不论年龄&#xff0c;不看学历。既然你对这个领域的东西感兴趣&#xff0c;就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题&#xff1a;提出问题时&#xff0c;应说明是哪款产品&a…

学习设计模式《一》——简单工厂

一、基础概念 1.1、接口 简单的说&#xff1a;接口是【用来实现类的行为定义、约束类的行为】&#xff08;即&#xff1a;定义可以做什么&#xff09;&#xff1b;接口可以包含【实例方法】、【属性】、【事件】、【索引器】或这四种成员类型的任意组合。 接口的优点&#xff1…

010数论——算法备赛

数论 模运算 一般求余都是对正整数的操作&#xff0c;如果对负数&#xff0c;不同编程语言结果可能不同。 C/javapythona>m,0<a%m<m-1 a<m,a%ma~5%32~-5%3 -21(-5)%(-3) -2~5%(-3)2-1正数&#xff1a;&#xff08;ab&#xff09;%m((a%m)(b%m))%m~正数&#xff…

NAT、代理服务、内网穿透

NAT、代理服务、内网穿透 1、NAT1.1、NAT过程1.2、NAPT2、内网穿透3、内网打洞3、代理服务器3.1、正向代理3.2、反向代理1、NAT 1.1、NAT过程 之前我们讨论了IPv4协议中IP地址数量不充足的问题。NAT技术是当前解决IP地址不够用的主要手段,是路由器的一个重要功能。 NAT能够将…

【unity实战】Unity动画层级(Animation Layer)的Sync同步和Timing定时参数使用介绍,同步动画层制作角色的受伤状态

文章目录 前言方案一&#xff1a;复制粘贴原有层级的状态机1、实现2、问题 方法二&#xff1a;勾选Sync同步动画层1、简单实现同步2、同步blend tree的问题3、动画状态的播放时长4、下层状态覆盖了上层状态 专栏推荐完结 前言 如何制作角色的受伤状态&#xff1f; 玩家角色在…

Uniapp调用native.js使用经典蓝牙串口通讯方法及问题解决

本人尝试在uniapp环境下开发一款安卓应用&#xff0c;需要与使用经典蓝牙协议的设备进行串口通讯&#xff0c;而uniapp官方给出的蓝牙操作接口目前只支持BLE&#xff08;低功耗蓝牙&#xff09;&#xff0c;用该接口无法正常获取到我想要连接的设备。 通过大量搜索&#xff0c…