FPGA实验五:信号发生器设计

news2024/11/16 1:45:29

目录

一、实验目的

二、设计要求

三、实验代码

1.代码原理分析

2.代码设计思路

3.IP核的设计与配置

四、实验结果及分析

1、引脚锁定

2、仿真波形及分析

(1)关于波形一些指标的介绍

(2)对波形转换功能的验证

(3)对幅度调节功能的验证------三角波幅度的变化 

(4)对调频功能的验证---以三角波频率的变化为例

3、下载测试结果及分析

五、实验心得


一、实验目的

(1)掌握信号发生器的原理;

(2)学习复杂数字系统设计;

(3)学习用IP核进行设计;

(4)学习用在线逻辑分析仪观察FPGA产生的信号。

二、设计要求

(1)数字化波形数据存在ROM中,ROM用IP核进行设计;

(2)正弦波或方波、锯齿波波形可选并数码管显示所选波形种类;

(3)信号频率、幅度可调并用数码管显示频率和幅值;

(4)连接开发板,用在线观察信号的幅度、频率调制波形;

(5)可采用DDS原理产生正弦信号。

三、实验代码

限于篇幅,此处仅给出顶层文件代码

  1. module TOP(
    input clk,
    input rst_n,
    input [1:0] wave,            
    //input [11:0]  p_word,   
    input [2:0]  AM,          
    input [3:0]    f_set,
    //output [11:0] dac_dataa,
    output[10:0] count_display//数码管输出    
    );
    wire [31:0] f_word;
    wire [4:0] amplitude;
    wire [11:0] dac_dataa;
    wire [1:0] cnt_1;
    wire [6:0] cnt_2;
    wire [2:0] cnt_3;
    wire [31:0] fre;
     //   分频:
    reg[26:0] clk_cnt;
    reg  [2:0]  sel=4'b0;
    reg clk1;
    //reg  [10:0] count_display=11'b1111_1111111;
    always @(posedge clk)
        begin 
            clk_cnt=clk_cnt+1;
            if(clk_cnt==100000000)
                begin
                clk_cnt=0;
                clk1=1'b1;
                end
            else
                clk1=1'b0;
            
            if(clk_cnt%100000==0) 
                begin
                sel=sel+1;
                if(sel==4) 
                    sel=0;
                end
        end
    DDS uut1(
    .clk(clk),
    .rst_n(rst_n),
    .wave(wave),
    .f_word(f_word),
    //.p_word(p_word),
    .amplitude(amplitude),
    .dac_dataa(dac_dataa),
    .cnt_1(cnt_1)
    );
    F_word_set uut2(
    .clk(clk),
    .rst_n(rst_n),
    .f_set(f_set),
    .f_word(f_word),
    .fre(fre),
    .cnt_2(cnt_2)
    );     
    A_set uut3(
    .clk(clk),
    .rst_n(rst_n),
    .AM(AM),
    .amplitude(amplitude),
    .cnt_3(cnt_3)
    );
    display SG_display(
        .clk (clk),
        .rst (rst_n),
        .counter_1 (cnt_1),
        .counter_2 (cnt_2),
        .counter_3 (cnt_3),
        .count_display (count_display),
        .sel(sel)
    );
    
    ila_0 ila (
     .clk(clk), // input wire clk
     .probe0(dac_dataa), // input wire [11:0]  probe0  
     .probe1(wave), // input wire [1:0]  probe1 
     .probe2(AM), // input wire [2:0]  probe2 
     .probe3(f_set) // input wire [3:0]  probe3
    );
    endmodule

    1.代码原理分析

正弦信号发生器由计数器或地址发生器(6位)、正弦信号数据 ROM6位地址线,8位数据线,含有 64 个 8 位数据,一个周期)、原理图顶层设计和 8 位D/A。其框图如图 1 所示。其中信号产生模块将产生所需的各种信号,这些信号的产生可以有多种方式,如用计数器直接产生信号输出,或者用计数器产生存储器的地址,在存储器中存放信号输出的数据。信号发生器的控制模块可以用数据选择器实现。将波形数据送入 D/A 转换器,将数字信号转换为模拟信号输出。 

2.代码设计思路

3.IP核的设计与配置

