明德扬论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫一扫,快捷登录!

查看: 11925|回复: 2

【FPGA至简设计原理与应用】书籍连载24 第三篇FPGA至简设计项目 第十五章 AD采集

[复制链接]
发表于 2020-7-3 17:47:16 | 显示全部楼层 |阅读模式

马上注册,看完整文章,学更多FPGA知识。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
温馨提示:明德扬2023推出了全新课程——逻辑设计基本功修炼课,降低学习FPGA门槛的同时,增加了学习的趣味性,并组织了考试赢积分活动
(点击→了解课程详情)http://www.mdy-edu.com/ffkc/415.html感兴趣请联系易老师:13112063618(微信同步)


本案例的编号为:002400000079
,如果有疑问,请按编号在下面贴子查找答案:MDY案例交流【汇总贴】_FPGA-明德扬科教 (mdy-edu.com)
本文为明德扬原创及录用文章,转载请注明出处

大家好,近期我们会连载《
FPGA至简设计原理与应用》一书,有兴趣的同学可以学习,也希望大家可以对我们的书提出宝贵的意见和建议。

《FPGA
至简设计原理与应用》书籍连载索引目录
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=989


读过的朋友可积极在贴后留言,书籍正式出版时,我们会从留言者中挑选20位幸运读者,幸运读者可获潘老师亲笔签名书籍一本。

注:手机浏览可能格式会乱,建议用电脑端进行浏览。

第十五章 AD采集

本文档编号:000400000027
需要看对应的视频,请点击视频编号:002700000454
1、本文档讲述FPGA产生正弦波数据,由DA输出,然后再外部环回到AD接口进行采集,可通过在线调试工具进行观察
2、801开发板使用


第1节 项目背景

1.1 AD转换


AD转换就是模数转换。顾名思义,即是将模拟信号转换成数字信号。其类型主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。

A/D转换器用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在进行A/D转换前,输入到A/D转换器的输入信号必须经由各种传感器将各种物理量转换成电压信号。

AD转换的技术指标,一般有如下几项:

1. 分辨率(Resolution) :指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与2^n的比值。分辨率又称精度,通常以数字信号的位数来表示。

2. 转换速率(Conversion Rate):指完成从模拟信号到数字信号AD的一次转换所需时间的倒数。积分型AD的转换时间是毫秒级,属低速AD;逐次比较型AD是微秒级,属中速AD;全并行/串并行型AD可达到纳秒级。而采样时间则是另外一个概念,是指两次转换的间隔。为了保证转换的正确完成,采样速率 (Sample Rate)必须小于或等于转换速率。有的设计师习惯将转换速率在数值上等同于采样速率,这一做法也是可以接受的。转换速率常用单位是kspsMsps,表示每秒采样千/百万次(kilo / Million Samples per Second)。

3. 量化误差 (Quantizing Error) :指由于AD的有限分辨率而引起的误差,即有限分辨率AD的阶梯状转移特性曲线与无限分辨率AD(理想AD)的转移特性曲线(直线)之间的最大偏差。其通常是1个或半个最小数字量的模拟变化量,表示为1LSB1/2LSB

4. 偏移误差(Offset Error) :输入信号为零时输出信号不为零的值,可外接电位器调至最小。

5. 满刻度误差(Full Scale Error) :满度输出时对应的输入信号与理想输入信号值之差。

6. 线性度(Linearity) :实际转换器的转移函数与理想直线的最大偏移,但不包括上述三种误差。

其它指标:绝对精度(Absolute Accuracy) 、相对精度(Relative Accuracy)、微分非线性、单调性和无错码、总谐波失真(Total Harmonic Distotortion缩写THD)和积分非线性,在此不进行一一具体描述。

1.2 开发板AD原理图

至简设计法开发板上板载32Mhz转换速率、8bit高速AD芯片AD9280,满足各种信号的采集,用户可以利用其实现各种常见滤波算法的实现。开发板中AD芯片的实际位置如下所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 1084.png
3.15-1教学板中的AD接口
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 1124.png
3.15-2AD9280的原理图

上图是AD9280的原理图,与FPGA相连的信号有:AD_D0~7AD_OTRAD_CLK

3.15-1AD9280FPGA的相连信号
AD9280管脚
原理图信号
FPGA管脚
作用
CLK
AD_CLK
AD9280的工作时钟,最大是32MHz
OTR
AD_OTR
超过电压范围指示信号
D7
AD_D7
AD转换后的数字值。
D6
AD_D6
D5
AD_D5
D4
AD_D4
D3
AD_D3
D2
AD_D2
D1
AD_D1
D0
AD_D0

1.3 AD9280的控制时序
AD9280的控制时序如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 1481.png
3.15-3AD9280控制时序
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 1522.png
3.15-4AD9280的时序参数
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 1564.png
3.15-5AD9280的最大时钟

由图3.15- 3可以看出,每个时钟AD完成一次转换,但会延迟3个时钟才输出。例如图中第一个时钟采集到S1,并对S1进行模数转换,经过3个时钟后输出DATA1,这个DATA1即为S1所应对的数字值。

由参数时序可以看出,时钟最大值是32MHz。以上就是AD9280的工作原理,可以发现AD9280的控制非常简单,设置不超过32MHz的时钟后对其采集就行了。

第2节 设计目标

延续至简设计法的设计特色,开始一个新的设计之前依旧要首先明确设计目标。设计目标是整个设计的核心灵魂,后续的每个步骤与操作都是围绕设计目标进行展开的。至简设计法旨在让设计师在设计过程中按照最中的简单快捷的方式实现每个步骤和思路,明确设计目标正是为了让后面的每个阶段的工作都有意义,而不去进行不必要的工程展开,这样一来可以少走很多弯路。对于初学者来说,学习阶段好习惯的养成可以为之后的工程师生涯打下坚实的基础。所以再次强调,在最开始设计前一定要将设计目标分析透彻,认真思考本次设计最终想要实现什么目的,达到什么效果,然后再投入到设计中去。

本设计将开发板上的AD接口与DA接口相连接,FPGA产生正弦信号后将该正弦信号输出给DA通道A,经过环回后,给回AD9280的输入端。FPGA采集AD9280的数据后使用signaltap采集数字信号,其实现结构如下图所示。

3.15-6AD采集的实现结构

正弦信号的产生方式与FIR滤波器的设计”方式一致,正弦信号的频率受开发板上的3个拨码开关控制,用3位信号key表示,即一共可以产生8种频率。正弦信号的频率约为100KHz * (key+1)。当key值为0时产生约100KHz的正弦信号,当key值为1时产生约200KHz的正弦波,当key值为7时产生约800KHz的正弦波。FPGA产生25MHz的时钟,将其传输给AD9280,即AD采样率为25M。在设计中将这一时钟作为SIGNALTAP的采样时钟来观察AD9280传输过来的数据波形。

本次设计使用到的DA9709AD9280连接示意如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 2490.png
3.15-7教学板连接示意图

上板效果图如下图所示,(用signaltap抓取波形),想要观看完整上板演示视频效果的读者朋友可以登陆至简设计法官网查看:WWWXXXXX。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 2600.png
3.15-8AD采集的效果图

第3节 设计实现
接下来就进入设计的实现阶段,本书会按照步骤和原理分析与读者分享案例的实现方法,考虑到初学者的需要,此部分的内容会比较详细。基础知识掌握得比较牢靠,只想学习此设计的步骤的同学可以跳过此部分,后面章节有简化版的步骤分享。在此还是建议初学者不要选择捷径,一定按照详细分析的内容进行学习,只有掌握基础知识、打好基础,才可以从容的独立完成项目设计。

3.1 顶层信号

新建目录:D:\mdy_book\ad_prj在该目录中,新建一个名为ad_prj.v的文件。用GVIM打开后开始编写代码。这里再次强调,建议初学者按照书中提供的文件路径以及文件名进行设置,避免后续跳出未知错误。

确定顶层信号。分析设计目标可知本设计需要实现以下功能:FPGA产生控制DA9709的信号,令其中的通道A产生正弦波所对应的电压,同时采集AD9280的数据并观察。在此过程中,想要控制DA9709的通道A,就需要控制DA9709MODESLEEPCLK1WRT1DB7~0P1管脚。想要采集AD9280,就需要控制AD9280CLKD0~D7管脚。根据设计需求,共需要10个信号:信号clk连接到晶振表示50M时钟的输入;信号rst_n连接到按键表示复位;3位信号key表示三位拨码开关;信号dac_mode连接到DA9709MODE管脚用来控制其工作模式;信号dac_sleep连接到DA9709SLEEP管脚用来控制其睡眠模式;信号dac_clka连接到DA9709CLK1管脚用来控制通道A的时钟;信号dac_wra连接到DA9709WRT1管脚用来控制通道A的写使能;8位信号dac_da连接到DA9709DB7~0P1管脚用来控制通道A的写数据;信号ad_clk连接到AD9280CLK管脚用来作来采样时钟;8ad_in信号连接到AD9280D7~0管脚用来采集数据。

