基于Verilog-HDL的信号发生器的设计

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于Verilog HDL的信号发生器的设计

一、实验目的

应用Verilog进行编写四种波形发生的程序,并结合DE2板与DVCC实验板上的D/A转换器在示波器显示出波形。初步了解Verilog的编程及DE2板的应用,加强对其的实际应用操作能力。

二、实验原理

实验程序分为三部分:

第一、通过计数器实现内置信号分频,并通过外置开关调节频率来控制输出波形的频率。第二、设定ROM中的数值,将波形数据存储到ROM中。

第三、设定波形选择开关。

图 1-1 系统总体设计方案

DDS是一种把数字信号通过数/模转换器转换成模拟信号的合成技术。它由相位累加器、相幅转换函数表、D/A转换器以及内部时序控制产生器等电路组成。

参考频率f_clk为整个合成器的工作频率,输入的频率字保存在频率寄存器中,经N位相位累加器,累加一次,相位步进增加,经过内部ROM波形表得到相应的幅度值,经过D/A转换和低通滤波器得到合成的波形。p为频率字,即相位增量;参考频率为f_clk;相位累加器的长度为N位,输出频率f_out为:

f_out——输出信号的频率; N————相位累加器的位数;

p———频率控制字(步长); f_clk——基准时钟频率。

FPGA

图1-2 四种波形单周期的取样示意图段地址基地址 D7 D6 D5 D4 D3 D2 D1 D0

00 000 10

00 001 17

00 010 15

00 011 17

00 100 10

00 101 3

00 110 5

00 111 3

01 000 3

01 001 3

01 010 3

01 011 3

01 100 1

01 101 1

01 110 1

01 111 1

10 000 0

10 001 5

10 010 10

10 011 15

10 100 20

10 101 25

10 110 30

10 111 35

11 010 25

11 011 20

11 100 15

11 101 10

11 110 5

11 111 0

图1-3 函数查找表的设计

三、实验内容

程序编码:

module dds(f_clk,p,choose,data);//端口设定

input [5:0] p; //频率控制字

input[1:0] choose; //波形选择

input f_clk; //内置晶振

output [7:0] data;

wire [7:0]data;

reg [5:0] addr,address;

reg [5:0] i;

reg f_out;

initial

begin

i<=0;

addr<=0;

f_out<=0;

end

always @(posedge f_clk) //利用计数器实现任意分频begin

if(i==p) //设定频率控制字p

begin

i=0;

f_out=~f_out;

end

else

i=i+1;

end

function [7:0] romout; //ROM的设定

input[5:0] address;

case(address) //各波形初值的预装入

0 : romout = 10; //正弦波初值

1 : romout = 17;

2 : romout = 15;

3 : romout = 17;

4 : romout = 10;

5 : romout = 3;

6 : romout = 5;

7 : romout = 3;

8 : romout = 3; //方波初值

9 : romout = 3;

10: romout = 3;

11: romout = 3;

12: romout = 1;

13: romout = 1;

14: romout = 1;

15: romout = 1;

16 : romout = 0; //正三角波初值

17 : romout = 5;

18 : romout = 10;

19 : romout = 15;

20 : romout = 20;

21 : romout = 25;

22 : romout = 30;

23 : romout = 35;

24 : romout = 35; //反三角波初值

25 : romout = 30;

26 : romout = 25;

27 : romout = 20;

28 : romout = 15;

29 : romout = 10;

30 : romout = 5;

31 : romout = 0;

default : romout = 10'hxx;

endcase

endfunction

always@(posedge f_out)

begin

if(addr==8) //波形数据切换

addr=0;

else

addr=addr+1;

case(choose) //波形选择开关设定 0: address=addr;

1: address=addr+8;

2: address=addr+16;

3: address=addr+24;

相关文档
最新文档