(以ila_0为例) 

 

在线逻辑分析仪的配置

 

此处设置了5个探针,在逻辑分析仪中显示出频率、幅度、波形类型额变化。

四、实验结果及分析

1、引脚锁定

set_property -dict { PACKAGE_PIN W5   IOSTANDARD LVCMOS33 } [get_ports clk]

create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]

## Switches

set_property -dict { PACKAGE_PIN V17   IOSTANDARD LVCMOS33 } [get_ports {wave[0]}]

set_property -dict { PACKAGE_PIN V16   IOSTANDARD LVCMOS33 } [get_ports {wave[1]}]

set_property -dict { PACKAGE_PIN W16   IOSTANDARD LVCMOS33 } [get_ports {f_set[0]}]

set_property -dict { PACKAGE_PIN W17   IOSTANDARD LVCMOS33 } [get_ports {f_set[1]}]

set_property -dict { PACKAGE_PIN W15   IOSTANDARD LVCMOS33 } [get_ports {f_set[2]}]

set_property -dict { PACKAGE_PIN V15   IOSTANDARD LVCMOS33 } [get_ports {f_set[3]}]

set_property -dict { PACKAGE_PIN W14   IOSTANDARD LVCMOS33 } [get_ports {AM[0]}]

set_property -dict { PACKAGE_PIN W13   IOSTANDARD LVCMOS33 } [get_ports {AM[1]}]

set_property -dict { PACKAGE_PIN V2    IOSTANDARD LVCMOS33 } [get_ports {AM[2]}]

set_property -dict { PACKAGE_PIN R2    IOSTANDARD LVCMOS33 } [get_ports {rst_n}]

##7 Segment Display

set_property -dict { PACKAGE_PIN W7   IOSTANDARD LVCMOS33 } [get_ports {count_display[6]}]

set_property -dict { PACKAGE_PIN W6   IOSTANDARD LVCMOS33 } [get_ports {count_display[5]}]

set_property -dict { PACKAGE_PIN U8   IOSTANDARD LVCMOS33 } [get_ports {count_display[4]}]

set_property -dict { PACKAGE_PIN V8   IOSTANDARD LVCMOS33 } [get_ports {count_display[3]}]

set_property -dict { PACKAGE_PIN U5   IOSTANDARD LVCMOS33 } [get_ports {count_display[2]}]

set_property -dict { PACKAGE_PIN V5   IOSTANDARD LVCMOS33 } [get_ports {count_display[1]}]

set_property -dict { PACKAGE_PIN U7   IOSTANDARD LVCMOS33 } [get_ports {count_display[0]}]

#set_property -dict { PACKAGE_PIN V7   IOSTANDARD LVCMOS33 } [get_ports dp]

set_property -dict { PACKAGE_PIN U2   IOSTANDARD LVCMOS33 } [get_ports {count_display[7]}]

set_property -dict { PACKAGE_PIN U4   IOSTANDARD LVCMOS33 } [get_ports {count_display[8]}]

set_property -dict { PACKAGE_PIN V4   IOSTANDARD LVCMOS33 } [get_ports {count_display[9]}]

set_property -dict { PACKAGE_PIN W4   IOSTANDARD LVCMOS33 } [get_ports {count_display[10]}]

2、仿真波形及分析

(1)关于波形一些指标的介绍

rst_n:表示使能端   clk:表示时钟周期   wave:波形类型0-正弦波 1-矩形波  2-三角波 3-锯齿波

AM:波形幅度     f_set:波形频率

(2)对波形转换功能的验证

I:波形类型的变化:从正弦波到矩形波               II:从矩形波到锯齿波的变化

 

III :从锯齿波到三角波的变化     

(3)对幅度调节功能的验证------三角波幅度的变化 

(4)对调频功能的验证---以三角波频率的变化为例

 

分析:

当信号的类型、频率、幅度发生变化时,具体的波形也会立即出现明显的变化,实现了频率、幅度、波形类型的可调性。

3、下载测试结果及分析

包含在线逻辑分析仪情况及开发板情况

波形类型:0-正弦波      1-矩形波      2-三角波       3-锯齿波  

不断改变波形类型、幅度及频率

  1. 锯齿波                                                       