综上所述,本设计一共需要10个信号:时钟信号clk,复位信号rst_n,拨码开关的输入信号keydac_modedac_sleepdac_clkadac_wradac_daad_clkad_in,其中dac_daad_in8位信号,key3位信号,其他都是1位信号。信号和硬件的对应关系见下表所示。
3.15-2信号和管脚关系
器件
DA9709管脚
AD9280管脚
原理图信号
FPGA管脚
FPGA工程信号
U8
MODE

DAC_MODE
Y4
dac_mode
SLEEP

DAC_SLEEP
H2
dac_sleep
CLK1

DA_CLKA
R2
dac_clka
WRT1

DA_WRA
U1
dac_wra
DB7P1

DAC_DA7
AA1
dac_da[7]
DB6P1

DAC_DA6
Y2
dac_da[6]
DB5P1

DAC_DA5
Y1
dac_da[5]
DB4P1

DAC_DA4
W2
dac_da[4]
DB3P1

DAC_DA3
W1
dac_da[3]
DB2P1

DAC_DA2
V2
dac_da[2]
DB1P1

DAC_DA1
V1
dac_da[1]
DB0P1

DAC_DA0
U2
dac_da[0]
U1

CLK
AD_CLK
L6
ad_clk

D7
AD_D7
N5
ad_in[7]

D6
AD_D6
M4
ad_in[6]

D5
AD_D5
M5
ad_in[5]

D4
AD_D4
R6
ad_in[4]

D3
AD_D3
T5
ad_in[3]

D2
AD_D2
U7
ad_in[2]

D1
AD_D1
V5
ad_in[1]

D0
AD_D0
V6
ad_in[0]
X1


SYS_CLK
G1
clk
K1


SYS_RST
AB12
rst_n
sw0


SW_D0
AA3
key[2]
sw1


SW_D1
AB3
key[1]
sw2


SW_D2
AB5
key[0]

module的名称定义为ad_prj,已知该设计有10个信号:clkrst_nkeydac_modedac_sleepdac_clkadac_wradac_daad_clkad_in,将与外部相连接的信号写入模块接口列表,具体顶层代码如下所示:
1
2
3
4
5
6
7
8
9
module ad_prj(
clk  ,
rst_n  ,
           key       ,
dac_mode ,
dac_clka  ,
dac_da  ,
dac_wra  ,
dac_sleep,
ad_clk  ,
ad_in
           );

随后声明输入输出属性。这里需要声明这个信号对于FPGA来说属于输入还是输出,如果是输入信号则声明其为input,如果是输出则声明其为output。在本设计中,由于clk是外部的晶振输入给FPGA的,因此在FPGAclk1位的输入信号input;同样地,rst_n是外部按键给FPGA的,因此在FPGA中rst_n为1位输入信号inputdac_da8位的输出信号outputdac_modedac_clkadac_wradac_sleep1位输出信号outputad_clk1位输出信号outputad_in8位输入信号inputkey3位输入信号input。综上所述,补充输入输出端口定义的代码如下:
1
2
3
4
5
6
7
input             clk  ;
input             rst_n  ;
input [ 3-1:0]     key        ;
output            dac_mode ;
output            dac_clka  ;
output [ 8-1:0]    dac_da  ;
output            dac_wra  ;
output            dac_sleep ;
output            ad_clk  ;
input  [8-1:0]      ad_in     ;

3.2 正弦信号设计
将正弦信号命名为sin_data信号,sin_data是从表3.15- 3中选择出来的值,该表一共有128个点。具体的采样算法在前面章节“信号发生器和DA转换”中有详细描述,这里就不再进行赘述了。
3.15-3DAC输出采样点对应幅度值
采样点i
sin_data
(16进制)
采样点i
sin_data
(16进制)
采样点i
sin_data
(16进制)
采样点i
sin_data
(16进制)
0
7F
32
FE
64
7D
96
1
1
85
33
FE
65
77
97
1
2
8C
34
FE
66
70
98
2
3
92
35
FD
67
6A
99
3
4
98
36
FC
68
64
100
4
5
9E
37
FA
69
5E
101
6
6
A4
38
F8
70
58
102
7
7
AA
39
F6
71
52
103
A
8
B0
40
F4
72
4C
104
C
9
B6
41
F1
73
46
105
F
10
BC
42
EF
74
41
106
12
11
C1
43
EB
75
3C
107
15
12
C6
44
E8
76
36
108
19
13
CB
45
E4
77
31
109
1D
14
D0
46
E0
78
2C
110
21
15
D5
47
DC
79
28
111
25
16
DA
48
D8
80
23
112
2A
17
DE
49
D3
81
1F
113
2E
18
E2
50
CE
82
1B
114
33
19
E6
51
C9
83
17
115
38
20
EA
52
C4
84
14
116
3E
21
ED
53
BE
85
11
117
43
22
F0
54
B9
86
E
118
49
23
F3
55
B3
87
B
119
4E
24
F5
56
AD
88
9
120
54
25
F7
57
A7
89
7
121
5A
26
F9
58
A1
90
5
122
60
27
FB
59
9B
91
3
123
67
28
FC
60
95
92
2
124
6D
29
FD
61
8F
93
1
125
73
30
FE
62
89
94
1
126
79
31
FE
63
82
95
1
127
7F

定义一个7位的选择信号addr。只要将addr控制好,就可以快速得到sin_data。因此可以写出下面代码:
  1. always  @(*)begin

  2.     case(addr)

  3.           0: sin_data = 8'h7F;

  4.           1: sin_data = 8'h85;

  5.           2: sin_data = 8'h8C;

  6.           3: sin_data = 8'h92;

  7.           4: sin_data = 8'h98;

  8.           5: sin_data = 8'h9E;

  9.           6: sin_data = 8'hA4;

  10.           7: sin_data = 8'hAA;

  11.           8: sin_data = 8'hB0;

  12.           9: sin_data = 8'hB6;

  13.          10: sin_data = 8'hBC;

  14.          11: sin_data = 8'hC1;

  15.          12: sin_data = 8'hC6;

  16.          13: sin_data = 8'hCB;

  17.          14: sin_data = 8'hD0;

  18.          15: sin_data = 8'hD5;

  19.          16: sin_data = 8'hDA;

  20.          17: sin_data = 8'hDE;

  21.          18: sin_data = 8'hE2;

  22.          19: sin_data = 8'hE6;

  23.          20: sin_data = 8'hEA;

  24.          21: sin_data = 8'hED;

  25.          22: sin_data = 8'hF0;

  26.          23: sin_data = 8'hF3;

  27.          24: sin_data = 8'hF5;

  28.          25: sin_data = 8'hF7;

  29.          26: sin_data = 8'hF9;

  30.          27: sin_data = 8'hFB;

  31.          28: sin_data = 8'hFC;

  32.          29: sin_data = 8'hFD;

  33.          30: sin_data = 8'hFE;

  34.          31: sin_data = 8'hFE;

  35.          32: sin_data = 8'hFE;

  36.          33: sin_data = 8'hFE;

  37.          34: sin_data = 8'hFE;

  38.          35: sin_data = 8'hFD;

  39.          36: sin_data = 8'hFC;

  40.          37: sin_data = 8'hFA;

  41.          38: sin_data = 8'hF8;

  42.          39: sin_data = 8'hF6;

  43.          40: sin_data = 8'hF4;

  44.          41: sin_data = 8'hF1;

  45.          42: sin_data = 8'hEF;

  46.          43: sin_data = 8'hEB;

  47.          44: sin_data = 8'hE8;

  48.          45: sin_data = 8'hE4;

  49.          46: sin_data = 8'hE0;

  50.          47: sin_data = 8'hDC;

  51.          48: sin_data = 8'hD8;

  52.          49: sin_data = 8'hD3;

  53.          50: sin_data = 8'hCE;

  54.          51: sin_data = 8'hC9;

  55.          52: sin_data = 8'hC4;

  56.          53: sin_data = 8'hBE;

  57.          54: sin_data = 8'hB9;

  58.          55: sin_data = 8'hB3;

  59.          56: sin_data = 8'hAD;

  60.          57: sin_data = 8'hA7;

  61.          58: sin_data = 8'hA1;

  62.          59: sin_data = 8'h9B;

  63.          60: sin_data = 8'h95;

  64.          61: sin_data = 8'h8F;

  65.          62: sin_data = 8'h89;

  66.          63: sin_data = 8'h82;

  67.          64: sin_data = 8'h7D;

  68.          65: sin_data = 8'h77;

  69.          66: sin_data = 8'h70;

  70.          67: sin_data = 8'h6A;

  71.          68: sin_data = 8'h64;

  72.          69: sin_data = 8'h5E;

  73.          70: sin_data = 8'h58;

  74.          71: sin_data = 8'h52;

  75.          72: sin_data = 8'h4C;

  76.          73: sin_data = 8'h46;

  77.          74: sin_data = 8'h41;

  78.          75: sin_data = 8'h3C;

  79.          76: sin_data = 8'h36;

  80.          77: sin_data = 8'h31;

  81.          78: sin_data = 8'h2C;

  82.          79: sin_data = 8'h28;

  83.          80: sin_data = 8'h23;

  84.          81: sin_data = 8'h1F;

  85.          82: sin_data = 8'h1B;

  86.          83: sin_data = 8'h17;

  87.          84: sin_data = 8'h14;

  88.          85: sin_data = 8'h11;

  89.          86: sin_data = 8'hE ;

  90.          87: sin_data = 8'hB ;

  91.          88: sin_data = 8'h9 ;

  92.          89: sin_data = 8'h7 ;

  93.          90: sin_data = 8'h5 ;

  94.          91: sin_data = 8'h3 ;

  95.          92: sin_data = 8'h2 ;

  96.          93: sin_data = 8'h1 ;

  97.          94: sin_data = 8'h1 ;

  98.          95: sin_data = 8'h1 ;

  99.          96: sin_data = 8'h1 ;

  100.          97: sin_data = 8'h1 ;

  101.          98: sin_data = 8'h2 ;

  102.          99: sin_data = 8'h3 ;

  103.         100: sin_data = 8'h4 ;

  104.         101: sin_data = 8'h6 ;

  105.         102: sin_data = 8'h7 ;

  106.         103: sin_data = 8'hA ;

  107.         104: sin_data = 8'hC ;

  108.         105: sin_data = 8'hF ;

  109.         106: sin_data = 8'h12;

  110.         107: sin_data = 8'h15;

  111.         108: sin_data = 8'h19;

  112.         109: sin_data = 8'h1D;

  113.         110: sin_data = 8'h21;

  114.         111: sin_data = 8'h25;

  115.         112: sin_data = 8'h2A;

  116.         113: sin_data = 8'h2E;

  117.         114: sin_data = 8'h33;

  118.         115: sin_data = 8'h38;

  119.         116: sin_data = 8'h3E;

  120.         117: sin_data = 8'h43;

  121.         118: sin_data = 8'h49;

  122.         119: sin_data = 8'h4E;

  123.         120: sin_data = 8'h54;

  124.         121: sin_data = 8'h5A;

  125.         122: sin_data = 8'h60;

  126.         123: sin_data = 8'h67;

  127.         124: sin_data = 8'h6D;

  128.         125: sin_data = 8'h73;

  129.         126: sin_data = 8'h79;

  130.         127: sin_data = 8'h7F;

  131. endcase

  132. end
