前言

记录FPGA学习开发过程,本篇进行信号发生器设计,涉及DAC芯片与FPGA的传输,DDS的大概工作原理。日拱一卒,功不唐捐。

文章目录

前言

一、直接数字式频率合成器(DDS)?

二、设计目标

三、设计过程

四、完整代码

总结


一、直接数字式频率合成器(DDS)?

一种数字化技术,可以将数字量信号转化为模拟信号,即通过输入的信号来控制输出信号。

DDS由相位累加器、幅度/相位转换和DAC组成。DDS 的输入是频率控制字,其用来控制相位累加器每次增加的相位值,也相当于一个步进值。大概过程为相位累加器将目前相位与频率控制字相加形成新的相位,新的相位一方面传回累加器输入端准备与下一个控制字相加,另一方面传给幅度/相位转换电路,幅度/相位转换电路输出相应的波形数据,最后DAC将波形数据转为模拟信号输出。

二、设计目标

能够产生一定频率正弦信号的发生器

三、设计过程

本次设计FPGA搭配DAC芯片,由FPGA直接发送数据到DAC芯片中,转为模拟信号输出。

(1)DAC芯片——DA9709

双通道、位宽8bit、速率达125M、能够满足常用信号发生器、滤波信号输出等需求。DAC芯片与FPGA相连的信号通道主要有:

MODE:DA9709工作模式,高电平时双信号控制双通道,低电平时使用一组信号交替控制两个通道

SLEEP:高电平时睡眠模式,正常工作低电平

CLK1/2:控制通道A/B的时钟

WRT1/2:通道A/B的写使能信号

DB(7~0)P1/2:通道A/B的写数据,控制A和B的输出电压

(2)输入给DAC的数字量与输出电压的关系

两个通道均支持0.48~2.2V的电压输出,输出电压=-1.72*(输入数据/255)+2.2V,输出电压与输入数据成线性反比例关系,所以需要FPGA给DAC数据信号,DAC就会输出相应的电压

(3)输入数据

本次输入数据没有采用ROM的IP核,ROM的IP核就是将电压信息存储到ROM里,以输入数据作为地址传进去,ROM输出的就是电压数据,然后经DAC转换。在程序中编写了个“查找表”,作用与ROM类似。

假定输出的正弦信号周期为5120ns,每个周期等间隔输出128个点,因此每隔40ns输出一个点,考虑每个点的输出值,即每个点的FPGA给DAC的输入数据。为方便,先假定输入给DAC的数字值与DAC的输出电压成正比,输入数据y与点数i关系如下:

i为采样点,本次设计采用1个周期128个点,点数的变化代表着输出电压的变化,y是输入数据,建立输入数据与点数的关系,就是输入数据与输出电压的关系。