幅度:3      频率:12     波形类型:3                               开发板

(2)正弦波

幅度:4      频率:8      波形类型:0                                  开发板

(3)矩形波

幅度:1      频率:7      波形类型:1                                 开发板

 

(4)三角波

幅度:2      频率:10      波形类型:2                           开发板

 

五、实验心得

1.实验过程中在完成仿真实验后准备上开发板进行测试,但发现此次实验与之前的实验上板子有点不一样。在查阅相关资料后,才知道此次实物实验不能仅依靠bassy3开发板,还需要使用在线逻辑分析仪观察FPGA产生的信号,实现波形的显示,展示其频率、幅度及波形类型,这让我对实物实验有了不一样的认识。

2.最初实验刚开始的时候真的是一头雾水,实验要求用IP核进行设计虽然有一定的思路,但也不清楚到底如何下手,最后还是参考了网上的方法程序,一点点理解下来。当然,网上的内容和我们的实验有许多出入,所以还是要在理解之后进行诸多修改。像数字化波形数据存在ROM中,ROM用IP核进行设计”这类步骤,如果不是参考网上的教程,我得花很多时间去消化理解虽然是借着别人的经验前进,但我认为只要最后能消化吸收转化为自己的知识,也能够被理解。经过这次实验,我真的是收获良多,如理解了信号发生器的设计原理学会了使用DDS原理产生正弦信号特别是对ip核设计的理解,这也给我在今后对于verilog编程也提供了更多的选择也能为我之后的实验提供不少帮助。

2022-05-05

 

 

 

 

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

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

相关文章

【LeetCode】225. 用队列实现栈

225. 用队列实现栈(简单) 思路 要使用一个队列来实现栈的功能。 具体来说,实现了以下几个方法: push(int x):将元素 x 入栈,即将元素 x 插入到队列的末尾。pop():弹出栈顶元素,即将队…

空天遥感守护自然资源底线,擦亮生态底色

上期介绍了航天宏图采用“空天地”一体化监测监管手段,打造基于“SAR卫星耕地变化遥感智能解译”、 基于“遥感大模型的耕地分类技术”等智慧耕地保护解决方案,本篇文章主要讲述“遥感如何助力自然保护地监测与保护”和“如何助力山水林田湖草沙生态修复…

Spanner: Google的全球分布级数据库----论文摘要