复制代码


接下来就来确定一下信号addr。addr是用来控制选择数据的地址,通过控制addr的增加值,就能产生多种频率的正弦波。以频率为100KHz的正弦信号为例。该正弦信号的周期是10000ns,本工程的工作时钟是20ns,也就是10000/20 = 500个时钟输出一个正弦信号,即500个时钟需要输出128个点,因此每个时钟addr增加的值为128/500 = 0.256。

按同样的分析方法,可以得到其他信号频率的addr增加值如下所示:

100KHz的正弦信号,每个时钟addr增加:128/250 = 0.256
200KHz的正弦信号,每个时钟addr增加:128/250 = 0.512
300KHz的正弦信号,每个时钟addr增加:128/166.6667 = 0.7679
400KHz的正弦信号,每个时钟addr增加:128/125 = 1.024
500KHz的正弦信号,每个时钟addr增加:128/100 = 1.28  
600KHz的正弦信号,每个时钟addr增加:128/83.3333 = 1.5358
700KHz的正弦信号,每个时钟addr增加:128/71.4286 = 1.792
800KHz的正弦信号,每个时钟addr增加:128/62.5 = 2.048

addr是表示的是采样点的值,即0~127的整数,但是上面方法计算出addr的每次增加值包含小数。众所周知FPGA是没有小数的,因此可以将上面的小数乘以1024后取整,这样一来就变成了每次要增加的整数,将结果保存到addr_tmp中。即:

100KHz的正弦信号,每个时钟addr_tmp增加:0.256*1024 = 262.144 ≈ 262
200KHz的正弦信号,每个时钟addr_tmp增加:0.512*1024 = 524.288 ≈ 524
300KHz的正弦信号,每个时钟addr_tmp增加:0.7679*1024 =786.3296 ≈ 786
400KHz的正弦信号,每个时钟addr_tmp增加:1.024*1024 =1028.576 ≈ 1029
500KHz的正弦信号,每个时钟addr_tmp增加:1.28*1024 =1310.72  ≈ 1311
600KHz的正弦信号,每个时钟addr_tmp增加:1.5358*1024 =1572.6592 ≈1573
700KHz的正弦信号,每个时钟addr_tmp增加:1.792*1024 =1835.008 ≈ 1835
800KHz的正弦信号,每个时钟addr_tmp增加: 2.048*1024 =2097.152 ≈ 2097