关系的建立采用正弦公式y=sin(x),由于这款DAC采用8位原码输入,不能有负数,所以将标准的正弦信号加1;当输入y最大值时正好对应最大电压幅值(不然的话,当y最大时,输出超出最大电压幅值;所以最终公式如上。

由此可以计算出每个采样点的输入数据是多少,这是假设输入给DAC的数字值与DAC的输出电压成正比推算出来的,实际根据DAC输出电压与输入数据值成反比,所以真正的输入数据为255-推算出来的各点的值。

(4)代码设计

需要向DAC传递的信息有:工作模式、状态、时钟、输入数据、写信号;注意时序要保证DAC的建立时间和保持时间,本次设计将原FPGA时序信号取反后传给DAC,这样当FPGA将输入数据给DAC,时序变为低电平时,此时DAC刚好是高电平进行模拟信号输出,由于此时FPGA是低电平,所以输入数据并未改变。

四、完整代码

/* FPGA 产生控制 DA9709 的电压,令 DA9709 的通道 A 产生
所对应的正弦波,其具体要控制的信号包括 MODE、SLEEP、CLK1、WRT1、DB7~0P1 管脚*/
module dds_da(
clk ,
rst_n ,
dac_mode ,
dac_clka ,
dac_da ,
dac_wra ,
dac_sleep
);

input   clk;//输入时钟
input   rst_n;//复位
output  dac_mode ;//DAC工作模式
output  dac_clka ;//DAC工作时钟
output  [8-1:0]dac_da ;//输入给DAC数据
output  dac_wra ;//DAC写信号
output  dac_sleep ;//DAC状态

reg[7:0]    sin_data;
reg[7:0]    dac_da;
wire        dac_sleep;
wire        dac_wra;
wire        dac_clk;
wire        dac_mode;

reg [ 1:0]  cnt0     ;
wire        add_cnt0 ;
wire        end_cnt0 ;
always @(posedge clk or negedge rst_n) begin//每隔两个时钟,发送一组数据,输出数据变一次 
    if (rst_n==0) begin
        cnt0 <= 0; 
    end
    else if(add_cnt0) begin
        if(end_cnt0)
            cnt0 <= 0; 
        else
            cnt0 <= cnt0+1 ;
   end
end
assign add_cnt0 = 1;
assign end_cnt0 = add_cnt0  && cnt0 ==2-1 ;

reg [6:0]  cnt1     ;
wire        add_cnt1 ;
wire        end_cnt1 ;
always @(posedge clk or negedge rst_n) begin//一共输出128个数据点
    if (rst_n==0) begin
        cnt1 <= 0; 
    end
    else if(add_cnt1) begin
        if(end_cnt1)
            cnt1 <= 0; 
        else
            cnt1 <= cnt1+1 ;
   end
end
assign add_cnt1 = end_cnt0;
assign end_cnt1 = add_cnt1  && cnt1 ==128-1 ;

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        dac_da<=0;
    end
    else begin
        dac_da<=255-sin_data;//给DAC芯片的值
    end
end

always @(*)begin//以点数为索引,输入给DAC的数据不同
case(cnt1)
0: sin_data = 8'h7F;
1: sin_data = 8'h85;
2: sin_data = 8'h8C;
3: sin_data = 8'h92;
4: sin_data = 8'h98;
5: sin_data = 8'h9E;
6: sin_data = 8'hA4;
7: sin_data = 8'hAA;
8: sin_data = 8'hB0;
9: sin_data = 8'hB6;
10: sin_data = 8'hBC;
11: sin_data = 8'hC1;
12: sin_data = 8'hC6;
13: sin_data = 8'hCB;
14: sin_data = 8'hD0;
15: sin_data = 8'hD5;
16: sin_data = 8'hDA;
17: sin_data = 8'hDE;
18: sin_data = 8'hE2;
19: sin_data = 8'hE6;
20: sin_data = 8'hEA;
21: sin_data = 8'hED;
22: sin_data = 8'hF0;
23: sin_data = 8'hF3;
24: sin_data = 8'hF5;
25: sin_data = 8'hF7;
26: sin_data = 8'hF9;
27: sin_data = 8'hFB;
28: sin_data = 8'hFC;
29: sin_data = 8'hFD;
30: sin_data = 8'hFE;
31: sin_data = 8'hFE;
32: sin_data = 8'hFE;
33: sin_data = 8'hFE;
34: sin_data = 8'hFE;
35: sin_data = 8'hFD;
36: sin_data = 8'hFC;
37: sin_data = 8'hFA;
38: sin_data = 8'hF8;
39: sin_data = 8'hF6;
40: sin_data = 8'hF4;
41: sin_data = 8'hF1;
42: sin_data = 8'hEF;
43: sin_data = 8'hEB;
44: sin_data = 8'hE8;
45: sin_data = 8'hE4;
46: sin_data = 8'hE0;
47: sin_data = 8'hDC;
48: sin_data = 8'hD8;
49: sin_data = 8'hD3;
50: sin_data = 8'hCE;
51: sin_data = 8'hC9;
52: sin_data = 8'hC4;
53: sin_data = 8'hBE;
54: sin_data = 8'hB9;
55: sin_data = 8'hB3;
56: sin_data = 8'hAD;
57: sin_data = 8'hA7;
58: sin_data = 8'hA1;
59: sin_data = 8'h9B;
60: sin_data = 8'h95;
61: sin_data = 8'h8F;
62: sin_data = 8'h89;
63: sin_data = 8'h82;
64: sin_data = 8'h7D;
65: sin_data = 8'h77;
66: sin_data = 8'h70;
67: sin_data = 8'h6A;
68: sin_data = 8'h64;
69: sin_data = 8'h5E;
70: sin_data = 8'h58;
71: sin_data = 8'h52;
72: sin_data = 8'h4C;
73: sin_data = 8'h46;
74: sin_data = 8'h41;
75: sin_data = 8'h3C;
76: sin_data = 8'h36;
77: sin_data = 8'h31;
78: sin_data = 8'h2C;
79: sin_data = 8'h28;
80: sin_data = 8'h23;
81: sin_data = 8'h1F;
82: sin_data = 8'h1B;
83: sin_data = 8'h17;
84: sin_data = 8'h14;
85: sin_data = 8'h11;
86: sin_data = 8'hE ;
87: sin_data = 8'hB ;
88: sin_data = 8'h9 ;
89: sin_data = 8'h7 ;
90: sin_data = 8'h5 ;
91: sin_data = 8'h3 ;
92: sin_data = 8'h2 ;
93: sin_data = 8'h1 ;
94: sin_data = 8'h1 ;
95: sin_data = 8'h1 ;
96: sin_data = 8'h1 ;
97: sin_data = 8'h1 ;
98: sin_data = 8'h2 ;
99: sin_data = 8'h3 ;
100: sin_data = 8'h4 ;
101: sin_data = 8'h6 ;
102: sin_data = 8'h7 ;
103: sin_data = 8'hA ;
104: sin_data = 8'hC ;
105: sin_data = 8'hF ;
106: sin_data = 8'h12;
107: sin_data = 8'h15;
108: sin_data = 8'h19;
109: sin_data = 8'h1D;
110: sin_data = 8'h21;
111: sin_data = 8'h25;
112: sin_data = 8'h2A;
113: sin_data = 8'h2E;
114: sin_data = 8'h33;
115: sin_data = 8'h38;
116: sin_data = 8'h3E;
117: sin_data = 8'h43;
118: sin_data = 8'h49;
119: sin_data = 8'h4E;
120: sin_data = 8'h54;
121: sin_data = 8'h5A;
122: sin_data = 8'h60;
123: sin_data = 8'h67;
124: sin_data = 8'h6D;
125: sin_data = 8'h73;
126: sin_data = 8'h79;
127: sin_data = 8'h7F;

endcase
end

assign dac_sleep = 0 ;//状态
assign dac_wra = dac_clka ;//写信号
assign dac_clka = ~clk ;//时钟
assign dac_mode = 1 ;//模式

endmodule


总结

重点:输入数据与输出电压关系的思考推算方式;时钟取反给DAC芯片

有借鉴明德扬FPGA课程实例

FPGA项目开发——信号发生器(DDS)相关推荐

  1. FPGA项目开发之时钟规划

    FPGA项目开发之时钟规划 当我刚开始我的FPGA设计生涯时,我对明显更小.更不灵活的 FPGA(想想 XC4000XL / Clcyone3/4和 Spartan)和工具的非常简单的时钟规则之一是尽 ...

  2. FPGA项目开发:204B实战应用-LMK04821代码详解(二)

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

  3. FPGA项目开发:基于FPGA的伪随机数发生器(附代码)

    FPGA项目开发:基于FPGA的伪随机数发生器(附代码) 今天是画师和各位大侠见面了,执笔绘画FPGA江湖,本人写了篇关于FPGA的伪随机数发生器学习笔记,这里分享给大家,仅供参考. 一.概念 随机数 ...

  4. fpga项目开发实例_深入浅出玩转FPGA书+视频教程:35课时+源码

    欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 <深入浅出玩转FPGA(第3版)>收集整理了作者在FPGA项目实践中的经验点滴.书中 ...

  5. FPGA项目开发:基于JESD204B的LMK04821芯片项目开发经验分享

    大侠好,阿Q来也,今天头一次和各位见面,请各位大侠多多关照.今天给各位大侠带来一篇项目开发经验分享"基于JESD204B的LMK04821芯片项目开发",这是本人实打实的项目开发经 ...

  6. FPGA知识汇集-FPGA设计开发需要熟悉哪些EDA工具呢?

    FPGA FPGA设计需要哪些工具? 在FPGA的设计过程中,工程师需要使用仿真.综合.物理实现.调试和验证等各种工具.之前说过,给粉友们提供常用工具的简要介绍. 一 仿真器 仿真器 工具: ISIM ...

  7. (68)信号发生器DDS协议(第14天)

    (68)信号发生器DDS协议(第14天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)信号发生器DDS协议(第14天) 5)技术交流 6)参考资料 2 FPGA ...

  8. FPGA 电路开发入门实验

    FPGA 电路开发入门实验 第0章:基础知识 如图1,本实验使用实验板为altera DE0,板子型号为Cyclone Ⅲ, EP3C16F484C6,编译软件为QuartusⅡ9.0. 图 1 Qu ...

  9. ​FPGA便捷开发-TCL商店(开源)

    TCL 在IC领域中常用的脚本有Tcl.Perl.Shell.Python等,在这些脚本里面,Tcl("工具命令语言"( 即Tcl的全称Tool Command Language) ...

最新文章

  1. JSP第二次作业_3小题
  2. go语言之行--基础部分
  3. SQL With As 用法Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
  4. 树莓派教程之树莓派系统镜像刷入和远程登陆(1)
  5. dedecms mysql 支持_安装dedecms MySQL 支持 不支持无法使用本系统 GD 支持Off解决办法...
  6. Qt中基类widget的各个事件函数中包含了ignore()的调用
  7. C#动态链接库的创建及使用
  8. DevOps组织如何有效地实施MSA
  9. 如何判断基因组的重复区域_利用宏基因组数据组装巨病毒基因组的优势与限制...
  10. 开发板移植mysql_数据库移植到gpu
  11. 1 - 我理解的软件测试
  12. 【问题描述】在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素。【输入形式】循环输入若干个整数,以字母结束输入,建立带头结点的单链表。【输出形式】输出最
  13. 拼多多API—获取商品详情、关键词获取取商品、获得搜索词统计获得搜索词推荐
  14. mysql 顿号_mysql语法总结及例子
  15. JavaSE基本数据类型
  16. qt QGraphicsItem自绘鼠标形状
  17. ssm基于Java web 的人人影视网站管理系统 毕业设计-附源码290915
  18. Vue里面使用el-cascader 级联选择器 children为空 和获取value和label问题
  19. 30岁IT人裸辞,悔断肠!
  20. 如何在Mac上剪切和粘贴文件和文件夹?

热门文章

  1. Mr.Fang出品:银企互联(NC模式)开发者版本(.NET WebService中间件,Java、PHP、Python等跨语言测试通过)
  2. pgsql执行分析explain结果分析
  3. 关于LTE中为什么需要做UE上行同步(TA,Timing Advance)最好的解释【摘自博友】
  4. one-hot和Embedding
  5. Linux安装GBase8a数据库
  6. ASP.Net下如何解决关于Access数据库“操作必须使用一个可更新的查询”问题
  7. gerrit 删除废弃的提交(Abandoned commit change)
  8. SAP 系统数据库恢复
  9. 政务数据分级安全保护要求(明细)
  10. 一文读懂BloomFilter