1绪论
1.1 背景
信号发生器作为一种历史悠久的测量仪器,早在20年代电子设备刚出现时就产生了。随着通信和雷达技术的发展,40年代出现了主要用于测试各种接收机的标准信号发生器,使得信号发生器从定性分析的测试仪器发展成定量分析的测量仪器。同时还出现了可用来测量脉冲电路或用作脉冲调制器的脉冲信号发生器。
1.2 FPGA简介
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,但是功耗较低。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。
1.3 Quartus II简介
Quartus II design 是最高级和复杂的,用于system-on-a-programmable-chip (SOPC)的设计环境。 Quartus II design 提供完善的 timing closure 和 LogicLock™ 基于块的设计流程。Quartus II design是唯一一个包括以timing closure 和 基于块的设计流为基本特征的programmable logic device (PLD)的软件。 Quartus II 设计软件改进了性能、提升了功能性、解决了潜在的设计延迟等,在工业领域率先提供FPGA与mask-programmed devices开发的统一工作流程。
Altera的Quartus II可编程逻辑软件属于第四代PLD开发平台。该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。Quartus平台与Cadence、ExemplarLogic、 MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。改进了软件的LogicLock模块设计功能,增添 了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。
Verilog HDL在Quartus II 中的使用流程如图1-1所示:
图1-1 应用流程图
1.4 Modelsim简介
Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。
2系统设计方案
2.1系统总体设计
本系统以FPGA芯片为中心,外加辅助电路,选取 DDS技术。该系统由FPGA 主控电路,D/A转换电路,调节按键和低通滤波电路,Guagle Wave—任意波形发生器,设置我们需要的波形,依次保存为mif文件,在与波形ROM关联起来,然后经相位累加器输出的地址信息不断寻址从波形ROM输出波形数据从mif文件读取的是离散的波形数据,还得经由数模转换器将离散的序列转换成连续的模拟量,再使用低通滤波器过滤谐波,输出平滑的函数波形。课题要求是需要输出四类波形,由此需要使用四块ROM储存器,依次放入四种波形的波形幅度量化数据,然后使用一个四选一的波形选择器,波形选择模块控制输出波形形状。
图2-1系统总体设计图
图2-2 系统总体RTL视图
2.2按键控制模块
由于开发板使用的按键开关为机械弹性开关,当机械触点断开、闭合时, 由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会立刻断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而做 的措施就是按键消抖。由于按键个数较多,常用软件方法去抖,即检测出按键闭合后执行一个延时程序,根 据抖动的时间为 5ms~10ms,我们产生一个 20ms 的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。
2.3 DDS模块
为了使DDS简易信号发生器实现正弦波、方波、三角波和锯齿波 4 种波形的 输出,需要事先在波形数据表 ROM 中存入 4 种波形信号各自的完整周期波形数据。ROM 作为只读存储器,在进行 IP 核设置时需要指定初始化文件,我们将波形数据作为初始化文 件写入其中,文件格式为 MIF 文件。 使用 MatLab 绘制 4 种信号波形,对波形进行等间隔采样,以采样次数作为 ROM 存储 地址,将采集的波形幅值数据做为存储数据写入存储地址对应的存储空间。在本次实验中 我们对 4 种信号波形进行分别采样,采样次数为 2 12 = 4096 次,采集的波形幅值数据位宽 为 8bit,将采集数据保存为 MIF 文件。
2.4数模转换模块
由系统设计图可知,要让信号发生器系统输出波形,还需要使用DA转换模块,这里我选择和板卡相配套的外载ADDA模块,外载 AD/DA 板卡的 DA 部分使用高速 DA 芯片 AD9708,AD9708 由 ANALOG 公司生 产,属于 TxDAC™系列高性能、低功耗 CMOS 数模转换器(DAC)的 8 位分辨率产品。
AD9708 提供出色的交流和直流性能,同时支持最高 125 MSPS 的更新速率。具有灵活 的单电源工作电压范围(2.7 V 至 5.5 V)和低功耗特性,非常适合便携式和低功耗应用。 通过降低满量程电流输出,可以将功耗进一步降至 45 mW,而性能不会明显下降,
图2.3 外载ADDA模块
3各模块方案验证
顶层模块包括 4 部分,D/A 转换器交由外部挂载 的高速 AD/DA 板卡处理,其他 3 部分,相位累加器、相位调制器、波形数据表 ROM 由 FPGA 负责。所以我们要建立一个单独的模块对 DDS 部分进行处理;实验目标还提到要使用按键实现 4 种波形的切换,按键消抖模块必不可少;同时也要声明一个按键控制模块对4 个输入按键进行控制。
3.1顶层模块
时钟、复位和代表波形选择的 4 个按键信号通过顶层传入按键控制模块(key_control),
按键控制模块内部实例化 4 个按键消抖模块,对输入的 4 路按键信号分别进行消抖处理; 消抖处理后的 4 路按键信号组成波形选择信号输入 dds 模块(dds), dds 模块中实例化一个ROM IP核,按顺序存入了一个完整周期的正弦波、方波、三角波、锯齿波的信号波形,根据输入波形选择信号对 rom 中对应信号波形进行读取,将读出波形的幅度数字值输出,传入外部挂载的高速 AD/DA 板卡的 DA 端,板卡根据输入的数字信号生成对应波形的模拟信号。其中,输出信号的频率和相位的调节可在 dds 模块中通过修改参数实现。
图3-1 系统总体RTL视图
3.2 数据选择模块
本实验设计的 DDS 信号发生器,可以实现 4 种信号波形的输出,使用外部物理按键实现波形的切换,一个按键控制一种波形,共使用 4 个按键。外部物理按键的触发信号通过顶层模块输入按键控制模块,按键控制模块内部实例化 4 个按键消抖消抖模块,分别对4路按键信号做消抖处理。消抖处理后的 4 路按键信号组成位宽为 4bit 的波形选择信号并输出至 DDS 模块。波形选择信号初值为 4’b0000,当某一按键按下,波形选择信号对应位电平拉高。
图3-2 数据选择模块RTL视图
3.3 DDS模块
我们设计的 DDS 简易信号发生器想要实现正弦波、方波、三角波和锯齿波 4 种波形的 输出,需要事先在波形数据表 ROM 中存入 4 种波形信号各自的完整周期波形数据。ROM 作为只读存储器,在进行 IP 核设置时需要指定初始化文件,我们将波形数据作为初始化文件写入其中,文件格式为 MIF 文件。
图3-3 DDS模块RTL视图
4系统仿真测试
4.1按键消抖仿真
按键的抖动会产生抖动,抖动的时间是小于 10ms 的,而当有20ms 的时间内都没有抖动就说明按键已经处于稳定状态了。仿真代码如下:
`timescale 1ns/1ns
module tb_key_control();
parameter CNT_1MS = 20’d19 ,
CNT_11MS = 21’d69 ,
CNT_41MS = 22’d149 ,
CNT_51MS = 22’d199 ,
CNT_60MS = 22’d249 ;
wire [3:0] wave_select ;
//reg define
reg sys_clk ;
reg sys_rst_n ;
reg [21:0] tb_cnt ;
reg key_in ;
reg [1:0] cnt_key ;
reg [3:0] key ;
//defparam define
defparam key_control_inst.CNT_MAX = 24;
//sys_rst_n,sys_clk,key
initial
begin
sys_rst_n = 1’b0;
sys_clk = 1’b0;
key = 4’b0000;
#200;
sys_rst_n = 1’b1;
end
always #10 sys_clk = ~sys_clk;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
tb_cnt <= 22’b0;
else if(tb_cnt == CNT_60MS)
tb_cnt <= 22’b0;
else
tb_cnt <= tb_cnt + 1’b1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
key_in <= 1’b1;
else if((tb_cnt >= CNT_1MS && tb_cnt <= CNT_11MS)
|| (tb_cnt >= CNT_41MS && tb_cnt <= CNT_51MS))
key_in <= {$random} % 2;
else if(tb_cnt >= CNT_11MS && tb_cnt <= CNT_41MS)
key_in <= 1’b0;
else
key_in <= 1’b1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
cnt_key <= 2’d0;
else if(tb_cnt == CNT_60MS)
cnt_key <= cnt_key + 1’b1;
else
cnt_key <= cnt_key;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
key <= 4’b1111;
else
case(cnt_key)
0: key <= {3’b111,key_in};
1: key <= {2’b11,key_in,1’b1};
2: key <= {1’b1,key_in,2’b11};
3: key <= {key_in,3’b111};
default:key <= 4’b1111;
endcase
key_control key_control_inst
(.sys_clk (sys_clk), //系统时钟,50MHz
.sys_rst_n (sys_rst_n ), //复位信号,低电平有效
.key (key), //输入4位按键
.wave_select (wave_select) //输出波形选择
);
endmodule
图4-1 按键消抖模块仿真波形图
4.2系统总体仿真
整个系统是在前几个个模块的基础上实现的,对于整个系统来说,输入端口为初始时钟激励信号sys_clk、控制复位信号sys_rst_n,数据选择按键key,输出有DAC模块时钟dac_data 和DAC模块波形数据dac_data 。下面代码中延时后改变key信号的值来模拟按键的按下,达到切换波形的效果。仿真结果如图4.2所示。仿真代码如下:
`timescale 1ns/1ns
module tb_top_dds();
parameter CNT_1MS = 20’d19000 ,
CNT_11MS = 21’d69000 ,
CNT_41MS = 22’d149000 ,
CNT_51MS = 22’d199000 ,
CNT_60MS = 22’d249000 ;
wire dac_clk ;
wire [7:0] dac_data ;
reg sys_clk ;
reg sys_rst_n ;
reg [21:0] tb_cnt ;
reg key_in ;
reg [1:0] cnt_key ;
reg [3:0] key ;
defparam top_dds_inst.key_control_inst.CNT_MAX = 24;
initial
begin
sys_clk = 1’b0;
sys_rst_n <= 1’b0;
key <= 4’b0000;
#200;
sys_rst_n <= 1’b1;
end
always #10 sys_clk = ~sys_clk;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
tb_cnt <= 22’b0;
else if(tb_cnt == CNT_60MS)
tb_cnt <= 22’b0;
else
tb_cnt <= tb_cnt + 1’b1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
key_in <= 1’b1;
else if((tb_cnt >= CNT_1MS && tb_cnt <= CNT_11MS)
|| (tb_cnt >= CNT_41MS && tb_cnt <= CNT_51MS))
key_in <= {$random} % 2;
else if(tb_cnt >= CNT_11MS && tb_cnt <= CNT_41MS)
key_in <= 1’b0;
else
key_in <= 1’b1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
cnt_key <= 2’d0;
else if(tb_cnt == CNT_60MS)
cnt_key <= cnt_key + 1’b1;
else
cnt_key <= cnt_key;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
key <= 4’b1111;
else
case(cnt_key)
0: key <= {3’b111,key_in};
1: key <= {2’b11,key_in,1’b1};
2: key <= {1’b1,key_in,2’b11};
3: key <= {key_in,3’b111};
default:key <= 4’b1111;
endcase
top_dds top_dds_inst
(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.key (key ),
.dac_clk (dac_clk ),
.dac_data (dac_data )
);
endmodule
图4-2 系统整体仿真波形图
本次的仿真结果使用 ModelSim 软件对顶层模块进行仿真,由图可知,输入与输出信号额能正常传入 传出顶层模块,并按照要求输出信号。
5、程序下载与实物演示
5.1分频模块综合图
图5.1 分频模块综合图
5.2引脚分配
本次课程设计所用的fpga开发板引脚图如图4-1所示:
图5-2 fpga开发板引脚图
5.3实物测试
将以sof为后缀的文件下载到开发板中,Quartus II的程序下载界面如图4-3所示:
图5-3 程序下载界面
实物效果图如图4-4所示:
5-4 实物图
将外载DA模块和板卡组合,用信号线连接DA模块和示波器,上电后,按下按键,在示波器上显示对应的波形。
6、结论
通过上述仿真结果可以得出,基本上满足题目要求的输出四种波形,并能够改变输出波形的频率以及幅度功能。也侧面说明仅使用八位的相位累加器能够满足课题的条件,本系统采用的波形数据为8*255的数据,四片ROM依次放入四种波形的数据。当然,通过改变波形ROM的波形数据,我们可以设计出输出任意波形的信号发生器,相位累加器也可以进行改进,比如用24位的累加器,增加波形的采样点数,那么输出波形的失真度将会大大降低。
任何事情都不能一蹴而就的,毕业设计也是。在设计信号发生器的这段时间遇到了很多难题。首先就是对仿真软件的陌生;选择系统方案是的纠结,起初是想是代码实现波形的输出,三角波、方波等都是线性函数,我们可以编写函数,在时钟的作用下累加,频率控制字改变时钟频率,进而改变输出波形的频率;设置一个最大值,幅度控制字改变最大值,累加值大于最大值就重新开始,但是最后由于正弦波信号时非线性的,而且使用这个函数法会造成比较大的波形失真,选择放弃。第三就是仿真遇到的问题,在顶层模块波形仿真时,对各个输入端已经设置好了对应的输入,但是仿真结果是没有输出,复查了每个模块,没有找到原因。经过不断的尝试后,把波形仿真的input 设置为功能仿真,并创建功能网表,才输出正确的结果。最后在锁定引脚,下载程序后,使用逻辑解析仪显示设计的输出波形,但是并没有接触过signalTapII,在硬件测试过程中产生了种种问题。不得已去论坛找资料自学,终究使signalTapI显示出正弦波、三角波、方波和锯齿波。达到了预先的目标,证明了系统的准确性。
在本次设计中也让我感受到了硬件描述语言覆盖面广、描述能力强以及使用方便、便于修改的特点,本设计也具有一定的实用价值。因为主要做的是软件仿真,在具体硬件实现过程中由于器件本身存在的误差,影响了波形采样,致使最后输出的波形略有失真,也侧面反映了软件和硬件必须要有良好的结合。
怎么csdn贴一张图片这么麻烦啊!!!!!!!!!!!!!
代码就不放了,完全适用野火fpga征途开发板25_DDS
传送门:https://doc.embedfire.com/products/link/zh/latest/index.html