分析设计目标可以知道上面8种频率信号都是由拨码信号key控制的,因此可以写出addr_tmp的代码如下:
  1. always  @(posedge clk or negedge rst_n)begin

  2.     if(rst_n==1'b0)begin

  3. addr_tmp<= 0;

  4.     end

  5.     else if(key==0) begin

  6. addr_tmp<= addr_tmp + 262;

  7.     end

  8.     else if(key==1) begin

  9. addr_tmp<= addr_tmp + 524;

  10.     end

  11.     else if(key==2) begin

  12. addr_tmp<= addr_tmp + 786;

  13.     end

  14.     else if(key==3) begin

  15. addr_tmp<= addr_tmp + 1029;

  16.     end

  17.     else if(key==4) begin

  18. addr_tmp<= addr_tmp + 1311;

  19.     end

  20.     else if(key==5) begin

  21. addr_tmp<= addr_tmp + 1573;

  22.     end

  23.     else if(key==6) begin

  24. addr_tmp<= addr_tmp + 1835;

  25.     end

  26.     else begin

  27. addr_tmp<= addr_tmp + 2097;

  28.     end

  29. end
复制代码


而addr_tmp是小数乘以1024后得到的,因此最终addr_tmp还需要除以1024后再赋给addr。在设计中除以1024即信号向右移10位。addr_tmp向右移10位后,保留7位结果赋给addr就可以了。因此addr_tmp位宽为17位,其代码表示如下:
1
assign addr = addr_tmp>>10 ;

3.3 DA接口信号设计
接下来设计信号dac_da。dac_da是直接输出正弦信号的,但由于DA的输出电压与dac_da是成反比例线性关系,所以dac_da都是通过(255-sin_data)得到。写代码时可以调用至简设计法模板,在编辑模式下输入“Shixu2”,将其补充完整得到dac_da的代码表示如下:
1
2
3
4
5
6
7
8
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;
    end
end

接着设计信号dac_sleep,AD是一直工作的,因此dac_sleep一直为0;dac_clka为了满足tS的时间要求,可以让dac_clka = ~clk,dac_wra信号可以与dac_clka相同,其具体代码表示如下:
1
2
3
assign dac_sleep = 0        ;
assign dac_wra   = dac_clka ;
assign dac_clka  = ~clk      ;

至此,主体程序已经完成。

3.4 信号定义
接下来将module补充完整首先来定义信号类型。regwire的判断很容易搞不清楚总会有多余的联想,比如认为reg就是寄存器,wire是线;或者认为reg会综合成寄存器,wire不会综合成寄存器。但是这些其实和reg型还是wire型都并无关系,在进行信号类型判断时不需要做任何的联想,只要记住一个规则“用always实现的是reg型,其他都是wire型”就可以了。

addr是用assign设计的,因此类型为wireaddr值最大为127,需要用7根线表示,即位宽为7

关于信号位宽的确定方法,在这里至简设计法分享一个非常实用的技巧:打开计算器,点击“查看”,选择“程序员”模式,在“十进制”下将信号值输入进去,就会获得对应的信号位宽。利用这一方法将addr的最大计数值127输入到计算器中,如下图所示,可以看到其位宽为7。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 13217.png
3.15-9通过计算器获取信号位宽

综上所述,addr的定义代码如下所示。
1
wire    [6:0]    addr    ;

addr_tmp是用always设计的信号,因此类型为reg。该信号的位宽是17,代码表示如下:
1
reg   [16:0]    addr_tmp    ;

sin_data是用always设计的,因此类型为reg。其最大值为255,要用8根线表示,位宽为8,这里可以在编辑模式下输入“Reg8”调用至简设计法模板,补充完整后得到代码如下:
1
reg   [7:0]    sin_data    ;

dac_da是用always设计的,因此类型为reg,其位宽为8
dac_sleep是用assign设计的,因此类型为wire,其位宽为1
dac_wra是用assign设计的,因此类型为wire,其位宽为1
dac_clka是用assign设计的,因此类型为wire,其位宽为1
dac_mode是用assign设计的,因此类型为wire,其位宽为1

依旧在编辑模式下输入“ Reg8”“Wire1”调用至简设计法模板,补充完整后得到代码如下:
1
reg   [7:0]    dac_da    ;
wire          dac_sleep  ;
wire          dac_wra  ;
wire          dac_clka  ;
wire          dac_mode ;

ad_clk是由例化模块输出信号,非always产生,可以定义为wire型,位宽只有1位。在编辑模式下输入“Wire1”调用至简设计法模板,补充完整后得到代码如下:
1
wire                        ad_clk  ;

至此,整个代码的设计工作已经完成。完整版的工程代码如下:
  1. module ad_prj(

  2. clk  ,

  3. rst_n  ,

  4.            key       ,

  5. dac_mode ,

  6. dac_clka  ,

  7. dac_da  ,

  8. dac_wra  ,

  9. dac_sleep,

  10. ad_clk  ,

  11. ad_in

  12.            );

  13. input             clk  ;

  14. input             rst_n  ;

  15. input [ 3-1:0]     key        ;

  16. output            dac_mode ;

  17. output            dac_clka  ;

  18. output [ 8-1:0]    dac_da  ;

  19. output            dac_wra  ;

  20. output            dac_sleep ;

  21. output            ad_clk  ;

  22. input  [8-1:0]      ad_in     ;



  23. wire    [6:0]    addr    ;

  24. reg   [16:0]    addr_tmp    ;

  25. reg   [7:0]    sin_data    ;

  26. reg   [7:0]    dac_da    ;

  27. wire          dac_sleep  ;

  28. wire          dac_wra  ;

  29. wire          dac_clka  ;

  30. wire          dac_mode ;

  31. wire          ad_clk  ;



  32. always  @(*)begin

  33.     case(addr)

  34.           0: sin_data = 8'h7F;

  35.           1: sin_data = 8'h85;

  36.           2: sin_data = 8'h8C;

  37.           3: sin_data = 8'h92;

  38.           4: sin_data = 8'h98;

  39.           5: sin_data = 8'h9E;

  40.           6: sin_data = 8'hA4;

  41.           7: sin_data = 8'hAA;

  42.           8: sin_data = 8'hB0;

  43.           9: sin_data = 8'hB6;

  44.          10: sin_data = 8'hBC;

  45.          11: sin_data = 8'hC1;

  46.          12: sin_data = 8'hC6;

  47.          13: sin_data = 8'hCB;

  48.          14: sin_data = 8'hD0;

  49.          15: sin_data = 8'hD5;

  50.          16: sin_data = 8'hDA;

  51.          17: sin_data = 8'hDE;

  52.          18: sin_data = 8'hE2;

  53.          19: sin_data = 8'hE6;

  54.          20: sin_data = 8'hEA;

  55.          21: sin_data = 8'hED;

  56.          22: sin_data = 8'hF0;

  57.          23: sin_data = 8'hF3;

  58.          24: sin_data = 8'hF5;

  59.          25: sin_data = 8'hF7;

  60.          26: sin_data = 8'hF9;

  61.          27: sin_data = 8'hFB;

  62.          28: sin_data = 8'hFC;

  63.          29: sin_data = 8'hFD;

  64.          30: sin_data = 8'hFE;

  65.          31: sin_data = 8'hFE;

  66.          32: sin_data = 8'hFE;

  67.          33: sin_data = 8'hFE;

  68.          34: sin_data = 8'hFE;

  69.          35: sin_data = 8'hFD;

  70.          36: sin_data = 8'hFC;

  71.          37: sin_data = 8'hFA;

  72.          38: sin_data = 8'hF8;

  73.          39: sin_data = 8'hF6;

  74.          40: sin_data = 8'hF4;

  75.          41: sin_data = 8'hF1;

  76.          42: sin_data = 8'hEF;

  77.          43: sin_data = 8'hEB;

  78.          44: sin_data = 8'hE8;

  79.          45: sin_data = 8'hE4;

  80.          46: sin_data = 8'hE0;

  81.          47: sin_data = 8'hDC;

  82.          48: sin_data = 8'hD8;

  83.          49: sin_data = 8'hD3;

  84.          50: sin_data = 8'hCE;

  85.          51: sin_data = 8'hC9;

  86.          52: sin_data = 8'hC4;

  87.          53: sin_data = 8'hBE;

  88.          54: sin_data = 8'hB9;

  89.          55: sin_data = 8'hB3;

  90.          56: sin_data = 8'hAD;

  91.          57: sin_data = 8'hA7;

  92.          58: sin_data = 8'hA1;

  93.          59: sin_data = 8'h9B;

  94.          60: sin_data = 8'h95;

  95.          61: sin_data = 8'h8F;

  96.          62: sin_data = 8'h89;

  97.          63: sin_data = 8'h82;

  98.          64: sin_data = 8'h7D;

  99.          65: sin_data = 8'h77;

  100.          66: sin_data = 8'h70;

  101.          67: sin_data = 8'h6A;

  102.          68: sin_data = 8'h64;

  103.          69: sin_data = 8'h5E;

  104.          70: sin_data = 8'h58;

  105.          71: sin_data = 8'h52;

  106.          72: sin_data = 8'h4C;

  107.          73: sin_data = 8'h46;

  108.          74: sin_data = 8'h41;

  109.          75: sin_data = 8'h3C;

  110.          76: sin_data = 8'h36;

  111.          77: sin_data = 8'h31;

  112.          78: sin_data = 8'h2C;

  113.          79: sin_data = 8'h28;

  114.          80: sin_data = 8'h23;

  115.          81: sin_data = 8'h1F;

  116.          82: sin_data = 8'h1B;

  117.          83: sin_data = 8'h17;

  118.          84: sin_data = 8'h14;

  119.          85: sin_data = 8'h11;

  120.          86: sin_data = 8'hE ;

  121.          87: sin_data = 8'hB ;

  122.          88: sin_data = 8'h9 ;

  123.          89: sin_data = 8'h7 ;

  124.          90: sin_data = 8'h5 ;

  125.          91: sin_data = 8'h3 ;

  126.          92: sin_data = 8'h2 ;

  127.          93: sin_data = 8'h1 ;

  128.          94: sin_data = 8'h1 ;

  129.          95: sin_data = 8'h1 ;

  130.          96: sin_data = 8'h1 ;

  131.          97: sin_data = 8'h1 ;

  132.          98: sin_data = 8'h2 ;

  133.          99: sin_data = 8'h3 ;

  134.         100: sin_data = 8'h4 ;

  135.         101: sin_data = 8'h6 ;

  136.         102: sin_data = 8'h7 ;

  137.         103: sin_data = 8'hA ;

  138.         104: sin_data = 8'hC ;

  139.         105: sin_data = 8'hF ;

  140.         106: sin_data = 8'h12;

  141.         107: sin_data = 8'h15;

  142.         108: sin_data = 8'h19;

  143.         109: sin_data = 8'h1D;

  144.         110: sin_data = 8'h21;

  145.         111: sin_data = 8'h25;

  146.         112: sin_data = 8'h2A;

  147.         113: sin_data = 8'h2E;

  148.         114: sin_data = 8'h33;

  149.         115: sin_data = 8'h38;

  150.         116: sin_data = 8'h3E;

  151.         117: sin_data = 8'h43;

  152.         118: sin_data = 8'h49;

  153.         119: sin_data = 8'h4E;

  154.         120: sin_data = 8'h54;

  155.         121: sin_data = 8'h5A;

  156.         122: sin_data = 8'h60;

  157.         123: sin_data = 8'h67;

  158.         124: sin_data = 8'h6D;

  159.         125: sin_data = 8'h73;

  160.         126: sin_data = 8'h79;

  161.         127: sin_data = 8'h7F;

  162. endcase

  163. end



  164. always  @(posedge clk or negedge rst_n)begin

  165.     if(rst_n==1'b0)begin

  166. addr_tmp<= 0;

  167.     end

  168.     else if(key==0) begin

  169. addr_tmp<= addr_tmp + 262;

  170.     end

  171.     else if(key==1) begin

  172. addr_tmp<= addr_tmp + 524;

  173.     end

  174.     else if(key==2) begin

  175. addr_tmp<= addr_tmp + 786;

  176.     end

  177.     else if(key==3) begin

  178. addr_tmp<= addr_tmp + 1029;

  179.     end

  180.     else if(key==4) begin

  181. addr_tmp<= addr_tmp + 1311;

  182.     end

  183.     else if(key==5) begin

  184. addr_tmp<= addr_tmp + 1573;

  185.     end

  186.     else if(key==6) begin

  187. addr_tmp<= addr_tmp + 1835;

  188.     end

  189.     else begin

  190. addr_tmp<= addr_tmp + 2097;

  191.     end

  192. end



  193. assign addr = addr_tmp>>10 ;



  194. always  @(posedge clk or negedge rst_n)begin

  195.     if(rst_n==1'b0)begin

  196. dac_da<= 0;

  197.     end

  198.     else begin

  199. dac_da<= 255 - sin_data;

  200.     end

  201. end



  202. assign dac_sleep = 0        ;

  203. assign dac_wra   = dac_clka ;

  204. assign dac_clka  = ~clk      ;



  205. endmodule
复制代码


第4节 综合与上板

4.1 添加文件
打开软件“Quartus”,点击“File”菜单下的“New Project Wizard”,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 19639.png
3.15-10QUARTUS新建工程命令

弹出“Introduction”界面点击“Next”,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 19718.png
3.15-11QUARTUS新建工程介绍界面

设置工程目录、工程名、顶层模块名,其中工程目录设置为D:\mdy_book\ad_prj,工程名设置为:ad_prj,顶层模块名设置为:ad_prj,填写完毕后直接点击“next”,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 19864.png
3.15-12QUARTUS设置新工程路径和名称

在设置新工程类型界面选择“Empty project”选项,选择空白工程点击“Next”,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 19965.png
3.15-13QUARTUS设置新工程类型

错误!未找到引用源。接下来添加文件,此处不选择任何文件,直接点击“Next”,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 20096.png
3.15-14QUARTUS添加文件到工程界面

随后进入芯片型号选择界面,选择“Cyclone ⅣE”,在芯片型号选择处选择“EP4CE15F23C8”,如下图所示,完成选择后点击“Finish”。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 20220.png
3.15-15QUARTUS设置新工程的芯片型号

打开软件“Quartus”,在“Project”菜单中选择“Add/Remove File to Project”,随后会弹出文件窗口。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 20338.png
3.15-16添加文件命令界面

点击右上角 【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 20384.png 按钮,在弹出来的窗口中双击选择D:\mdy_book\ad_prj目录下的“ad_prj.v”和“my_pll.qip”文件。点击“Add”后完成添加,添加成功后点击“OK关闭本窗口。添加文件成功界面如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 20493.png
3.15-17添加文件成功界面

4.2 综合
编译界面如下图所示,在菜单栏中选中Processing”然后选择“Start Compilation”,开始对整个工程进行编译和综合。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 20605.png
3.15-18编译命令界面

当出现如下图所示的界面就说明编译综合成功。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 20665.png
3.15-19编译成功界面

4.3 配置管脚
下面需要对相应管脚进行配置。如下图所示,在菜单栏中选中“Assignments”,然后选择“Pin Planner”,随后就会弹出配置管脚的窗口。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 20782.png
3.15-20配置管脚命令界面

在配置窗口最下方中的“location”一列,参考3.2-2信号和管脚关系,按照表3.15- 2中最右两列配置好FPGA管脚,配置管理来源参见管脚配置环节,最终配置的结果如图3.15-22。配置完成后,关闭Pin Planner,软件自动会保存管脚配置信息。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 20977.png
3.15-21配置管脚界面

3.15 - 1信号和管脚关系
器件
DA9709管脚
AD9280管脚
原理图信号
FPGA管脚
FPGA工程信号
U8
MODE
DAC_MODE
Y4
dac_mode
SLEEP
DAC_SLEEP
H2
dac_sleep
CLK1
DA_CLKA
R2
dac_clka
WRT1
DA_WRA
U1
dac_wra
DB7P1
DAC_DA7
AA1
dac_da[7]
DB6P1
DAC_DA6
Y2
dac_da[6]
DB5P1
DAC_DA5
Y1
dac_da[5]
DB4P1
DAC_DA4
W2
dac_da[4]
DB3P1
DAC_DA3
W1
dac_da[3]
DB2P1
DAC_DA2
V2
dac_da[2]
DB1P1
DAC_DA1
V1
dac_da[1]
DB0P1
DAC_DA0
U2
dac_da[0]
U1
CLK
AD_CLK
L6
ad_clk
D7
AD_D7
N5
ad_in[7]
D6
AD_D6
M4
ad_in[6]
D5
AD_D5
M5
ad_in[5]
D4
AD_D4
R6
ad_in[4]
D3
AD_D3
T5
ad_in[3]
D2
AD_D2
U7
ad_in[2]
D1
AD_D1
V5
ad_in[1]
D0
AD_D0
V6
ad_in[0]
X1
SYS_CLK
G1
clk
K1
SYS_RST
AB12
rst_n
sw0
SW_D0
AA3
key[2]
sw1
SW_D1
AB3
key[1]
sw2
SW_D2
AB5
key[0]


【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 21796.png

3.15-22配置管脚成功界面


4.4 再次综合
再次打开“QUARTUS”软件,在菜单栏中选中“Processing”,然后选择“Start Compilation”,再次对整个工程进行编译和综合,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 21923.png
3.15-23编译命令界面

当出现3.2-19QUARTUS编译成功标志时就说明编译综合成功。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 22019.png
3.15-24编译成功界面

4.5 连接开发板
完成编译后开始进行上板调试操作,开发板连接方式如下图所示。将电源接上开发板USB BLASTER一端连接到JTAG插口,另一端连到PCUSB接口。将开发板上的AD接口和DA两个通道相连,连接完成后再将电源打开。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 22171.png
3.15-25教学板连接示意图

4.5.1 设置SIGNALTAP
编译通过后,点击“Tools”选项下的“SingaⅡLogic Analyzer”。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 22266.png
3.15-26设置signaltap界面

得到的原始“signaltap”界面如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 22335.png
3.15-27原始“signaltap”界面

点击Hardware”中的“Setup”选项,弹出“Hadware Setup”窗口。在“Currently selected hardware”选项下选择“USB-Blaster [USB0]”,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 22489.png
3.15-28Hadware Setup设置界面

点击SOF Manager”右边的三个点,随后会弹出文件选择窗口,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 22579.png
3.15-29弹出文件选择窗口

选择ad_prj.sof ”文件,点击Open”如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 22652.png
3.15-30选择文件界面

配置时钟界面如下图所示,点击Clock”选项后的三个点标志,“Filter”处选择下拉菜单中的“Design Entryall names”选项,点击“list”,在“Nodes Found”栏选择“clk”选项,点击两栏中间第一个右向箭头后可以看到“Selected Nodes”栏出现对应的“clk”,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 22853.png
3.15-31配置时钟界面

“Sample depth”选项下拉菜单中选择1K,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 22925.png
3.15-32采样设置

选择所有要抓取的信号,选择完毕后点击OK”。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 22985.png
3.15-33选择要抓取的信号

回到本界面再次进行编译
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 23038.png
3.15-34再次进行编译

点击SOF Manager”进行下载,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 23103.png
3.15-35下载界面

需要注意的是:点击 【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 23148.png 按键表示抓取一次点击 【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 23160.png 按键表示连续抓取

4.5.2 SIGNALTAP观察
为了方便查看波形,可以在Hierarchy Display”区域空白处右键,点击“Bus Display Format”选项中的“Unsigned Line Chart”,得到更加细节化的正弦波,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 23290.png
3.15-36细节化观察波形

100KHz的正弦波如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 23346.png
3.15-37100KHz正弦波

300kHz的正弦波如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 23404.png
3.15-38 300KHz正弦波

500KHz的正弦波如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 23463.png
3.15-39 500KHz正弦波

800KHz的正弦波如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 23522.png
3.15-40 800KHz正弦波

第5节 简化版步骤分享

这里依旧会分享简化版的步骤,方便掌握基础原理后进行反复操作复习。

5.1 设计实现

5.1.1 顶层信号
新建目录:D:\mdy_book\ad_prj在该目录中,新建一个名为ad_prj.v的文件,并用GVIM打开,开始编写代码。

分析设计目标,确定顶层信号。信号和硬件的对应关系见表3.15- 2。
3.15- 2信号和管脚关系
器件
DA9709管脚
AD9280管脚
原理图信号
FPGA管脚
FPGA工程信号
U8
MODE

DAC_MODE
Y4
dac_mode
SLEEP

DAC_SLEEP
H2
dac_sleep
CLK1

DA_CLKA
R2
dac_clka
WRT1

DA_WRA
U1
dac_wra
DB7P1

DAC_DA7
AA1
dac_da[7]
DB6P1

DAC_DA6
Y2
dac_da[6]
DB5P1

DAC_DA5
Y1
dac_da[5]
DB4P1

DAC_DA4
W2
dac_da[4]
DB3P1

DAC_DA3
W1
dac_da[3]
DB2P1

DAC_DA2
V2
dac_da[2]
DB1P1

DAC_DA1
V1
dac_da[1]
DB0P1

DAC_DA0
U2
dac_da[0]
U1

CLK
AD_CLK
L6
ad_clk

D7
AD_D7
N5
ad_in[7]

D6
AD_D6
M4
ad_in[6]

D5
AD_D5
M5
ad_in[5]

D4
AD_D4
R6
ad_in[4]

D3
AD_D3
T5
ad_in[3]

D2
AD_D2
U7
ad_in[2]

D1
AD_D1
V5
ad_in[1]

D0
AD_D0
V6
ad_in[0]
X1


SYS_CLK
G1
clk
K1


SYS_RST
AB12
rst_n
sw0


SW_D0
AA3
key[2]
sw1


SW_D1
AB3
key[1]
sw2


SW_D2
AB5
key[0]

写出顶层代码如下:
1
2
3
4
5
6
7
8
9
module ad_prj(
clk  ,
rst_n  ,
           key       ,
dac_mode ,
dac_clka  ,
dac_da  ,
dac_wra  ,
dac_sleep,
ad_clk  ,
ad_in
           );

声明输入输出属性代码如下:
1
2
3
4
5
6
7
input             clk  ;
input             rst_n  ;
input [ 3-1:0]     key        ;
output            dac_mode ;
output            dac_clka  ;
output [ 8-1:0]    dac_da  ;
output            dac_wra  ;
output            dac_sleep ;
output            ad_clk  ;
input  [8-1:0]      ad_in     ;

5.1.2 正弦信号设计
采样点对应幅度值如下表所示。
3.15- 3DAC输出采样点对应幅度值
采样点i
sin_data
16进制)
采样点i
sin_data
16进制)
采样点i
sin_data
16进制)
采样点i
sin_data
16进制)
0
7F
32
FE
64
7D
96
1
1
85
33
FE
65
77
97
1
2
8C
34
FE
66
70
98
2
3
92
35
FD
67
6A
99
3
4
98
36
FC
68
64
100
4
5
9E
37
FA
69
5E
101
6
6
A4
38
F8
70
58
102
7
7
AA
39
F6
71
52
103
A
8
B0
40
F4
72
4C
104
C
9
B6
41
F1
73
46
105
F
10
BC
42
EF
74
41
106
12
11
C1
43
EB
75
3C
107
15
12
C6
44
E8
76
36
108
19
13
CB
45
E4
77
31
109
1D
14
D0
46
E0
78
2C
110
21
15
D5
47
DC
79
28
111
25
16
DA
48
D8
80
23
112
2A
17
DE
49
D3
81
1F
113
2E
18
E2
50
CE
82
1B
114
33
19
E6
51
C9
83
17
115
38
20
EA
52
C4
84
14
116
3E
21
ED
53
BE
85
11
117
43
22
F0
54
B9
86
E
118
49
23
F3
55
B3
87
B
119
4E
24
F5
56
AD
88
9
120
54
25
F7
57
A7
89
7
121
5A
26
F9
58
A1
90
5
122
60
27
FB
59
9B
91
3
123
67
28
FC
60
95
92
2
124
6D
29
FD
61
8F
93
1
125
73
30
FE
62
89
94
1
126
79
31
FE
63
82
95
1
127
7F