Spanner中一个新奇的time api揭示了时钟的不确定性。该api及其实现对于支持外部一致性(外部观察一致性)以及一系列强力的特性至关重要,这些特性包括:对过去版本数据的无阻塞读(对于历史数据的读不加锁,且不…

密码学入门——DES与AES

文章目录 参考书目一、编码与异或1.1 编码1.2 异或 二、DES与三重DES三、AES 参考书目 图解密码技术,第三版 一、编码与异或 1.1 编码 计算机的操作对象并不是文字,而是由0和1排列而成的比特序列。无论是文字、图像、声音、视频还是程序,…

短视频矩阵管理系统源码开发:视频批量剪辑,分发功能开发示例

短视频矩阵管理系统开发,首先对服务器要求: 源码所需服务器配置 1、规格:最低8核16G 2、硬盘:系统盘40-100G,数据盘不低于100G 3、带宽:10M 4、系统:CentOS7(务必选择7.*) 部署过程中&…

设计模式之结构型模式---代理模式

目录 1.概述2.代理模式类图3.应用场景3.1 功能增强3.2 控制访问 4.实现4.1 静态代理的实现4.1.1 实现静态代理模式的步骤4.1.2 静态代理的缺点 4.2 动态代理的实现4.2.1 Java JDK 动态代理的实现MethodInvocationHandlerProxy 4.2.2 JDK动态代理的使用方法4.2.3 JDK动态代理的实…

本内容由【想发APP】创始人编写:uniAPP申请百度广告后,开发者必须要空包签名验证应用的所有权,实现的详细内容如下

Android获取签名 注意先安装好jdk和jre,然后配置好环境变量 说明 空包签名需要本地配置jdk环境 Windows 安装JDK及环境变量的配置 命令行方式 命令格式: jarsigner -verbose -keystore [签名文件路径] -signedjar [签名后apk的文件路径] [未签名apk的文…

对顶堆学习笔记

对顶堆学习笔记 文章目录 **对顶堆学习笔记**介绍例题洛谷 P1168 中位数code 介绍 对顶堆是由一个大顶堆和一个小顶堆组合而成的数据结构,与传统堆维护最大数不同,对顶堆用于动态维护第k大的数。 对于对顶堆,我们可以用两个优先队列来表示两…

IllegalArgumentException: OnNoRibbonDefaultCondition异常与Maven Helper插件解决jar包冲突

在搭建Spring Cloud项目时,引入了不同版本的jar,导致项目启动时报错: main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.Bea…

Python 制作英文学习词典(简易版)

前言 今日分享 Python 制作英文学习词典,大家都可以尝试。 题目 制作英文学习词典。编写程序制作英文学习词典,词典有3个基本功能:添加、查询和退出。程序读取源文件路径下的txt格式词典文件,若没有就创建一个。词典文件存储方…

arcgis js 4.x加载自定义坐标系的arcgis server发布的wms服务

一、问题描述 一般城市本身用的都是自己定义的城市(本地)坐标系,没有对应公开的EPSG代码,如下图如果直接加载自定义坐标系的wms服务,直接会报错。 var customProjLayer new WMSLayer({url: "http://10.1.8.37:6…

封装一个带el-form的,带el-table的,带分页的,带搜索查询的dialog组件,很使用的二次封装组件。

#封装dialog小案例 提示:这是我工作中封装的代码,很使用,需要的可以拿去, 在我们的代码中往往会出现点击按钮出现弹窗进行操作,那么我们就需要对dialog进行一个二次封装。 下边是大概的一个样式。 ##对组件进行二次…

C语言中一维数组及二维数组的运用

1、int arr[] {12,3,4,5,6}; int * p arr; int * q &arr[1]; 其中arr是数组名,代表了整个数组的首元素地址,这个是一个常量,放在常量存储区,所以在给int*p赋值的时候可以不用带&,而下面的arr[1]则代表数…

unidbg或者java层解密方法IDEA中打包成jar包供python调用方法

一、导出jar包方法 (1)配置jar包参数 (2)创建生成jar包 成功生成! 二、Python代码调用 import jpypejvmPath jpype.getDefaultJVMPath() d unidbg-android.jar # 对应jar地址 jpype.startJVM(jvmPath, "-ea&q…

cloudflared tunnel后台启动

前期视频链接 先前台启动,本文参考 cloudflared tunnel --url localhost:88 run ruoyu 或者 cloudflared tunnel --url localhost:88 --no-chunked-encoding run ruoyu找到你的uuid.json 文件 创建你的config.yaml 或config.yml 内容如下 uuid 配置自己的 url: …

创建员工表并按要求完成数据

mysql> create table employee( id int primary key, name varchar(50), gender enum(男,女) default 男, salary int ); Query OK, 0 rows affected (0.01 sec)mysql> mysql> desc employee; ------------------------------------------------------ | Field | T…

spring重点标签有哪些

<bean>标签 id属性:在容器中Bean实例的唯一标识&#xff0c;不允许重复 class属性:要实例化的Bean的全限定名 scope属性:Bean的作用范围&#xff0c;常用是singleton(默认)和prototype <property>标签:属性注入 name属性:属性名称 value属性:注入的普通属性值 ref属…

Perfetto概览

1、Perfetto 简介 Perfetto是谷歌提供的一个用于性能检测和 trace 文件抓取分析的生产级开源工具包。它可以帮助我们进行应用层面以及系统层面的 trace 文件抓取、native/java 内存剖析。它还提供了一个强大的库能够帮助我们在 web 网页上对抓取的trace 文件进行可视化分析&am…

java项目之农产品供销服务系统(ssm+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的农产品供销服务系统。 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm&#xff0c;mybatis JDK…

关于chrome禁止混合内容造成的问题

混合内容 chrome 对混合内容的定义 是指 存储于http协议下的静态资源与https协议下的资源混用 Chrome官方相关说明 chrome 通过安全策略将 http强制转换为https 这会导致存储于http协议下的 文件出现协议问题从而无法访问 例&#xff1a; 从http文件服务器中引用一张图片到配…