设计sin_data信号:
  1. always  @(*)begin

  2.     case(addr)

  3.           0: sin_data = 8'h7F;

  4.           1: sin_data = 8'h85;

  5.           2: sin_data = 8'h8C;

  6.           3: sin_data = 8'h92;

  7.           4: sin_data = 8'h98;

  8.           5: sin_data = 8'h9E;

  9.           6: sin_data = 8'hA4;

  10.           7: sin_data = 8'hAA;

  11.           8: sin_data = 8'hB0;

  12.           9: sin_data = 8'hB6;

  13.          10: sin_data = 8'hBC;

  14.          11: sin_data = 8'hC1;

  15.          12: sin_data = 8'hC6;

  16.          13: sin_data = 8'hCB;

  17.          14: sin_data = 8'hD0;

  18.          15: sin_data = 8'hD5;

  19.          16: sin_data = 8'hDA;

  20.          17: sin_data = 8'hDE;

  21.          18: sin_data = 8'hE2;

  22.          19: sin_data = 8'hE6;

  23.          20: sin_data = 8'hEA;

  24.          21: sin_data = 8'hED;

  25.          22: sin_data = 8'hF0;

  26.          23: sin_data = 8'hF3;

  27.          24: sin_data = 8'hF5;

  28.          25: sin_data = 8'hF7;

  29.          26: sin_data = 8'hF9;

  30.          27: sin_data = 8'hFB;

  31.          28: sin_data = 8'hFC;

  32.          29: sin_data = 8'hFD;

  33.          30: sin_data = 8'hFE;

  34.          31: sin_data = 8'hFE;

  35.          32: sin_data = 8'hFE;

  36.          33: sin_data = 8'hFE;

  37.          34: sin_data = 8'hFE;

  38.          35: sin_data = 8'hFD;

  39.          36: sin_data = 8'hFC;

  40.          37: sin_data = 8'hFA;

  41.          38: sin_data = 8'hF8;

  42.          39: sin_data = 8'hF6;

  43.          40: sin_data = 8'hF4;

  44.          41: sin_data = 8'hF1;

  45.          42: sin_data = 8'hEF;

  46.          43: sin_data = 8'hEB;

  47.          44: sin_data = 8'hE8;

  48.          45: sin_data = 8'hE4;

  49.          46: sin_data = 8'hE0;

  50.          47: sin_data = 8'hDC;

  51.          48: sin_data = 8'hD8;

  52.          49: sin_data = 8'hD3;

  53.          50: sin_data = 8'hCE;

  54.          51: sin_data = 8'hC9;

  55.          52: sin_data = 8'hC4;

  56.          53: sin_data = 8'hBE;

  57.          54: sin_data = 8'hB9;

  58.          55: sin_data = 8'hB3;

  59.          56: sin_data = 8'hAD;

  60.          57: sin_data = 8'hA7;

  61.          58: sin_data = 8'hA1;

  62.          59: sin_data = 8'h9B;

  63.          60: sin_data = 8'h95;

  64.          61: sin_data = 8'h8F;

  65.          62: sin_data = 8'h89;

  66.          63: sin_data = 8'h82;

  67.          64: sin_data = 8'h7D;

  68.          65: sin_data = 8'h77;

  69.          66: sin_data = 8'h70;

  70.          67: sin_data = 8'h6A;

  71.          68: sin_data = 8'h64;

  72.          69: sin_data = 8'h5E;

  73.          70: sin_data = 8'h58;

  74.          71: sin_data = 8'h52;

  75.          72: sin_data = 8'h4C;

  76.          73: sin_data = 8'h46;

  77.          74: sin_data = 8'h41;

  78.          75: sin_data = 8'h3C;

  79.          76: sin_data = 8'h36;

  80.          77: sin_data = 8'h31;

  81.          78: sin_data = 8'h2C;

  82.          79: sin_data = 8'h28;

  83.          80: sin_data = 8'h23;

  84.          81: sin_data = 8'h1F;

  85.          82: sin_data = 8'h1B;

  86.          83: sin_data = 8'h17;

  87.          84: sin_data = 8'h14;

  88.          85: sin_data = 8'h11;

  89.          86: sin_data = 8'hE ;

  90.          87: sin_data = 8'hB ;

  91.          88: sin_data = 8'h9 ;

  92.          89: sin_data = 8'h7 ;

  93.          90: sin_data = 8'h5 ;

  94.          91: sin_data = 8'h3 ;

  95.          92: sin_data = 8'h2 ;

  96.          93: sin_data = 8'h1 ;

  97.          94: sin_data = 8'h1 ;

  98.          95: sin_data = 8'h1 ;

  99.          96: sin_data = 8'h1 ;

  100.          97: sin_data = 8'h1 ;

  101.          98: sin_data = 8'h2 ;

  102.          99: sin_data = 8'h3 ;

  103.         100: sin_data = 8'h4 ;

  104.         101: sin_data = 8'h6 ;

  105.         102: sin_data = 8'h7 ;

  106.         103: sin_data = 8'hA ;

  107.         104: sin_data = 8'hC ;

  108.         105: sin_data = 8'hF ;

  109.         106: sin_data = 8'h12;

  110.         107: sin_data = 8'h15;

  111.         108: sin_data = 8'h19;

  112.         109: sin_data = 8'h1D;

  113.         110: sin_data = 8'h21;

  114.         111: sin_data = 8'h25;

  115.         112: sin_data = 8'h2A;

  116.         113: sin_data = 8'h2E;

  117.         114: sin_data = 8'h33;

  118.         115: sin_data = 8'h38;

  119.         116: sin_data = 8'h3E;

  120.         117: sin_data = 8'h43;

  121.         118: sin_data = 8'h49;

  122.         119: sin_data = 8'h4E;

  123.         120: sin_data = 8'h54;

  124.         121: sin_data = 8'h5A;

  125.         122: sin_data = 8'h60;

  126.         123: sin_data = 8'h67;

  127.         124: sin_data = 8'h6D;

  128.         125: sin_data = 8'h73;

  129.         126: sin_data = 8'h79;

  130.         127: sin_data = 8'h7F;

  131. endcase

  132. end
复制代码

设计addr信号:
  1. always  @(posedge clk or negedge rst_n)begin
  2.     if(rst_n==1'b0)begin
  3. addr_tmp<= 0;
  4.     end
  5.     else if(key==0) begin
  6. addr_tmp<= addr_tmp + 262;
  7.     end
  8.     else if(key==1) begin
  9. addr_tmp<= addr_tmp + 524;
  10.     end
  11.     else if(key==2) begin
  12. addr_tmp<= addr_tmp + 786;
  13.     end
  14.     else if(key==3) begin
  15. addr_tmp<= addr_tmp + 1029;
  16.     end
  17.     else if(key==4) begin
  18. addr_tmp<= addr_tmp + 1311;
  19.     end
  20.     else if(key==5) begin
  21. addr_tmp<= addr_tmp + 1573;
  22.     end
  23.     else if(key==6) begin
  24. addr_tmp<= addr_tmp + 1835;
  25.     end
  26.     else begin
  27. addr_tmp<= addr_tmp + 2097;
  28.     end
  29. end
复制代码

设计addr_tmp信号:
1
assign addr = addr_tmp>>10 ;

5.1.3 DA接口信号设计
设计dac_da信号:
1
2
3
4
5
6
7
8
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;
    end
end

设计dac_sleep信号:
1
2
3
assign dac_sleep = 0        ;
assign dac_wra   = dac_clka ;
assign dac_clka  = ~clk      ;

至此,主体程序已经完成,接下来是将module补充完整。

5.1.4 信号定义
首先定义信号类型,addr信号的定义代码表示如下:
1
wire    [6:0]    addr    ;

addr_tmp信号的定义代码表示如下:
1
reg   [16:0]    addr_tmp    ;

sin_data信号的定义代码表示如下:
1
reg   [7:0]    sin_data    ;

dac_dadac_sleepdac_wradac_clka、dac_mode信号的定义代码表示如下:
1
reg   [7:0]    dac_da    ;
wire          dac_sleep  ;
wire          dac_wra  ;
wire          dac_clka  ;
wire          dac_mode ;

ad_clk信号的定义代码表示如下:
1
wire                        ad_clk  ;

完整版的工程代码如下:
  1. module ad_prj(
  2. clk  ,
  3. rst_n  ,
  4.            key       ,
  5. dac_mode ,
  6. dac_clka  ,
  7. dac_da  ,
  8. dac_wra  ,
  9. dac_sleep,
  10. ad_clk  ,
  11. ad_in
  12.            );
  13. input             clk  ;
  14. input             rst_n  ;
  15. input [ 3-1:0]     key        ;
  16. output            dac_mode ;
  17. output            dac_clka  ;
  18. output [ 8-1:0]    dac_da  ;
  19. output            dac_wra  ;
  20. output            dac_sleep ;
  21. output            ad_clk  ;
  22. input  [8-1:0]      ad_in     ;
  23. wire    [6:0]    addr    ;
  24. reg   [16:0]    addr_tmp    ;
  25. reg   [7:0]    sin_data    ;
  26. reg   [7:0]    dac_da    ;
  27. wire          dac_sleep  ;
  28. wire          dac_wra  ;
  29. wire          dac_clka  ;
  30. wire          dac_mode ;
  31. wire          ad_clk  ;
  32. always  @(*)begin
  33.     case(addr)
  34.           0: sin_data = 8'h7F;
  35.           1: sin_data = 8'h85;
  36.           2: sin_data = 8'h8C;
  37.           3: sin_data = 8'h92;
  38.           4: sin_data = 8'h98;
  39.           5: sin_data = 8'h9E;
  40.           6: sin_data = 8'hA4;
  41.           7: sin_data = 8'hAA;
  42.           8: sin_data = 8'hB0;
  43.           9: sin_data = 8'hB6;
  44.          10: sin_data = 8'hBC;
  45.          11: sin_data = 8'hC1;
  46.          12: sin_data = 8'hC6;
  47.          13: sin_data = 8'hCB;
  48.          14: sin_data = 8'hD0;
  49.          15: sin_data = 8'hD5;
  50.          16: sin_data = 8'hDA;
  51.          17: sin_data = 8'hDE;
  52.          18: sin_data = 8'hE2;
  53.          19: sin_data = 8'hE6;
  54.          20: sin_data = 8'hEA;
  55.          21: sin_data = 8'hED;
  56.          22: sin_data = 8'hF0;
  57.          23: sin_data = 8'hF3;
  58.          24: sin_data = 8'hF5;
  59.          25: sin_data = 8'hF7;
  60.          26: sin_data = 8'hF9;
  61.          27: sin_data = 8'hFB;
  62.          28: sin_data = 8'hFC;
  63.          29: sin_data = 8'hFD;
  64.          30: sin_data = 8'hFE;
  65.          31: sin_data = 8'hFE;
  66.          32: sin_data = 8'hFE;
  67.          33: sin_data = 8'hFE;
  68.          34: sin_data = 8'hFE;
  69.          35: sin_data = 8'hFD;
  70.          36: sin_data = 8'hFC;
  71.          37: sin_data = 8'hFA;
  72.          38: sin_data = 8'hF8;
  73.          39: sin_data = 8'hF6;
  74.          40: sin_data = 8'hF4;
  75.          41: sin_data = 8'hF1;
  76.          42: sin_data = 8'hEF;
  77.          43: sin_data = 8'hEB;
  78.          44: sin_data = 8'hE8;
  79.          45: sin_data = 8'hE4;
  80.          46: sin_data = 8'hE0;
  81.          47: sin_data = 8'hDC;
  82.          48: sin_data = 8'hD8;
  83.          49: sin_data = 8'hD3;
  84.          50: sin_data = 8'hCE;
  85.          51: sin_data = 8'hC9;
  86.          52: sin_data = 8'hC4;
  87.          53: sin_data = 8'hBE;
  88.          54: sin_data = 8'hB9;
  89.          55: sin_data = 8'hB3;
  90.          56: sin_data = 8'hAD;
  91.          57: sin_data = 8'hA7;
  92.          58: sin_data = 8'hA1;
  93.          59: sin_data = 8'h9B;
  94.          60: sin_data = 8'h95;
  95.          61: sin_data = 8'h8F;
  96.          62: sin_data = 8'h89;
  97.          63: sin_data = 8'h82;
  98.          64: sin_data = 8'h7D;
  99.          65: sin_data = 8'h77;
  100.          66: sin_data = 8'h70;
  101.          67: sin_data = 8'h6A;
  102.          68: sin_data = 8'h64;
  103.          69: sin_data = 8'h5E;
  104.          70: sin_data = 8'h58;
  105.          71: sin_data = 8'h52;
  106.          72: sin_data = 8'h4C;
  107.          73: sin_data = 8'h46;
  108.          74: sin_data = 8'h41;
  109.          75: sin_data = 8'h3C;
  110.          76: sin_data = 8'h36;
  111.          77: sin_data = 8'h31;
  112.          78: sin_data = 8'h2C;
  113.          79: sin_data = 8'h28;
  114.          80: sin_data = 8'h23;
  115.          81: sin_data = 8'h1F;
  116.          82: sin_data = 8'h1B;
  117.          83: sin_data = 8'h17;
  118.          84: sin_data = 8'h14;
  119.          85: sin_data = 8'h11;
  120.          86: sin_data = 8'hE ;
  121.          87: sin_data = 8'hB ;
  122.          88: sin_data = 8'h9 ;
  123.          89: sin_data = 8'h7 ;
  124.          90: sin_data = 8'h5 ;
  125.          91: sin_data = 8'h3 ;
  126.          92: sin_data = 8'h2 ;
  127.          93: sin_data = 8'h1 ;
  128.          94: sin_data = 8'h1 ;
  129.          95: sin_data = 8'h1 ;
  130.          96: sin_data = 8'h1 ;
  131.          97: sin_data = 8'h1 ;
  132.          98: sin_data = 8'h2 ;
  133.          99: sin_data = 8'h3 ;
  134.         100: sin_data = 8'h4 ;
  135.         101: sin_data = 8'h6 ;
  136.         102: sin_data = 8'h7 ;
  137.         103: sin_data = 8'hA ;
  138.         104: sin_data = 8'hC ;
  139.         105: sin_data = 8'hF ;
  140.         106: sin_data = 8'h12;
  141.         107: sin_data = 8'h15;
  142.         108: sin_data = 8'h19;
  143.         109: sin_data = 8'h1D;
  144.         110: sin_data = 8'h21;
  145.         111: sin_data = 8'h25;
  146.         112: sin_data = 8'h2A;
  147.         113: sin_data = 8'h2E;
  148.         114: sin_data = 8'h33;
  149.         115: sin_data = 8'h38;
  150.         116: sin_data = 8'h3E;
  151.         117: sin_data = 8'h43;
  152.         118: sin_data = 8'h49;
  153.         119: sin_data = 8'h4E;
  154.         120: sin_data = 8'h54;
  155.         121: sin_data = 8'h5A;
  156.         122: sin_data = 8'h60;
  157.         123: sin_data = 8'h67;
  158.         124: sin_data = 8'h6D;
  159.         125: sin_data = 8'h73;
  160.         126: sin_data = 8'h79;
  161.         127: sin_data = 8'h7F;
  162. endcase
  163. end
  164. always  @(posedge clk or negedge rst_n)begin
  165.     if(rst_n==1'b0)begin
  166. addr_tmp<= 0;
  167.     end
  168.     else if(key==0) begin
  169. addr_tmp<= addr_tmp + 262;
  170.     end
  171.     else if(key==1) begin
  172. addr_tmp<= addr_tmp + 524;
  173.     end
  174.     else if(key==2) begin
  175. addr_tmp<= addr_tmp + 786;
  176.     end
  177.     else if(key==3) begin
  178. addr_tmp<= addr_tmp + 1029;
  179.     end
  180.     else if(key==4) begin
  181. addr_tmp<= addr_tmp + 1311;
  182.     end
  183.     else if(key==5) begin
  184. addr_tmp<= addr_tmp + 1573;
  185.     end
  186.     else if(key==6) begin
  187. addr_tmp<= addr_tmp + 1835;
  188.     end
  189.     else begin
  190. addr_tmp<= addr_tmp + 2097;
  191.     end
  192. end
  193. assign addr = addr_tmp>>10 ;
  194. always  @(posedge clk or negedge rst_n)begin
  195.     if(rst_n==1'b0)begin
  196. dac_da<= 0;
  197.     end
  198.     else begin
  199. dac_da<= 255 - sin_data;
  200.     end
  201. end
  202. assign dac_sleep = 0        ;
  203. assign dac_wra   = dac_clka ;
  204. assign dac_clka  = ~clk      ;
  205. endmodule
复制代码


5.2 综合与上板

5.2.1 添加文件
打开软件“Quartus”,点击“File”菜单下的“New Project Wizard”,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 36931.png
3.15- 10 QUARTUS新建工程命令

点击“Next”。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 36967.png
3.15- 11 QUARTUS新建工程介绍界面

此时会出现的是工程文件夹、工程名、顶层模块名设置界面,设置目录为D:\mdy_book\ad_prj,工程名和顶层名为ad_prj,设置完成后点击Next”。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37078.png
3.15- 12 QUARTUS设置新工程路径和名称

选择“Empty project”后点击“Next”。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37136.png
3.15- 13 QUARTUS设置新工程类型

错误!未找到引用源。接着是添加文件界面。此处不选择任何文件,直接点击“Next”,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37250.png
3.15- 14 QUARTUS添加文件到工程界面

“Device family”选项中选择“Cyclone ⅣE”,“Available devices”选项下选择“EP4CE15F23C8”随后点击“Next”。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37362.png
3.15- 15 QUARTUS设置新工程的芯片型号

再次打开软件“Quartus”,在“Project”菜单中选择“Add/Remove File to Project”,随后弹出文件窗口。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37463.png
3.15- 16 添加文件命令界面

击右上角的 【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37490.png 按钮,在弹出来的窗口中双击选择D:\mdy_book\ad_prj目录下的“ad_prj.v”和“my_pll.qip”文件。点击“Add”添加成功后点击“OK”,关闭本窗口。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37580.png
3.15- 17 添加文件成功界面

5.2.2 综合

在菜单栏中选中Processing”,然后选择“Start Compilation”,开始对整个工程进行编译和综合。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37665.png
3.15- 18 编译命令界面

当出现下图的界面,则说明编译综合成功。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37704.png
3.15- 19 编译成功界面

5.2.3 配置管脚
配置管脚界面如下图所示,在菜单栏中选中“Assignments”,然后选择“Pin Planner”,随后会弹出配置管脚的窗口。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37793.png
3.15- 20 配置管脚命令界面

在配置窗口“location”配置管脚,配置完成关闭“Pin Planner”即可自动保存配置信息。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37865.png
3.15- 21 配置管脚界面

5.2.4 再次综合
再次打开“QUARTUS”软件,在菜单栏中选中“Processing”,然后选择“Start Compilation”,再次对整个工程进行编译和综合,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 37971.png
3.15- 23 编译命令界面

当出现3.2-19QUARTUS编译成功标志,则说明编译综合成功。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 38048.png
3.15- 24 编译成功界面

5.2.5 连接开发板
完成编译后开始进行上板调试操作,开发板连接方式如下图所示。将电源接上开发板USB BLASTER一端连接到JTAG插口,另一端连到PCUSB接口。将开发板上的AD接口和DA两个通道相连,连接完成后再将电源打开。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 38182.png

3.15- 25 教学板连接示意图

5.2.6 设置SIGNALTAP
编译通过后,点击“Tools”选项下的“SingaⅡLogic Analyzer”。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 38258.png
3.15-41设置signaltap界面

得到的原始“signaltap”界面如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 38327.png
3.15-42原始“signaltap”界面

点击Hardware”中的“Setup”选项,弹出“Hadware Setup”窗口。在“Currently selected hardware”选项下选择“USB-Blaster [USB0]”,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 38481.png
3.15-43Hadware Setup设置界面

点击SOF Manager”右边的三个点,随后会弹出文件选择窗口,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 38571.png
3.15-44弹出文件选择窗口

选择ad_prj.sof ”文件,点击Open”如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 38644.png
3.15-45选择文件界面

配置时钟界面如下图所示,点击Clock”选项后的三个点标志,“Filter”处选择下拉菜单中的“Design Entryall names”选项,点击“list”,在“Nodes Found”栏选择“clk”选项,点击两栏中间第一个右向箭头后可以看到“Selected Nodes”栏出现对应的“clk”,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 38845.png
3.15-46配置时钟界面

“Sample depth”选项下拉菜单中选择1K,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 38917.png
3.15-47采样设置

选择所有要抓取的信号,选择完毕后点击OK”。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 38977.png
3.15-48选择要抓取的信号

回到本界面再次进行编译
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 39030.png
3.15-49再次进行编译

点击SOF Manager”进行下载,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 39095.png
3.15-50下载界面

需要注意的是:点击 【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 39140.png 按键表示抓取一次点击 【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 39152.png 按键表示连续抓取

5.2.7 SIGNALTAP观察
为了方便查看波形,可以在Hierarchy Display”区域空白处右键,点击“Bus Display Format”选项中的“Unsigned Line Chart”,得到更加细节化的正弦波,如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 39282.png
3.15-51细节化观察波形

100KHz的正弦波如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 39338.png
3.15-52100KHz正弦波

300kHz的正弦波如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 39396.png
3.15-53 300KHz正弦波

500KHz的正弦波如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 39455.png
3.15-54 500KHz正弦波

800KHz的正弦波如下图所示。
【FPGA至简设计原理与应用】书籍连载23第三篇FPGA至简设计项目 第十五章 39514.png
3.15-55 800KHz正弦波

第6节 扩展练习
至此,整个AD采集设计已经分享完毕,在学会了整个设计之后可以展开更多思考,基于原理不变的情况下多做一些尝试,比如更改产生的正弦波周期后查看展示效果,这样可以帮助同学们更深刻的掌握本案例。也欢迎有更多思路和想法的同学前往至简设计法论坛上进行交流讨论。





0

主题

2

帖子

152

积分

注册会员

Rank: 2

积分
152
发表于 2021-3-12 11:29:50 | 显示全部楼层
图片这里笔误了吧
11.PNG

78

主题

106

帖子

5189

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5189
发表于 2021-3-27 22:46:49 | 显示全部楼层
AD采集案例问题汇总
【问题1】 ADC采集的数据一直很小,好像没采集到,如下图。
微信图片_20210327224249.png
答:提供如下几个思路,请逐个确认。
1. 确保本案例中的SMA线连接正确,特别注意要三个SMA头,要选正确的连接。
2. 查看SMA线,MP801板上的SMA是母头,所以SMA线上应该是公头。
3. 换条SMA线看看,看不是线出问题了。
4. MP801的DAC输出电压是比较低的,经过环回后,AD采集的值比较小,这是正常的,应该能看出正弦波出来,如果看不到就是有问题。
5. 使用信号发生器产生激励,单独测试AD。6. dac_mode要设置为1。(注意,原工程有错误,新工程已经补充了)
7. 以上问题还没解决,可反馈给老师。



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|MDYBBS ( 粤ICP备16061416号 )

GMT+8, 2024-11-25 22:10 , Processed in 0.179566 second(s), 32 queries .

Powered by Discuz! X3.4

本论坛由广州健飞通信有限公司所有

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表