veriog+任意波形发生器程序
- 格式:doc
- 大小:49.50 KB
- 文档页数:10
Verilog期末实验报告―波形发生器深圳大学实验报告课程名称: Verilog使用及其应用实验名称: 频率可变的任意波形发生器学院: 电子科学与技术学院专业:电子科学与技术班级: 2组号: 指导教师: 刘春平报告人: 陈昊学号: 2007160162 实验地点科技楼B115一、实验目的应用Verilog进行编写四种波形发生的程序,并结合DE2板与DVCC实验板上的D/A转换器在示波器显示出波形。
初步了解Verilog的编程及DE2板的应用,加强对其的实际应用操作能力。
二、实验原理实验程序分为三部分:第一、通过计数器实现内置信号分频,并通过外置开关调节频率来控制输出波形的频率。
第二、设定ROM中的数值,将波形数据存储到ROM中。
第三、设定波形选择开关。
总体设计方案及其原理说明:FPGA图 1-1 系统总体设计方案DDS是一种把数字信号通过数/模转换器转换成模拟信号的合成技术。
它由相位累加器、相幅转换函数表、D/A转换器以及内部时序控制产生器等电路组成。
参考频率f_clk为整个合成器的工作频率,输入的频率字保存在频率寄存器中,经,位相位累加器,累加一次,相位步进增加,经过内部ROM波形表得到相应的幅度值,经过D/A转换和低通滤波器得到合成的波形。
p为频率字,即相位增量;参考频率为,_clk;相位累加器的长度为,位,输出频率,_out为:f_out——输出信号的频率; N————相位累加器的位数;p———频率控制字(步长); f_clk——基准时钟频率。
图1-2 四种波形单周期的取样示意图段地址基地址 D7 D6 D5 D4 D3 D2 D1 D000 000 1000 001 1700 010 1500 011 1700 100 1000 101 300 110 500 111 301 000 301 001 301 010 301 011 301 100 101 101 101 110 101 111 110 000 010 001 510 010 1010 011 1510 100 2010 101 2510 110 3010 111 3511 000 3511 001 3011 010 2511 011 2011 100 1511 101 1011 110 511 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;initialbegini<=0;addr<=0;f_out<=0;endalways @(posedge f_clk) //利用计数器实现任意分频beginif(i==p) //设定频率控制字pbegini=0;f_out=~f_out;endelsei=i+1;endfunction [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 endfunctionalways@(posedge f_out)beginif(addr==8) //波形数据切换addr=0;elseaddr=addr+1;case(choose) //波形选择开关设定0: address=addr;1: address=addr+8;2: address=addr+16;3: address=addr+24;endcaseendassign data = romout(address);//将ROM中对应数据传递输出端口data输出endmodule四、实验截图1.正弦波示意图:(choose=0时的波形数值)2.方波示意图:(choose=1时的波形数值)3.正三角波示意图:(choose=2时的波形数值)4.反三角波示意图:(choose=3时的波形数值)五、实验总结通过这次期末实验,更进一步认识了Verilog语言的使用,详细了解了整个设计制作和仿真流程,独立思考并通过一步步的调试,逐步摸索和进一步优化程序最终完成实验,锻炼了逻辑思维能力。
深圳大学实验报告课程名称:Verilog使用及其应用实验名称:频率可变的任意波形发生器学院:电子科学与技术学院一、前言波形发生器是一种数据信号发生器,在调试硬件时,常常需要加入一些信号,以观察电路工作是否正常,在实验与工程中都具有重要的作用。
随着电子技术的发展与成熟,电子工程领域对波形发生器的要求越来越高,不仅要求波形发生器具有连续的相位变换,频率稳定等特点,还要求波形发生器可以模拟各种复杂信号,并能做到幅度、频率,相位,波形动态可调。
Verilog HDL是一种硬件描述语言(HDL:Hardware Discription Language),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
本实验正是基于Verilog HDL语言对波形发生器的功能进行描述,并进行仿真,从而了解与掌握波形发生器的内部工作原理,并进一步熟悉与掌握Verilog HDL语言,将课堂所学知识进行实践。
二、实验原理总体设计方案及其原理说明:FPGA图1-1 系统总体设计方案DDS是一种把数字信号通过数/模转换器转换成模拟信号的合成技术。
它由相位累加器、相幅转换函数表、D/A转换器以及内部时序控制产生器等电路组成。
参考频率f_clk为整个合成器的工作频率,输入的频率字保存在频率寄存器中,经N位相位累加器,累加一次,相位步进增加,经过内部ROM波形表得到相应的幅度值,经过D/A转换和低通滤波器得到合成的波形。
△P为频率字,即相位增量;参考频率为f_clk;相位累加器的长度为N位,输出频率f_out为:F_out——输出信号的频率;N————相位累加器的位数;△P———频率控制字(步长);F_clk——基准时钟频率。
图1-2 四种波形单周期的取样示意图段地址基地址 16位二进制数代表波形的取值00 000 000 001 7000 010 10000 011 7000 100 000 101 -7000 110 10000 111 -7001 000 10001 001 10001 010 10001 011 10001 100 -10001 101 -10001 110 -10001 111 -10010 000 010 001 2510 010 5010 011 7510 100 10010 101 12510 110 15010 111 17511 000 17511 001 15011 010 12511 011 10011 100 7511 101 5011 110 2511 111 0图1-3 函数查找表的设计三、源程序module dds(f_clk,p,choice,data);//模块的端口设定input [15:0] p; //频率控制字input[1:0] choice; //波形选择变量input f_clk; //输入时钟信号output [15:0] data; //波形数值输出wire [15:0] data;reg [5:0] addr,address; //波形数值所在地址reg [15:0] count;reg f_out; //经P变量频率控制调动后的时钟信号initialbegincount<=0;addr<=0;f_out<=0;function [15:0]rom; //ROM中各波形数值的设定input[5:0] address;case(address) //波形选择0 : rom = 0; //正弦波1 : rom = 70;2 : rom = 100;3 : rom = 70;4 : rom = 0;5 : rom = -70;6 : rom = -100;7 : rom = -70;8 : rom = 100; //方波9 : rom = 100;10: rom = 100;11: rom = 100;12: rom = -100;13: rom = -100;14: rom = -100;15: rom = -100;16 : rom = 0; //正三角波17 : rom = 25;18 : rom = 50;19 : rom = 75;20 : rom = 100;21 : rom = 125;22 : rom = 150;23 : rom = 175;24 : rom = 175; //负三角波25 : rom = 150;26 : rom = 125;27 : rom = 100;28 : rom = 75;29 : rom = 50;30 : rom = 25;31 : rom = 0;default : rom = 10'hxx;endcaseendfunctionalways @(posedge f_clk) //利用计数器count变量实现分频beginif(count==p) //设置频率控制字count=0;f_out=~f_out;endelsecount=count+1;endalways@(posedge f_out)beginif(addr==7) //波形取8个点,实现波形数据切换addr=0;elseaddr=addr+1;case(choice) //选择波形0: address=addr;1: address=addr+8;2: address=addr+16;3: address=addr+24;endcaseendassign data = rom(address);//将ROM中对应的数据传递到data端口输出endmodule四、仿真程序module test;wire [15:0] data;wire [5:0] address;reg [15:0] p;reg f_clk;reg [1:0] choice;always #10 f_clk = ~f_clk;initial //波形的初始化beginf_clk =0;p=2; //频率控制字为2时的波形choice=0;#1050 choice = 1;//延时,切换波形,使所有波形能够在同一个仿真结果#1500 choice = 2;#1500 choice = 3;#1000 p=5; //延时,更换频率#500 choice=0;#1050 choice = 1;#1500 choice = 2;#1500 choice = 3;#1000 p=15; //延时,更换频率#500 choice=0;#1050 choice = 1;#1500 choice = 2;#1500 choice = 3;enddds phase (.f_clk (f_clk),.p(p),.choice(choice),.data(data)); //调用dds模块endmodule五、实验结果。
河海大学计算机与信息学院(常州)课程设计报告题目简易直接数字频率合成器前端设计专业、学号电科**********授课班号275901学生姓名毛石磊指导教师单鸣雷完成时间2013-6-28课程设计(报告)任务书(理工科类)Ⅰ、课程设计(报告)题目:简易直接数字频率合成器(DDS)前端设计Ⅱ、课程设计(论文)工作内容一、课程设计目标1、培养综合运用知识和独立开展实践创新的能力以及同组之间合作的能力;2、学习直接数字频率合成器(DDS)相关知识,进行系统构架设计、模块划分和算法分析,并使用Verilog HDL设计一简易直接数字频率合成器,要求具有根据输入的控制字的不同输出不同频率的正弦信号的功能;3、能够对分析、测试、解决实际的数字电路问题加深理解,学以致用,增强动手能力,为今后能够独立进行设计工作打下一定的基础;二、研究方法及手段应用1、学习直接数字频率合成器(DDS)相关知识,确定电路需要实现的功能,分别编写各个功能模块,主要有相位累加器模块、正弦查询表模块和主模块;2、利用仿真软件测试各个模块功能的正确性;3、将各模块综合起来,实现整体功能并采用软件验证;三、课程设计预期效果1、完成实验环境搭建;2、完成DDS的功能设计与综合;3、完成modelsim软件仿真,确定程序代码正确性;4、在理论学习和具体实践中达到对DDS的正确理解。
学生姓名:毛石磊专业年级:电子科学与技术2010级摘要直接数字频率合成技术(Direct Digital Synthesize,DDS)是继直接频率合成技术和锁相式频率合成技术之后的第三代频率合成技术。
它采用全数字技术,并从相位角度出发进行频率合成。
目前,DDS的设计大多是应用HDL(Hardware Description Language)对其进行逻辑描述,整个设计可以很容易地实现参数改变和设计移植,给设计者带来很大的方便。
Verilog HDL就是其中一种标准化的硬件描述语言,它不仅可以进行功能描述,还可以对仿真测试矢量进行设计。
#include<reg52.h>#include<absacc.h>#define DAC0832 XBYTE[0x0fff] //DAC0832端口int pinlv=256; //改变频率的时延自变量sbit p20=P2^0;sbit p21=P2^1;sbit p22=P2^2;sbit p23=P2^3;sbit RS = P3^0;sbit RW= P3^1; //液晶显示的端口sbit E = P3^4;int j=0;unsigned char code TAB[ ]="0123456789msTIME:" ;unsigned char code TAB1[ ]="zhengxuanbofangbo sanjiaobo juchibo " ;unsigned char table[4];float code table2[]={ // 正弦波信号采点值0x80,0x83,0x85,0x88,0x8A,0x8D,0x8F,0x92,0x94,0x97,0x99,0x9B,0x9E,0xA0,0xA3,0xA5,0xA7,0xAA,0xAC,0xAE,0xB1,0xB3,0xB5,0xB7,0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,0xC9,0xCB,0xCC,0xCE,0xD0,0xD1,0xD3,0xD4,0xD6,0xD7,0xD8,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE3,0xE4,0xE4,0xE5,0xE5,0xE6,0xE6,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE6,0xE6,0xE5,0xE5,0xE4,0xE4,0xE3,0xE3,0xE2,0xE1,0xE0,0xDF,0xDE,0xDD,0xDC,0xDB,0xDA,0xD8,0xD7,0xD6,0xD4,0xD3,0xD1,0xD0,0xCE,0xCC,0xCB,0xC9,0xC7,0xC5,0xC3,0xC1,0xBF,0xBD,0xBB,0xB9,0xB7,0xB5,0xB3,0xB1,0xAE,0xAC,0xAA,0xA7,0xA5,0xA3,0xA0,0x9E,0x9B,0x99,0x97,0x94,0x92,0x8F,0x8D,0x8A,0x88,0x85,0x83,0x80,0x7D,0x7B,0x78,0x76,0x73,0x71,0x6E,0x6C,0x69,0x67,0x65,0x62,0x60,0x5D,0x5B,0x59,0x56,0x54,0x52,0x4F,0x4D,0x4B,0x49,0x47,0x45,0x43,0x41,0x3F,0x3D,0x3B,0x39,0x37,0x35,0x34,0x32,0x30,0x2F,0x2D,0x2C,0x2A,0x29,0x28,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1D,0x1C,0x1C,0x1B,0x1B,0x1A,0x1A,0x1A,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1A,0x1A,0x1A,0x1B,0x1B,0x1C,0x1C,0x1D,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29, 0x2A,0x2C,0x2D,0x2F,0x30,0x32,0x34,0x35, 0x37,0x39,0x3B,0x3D,0x3F,0x41,0x43,0x45, 0x47,0x49,0x4B,0x4D,0x4F,0x52,0x54,0x56, 0x59,0x5B,0x5D,0x60,0x62,0x65,0x67,0x69, 0x6C,0x6E,0x71,0x73,0x76,0x78,0x7B,0x7D};void delay(unsigned char ms);//延时函数void write_com(unsigned char com); //液晶写指令void write_data(unsigned char dat); // 液晶写数据void LCD1602_init(void) //液晶初始化{delay(15);write_com(0x38);delay(5);write_com(0x38);delay(5);write_com(0x38);write_com(0x38);write_com(0x08);write_com(0x01);write_com(0x06);write_com(0x0c);}void write_com(unsigned char com){E = 0; //复位初始为高电平RS = 0;RW = 0;P1 = com;delay(1);E = 1;delay(1);E = 0;}void write_data(unsigned char dat){E = 0; //复位初始为高电平RS = 1;RW = 0;P1 = dat;delay(1);E = 1;delay(1);E = 0;}void delay(unsigned char ms) // 晶振12MHz {unsigned char i;while(ms--){for(i=0;i<120;i++);}}void fang()//方波{DAC0832=0;delay(pinlv/2);DAC0832=0xff;delay(pinlv/2);}void jvchi()//锯齿波{unsigned char i;for(i=0;i<255;i++){DAC0832=i;delay(pinlv/256);}}void tran()//三角波{unsigned char i;for(i=0;i<255;i++){DAC0832=i;delay(pinlv/256);}for(i=255;i>0;i--){DAC0832=i;delay(pinlv/256);}}void sin()//正弦波{unsigned int i;for(i=0;i<256;i++){DAC0832=table2[i];delay(pinlv/256);}}void main(void)//主函数{IE=0x85; //外部中断设定改变频率TCON=0x05;LCD1602_init();table[0]=pinlv/1000; //计算周期作为输出table[1]=pinlv%1000/100;table[2]=pinlv%100/10;table[3]=pinlv%10;write_com(0x80+0x40); // 设置代写入数据的地址,写1602的第2行。
1 绪论波形发生器是一种常用的信号源,广泛应用于通信、雷达、测控、电子对抗以及现代化仪器仪表等领域,是一种为电子测量工作提供符合严格技术要求的电信号设备。
随着现代电子技术的飞速发展,现代电子测量工作对波形发生器的性能提出了更高的要求,不仅要求能产生正弦波、方波等标准波形,还能根据需要产生任意波形,且操作方便,输出波形质量好,输出频率范围宽,输出频率稳定度、准确度及分辨率高,频率转换速度快且频率转换时输出波形相位连续等。
可见,为适应现代电子技术的不断发展和市场需求,研究制作高性能的任意波形发生器十分有必要,而且意义重大。
1.1 波形发生器的发展及现状波形发生器的核心技术是频率合成技术,主要方法有:直接模拟频率合成、锁相环频率合成(PLL),直接数字合成技术(DDS)。
传统的波形发生器一般基于模拟技术。
它首先生成一定频率的正弦信号,然后再对这个正弦信号进行处理,从而输出其他波形信号。
早期的信号发生器大都采用谐振法,后来出现采用锁相环等频率合成技术的波形发生器。
但基于模拟技术的传统波形发生器能生成的信号类型比较有限,一般只能生成正弦波、方波、三角波等少数的规则波形信号。
随着待测设备的种类越来越丰富,测试用的激励信号也越来越复杂,传统波形发生器已经不能满足这些测试需要,任意波形发生器(AWG)就是在这种情况下,为满足众多领域对于复杂的、可由用户自定义波形的测试信号的日益增长的需要而诞生的。
随着微处理器性能的提高,出现了由微处理器、D/A以及相关硬件、软件构成的波形发生器。
它扩展了波形发生器的功能,产生的波形也比以往复杂。
实质上它采用了软件控制,利用微处理器控制D/A,就可以得到各种简单波形。
但由于微处理器的速度限制,这种方式的波形发生器输出频率较低。
目前的任意波形发生器普遍采用DDS(直接数字频率合成)技术。
基于DDS技术的任意波形发生器(AWG)利用高速存储器作为查找表,通过高速D/A转换器对存储器的波形进行合成。
深圳大学实验报告课程名称:Verilog数字系统设计教程实验工程名称:频率可变任意波形发生器的设计学院:电子科学与技术专业:微电子指导教师:刘春平报告人:潘志钟学号: 2007160051班级: 07级微电1班实验时间:2009-12-8 ~ 2010-1-11实验报告提交时间:2010-1-4教务处制(·····这里可加前言摘要之类的东西····自己想来写···)1设计原理DDS 是一种把数字信号通过数/模转换器转换成模拟信号的合成技术。
直接数字频率合成技术(DDS )是一种以采样定理为基础的全数字化频率合成波形的方法。
DDS 频率合成器主要由频率寄存器、相位寄存器(需要时可加入)、相位累加器、波形存储表(ROM ),DAC 转换器和模拟低通滤波器(LPF )等组成。
在系统时钟(SYSCLK )输入一定的情况下,频率寄存器中的频率控制字决定系统输出频率,而相位累加器的位数决定了系统频率分辨率。
总体设计方案及其原理说明:图 1-1 系统总体设计方案相位累加器由N 位加法器和N 位累加寄存器级联而成。
每当系统时钟SYSCLK 产生一个上升沿,N位加法器将频率寄存器中的频率控制字(FREQDAT A)与上一个系统时钟累加寄存器输出的累加相位数据相加,相加后的结果送累加寄存器。
这样在系统时钟的作用下,不断对频率控制字进行线性相位累加,相位累加器的溢出率就是DDS任意波形发生器的输出频率。
2设计与实现实际上DDS就是通过改变地址增量来达到控制输出频率的目的,而波形存储器(ROM)是以相位为地址,存有一个或多个按相位划分幅值的波形幅度信息。
参考频率f_clk为整个合成器的工作频率,输入的频率字保存在频率寄存器中,经N位相位累加器,累加一次,相位步进增加,经过内部ROM波形表得到相应的幅度值,经过D/A转换和低通滤波器得到合成的波形(数模转换在这里不作要求)。
基于fpga的任意波形发生器的设计与实现
一、设计概述
本设计的主要目的是利用FPGA(可编程逻辑器件)来实现一个任意波形发生器,可以产生任意的波形,用于模拟信号的测试和测量。
本设计利用FPGA的自定义功能,根据用户输入的参数,设计一个可以产生任意波形的发生器,并将其实现在一个硬件系统中。
二、系统架构
本系统的架构主要由以下几个部分组成:
(1)输入模块:用户输入的参数由输入模块接收,并将其转换为FPGA可识别的数据格式。
(2)FPGA模块:FPGA模块将用户输入的参数转换为可以产生任意波形的算法,并将其实现在FPGA的芯片上。
(3)输出模块:输出模块将FPGA模块产生的波形输出到外部设备,以便进行测试和测量。
三、设计实现
(1)输入模块:输入模块负责接收用户输入的参数,包括波形类型、频率、相位等,并将其转换为FPGA可识别的数据格式。
(2)FPGA模块:FPGA模块负责将用户输入的参数转换为可以产生任意波形的算法,并将其实现在FPGA的芯片上。
(3)输出模块:输出模块负责将FPGA模块产生的波形输出到外部设备,以便进行测试和测量。
module fen_10 (fclk,clk,reset); //10分频模块output fclk;input clk;input reset;reg[2:0] fout;reg fclk; //用always语句,输出为reg型;always @ (posedge clk or posedge reset ) //异步复位;beginif(reset)beginfout<=3'b0;fclk<=0; //实现清零输出;endelse if(fout==3'b100)beginfout<=3'b0;fclk<=!fclk;// 复位信号为零时,计数值每从0-4,则让新时钟跳变一次,这样原时钟的10个周期内就只有一个新的上升沿;endelsefout<=fout+1;endendmodulemodule add_ram (dout,fclk,data,rb); //波形存储器模块output[7:0] dout;input fclk;input[2:0] data;input rb;wire fclk,rb;wire[7:0] dout;reg[10:0] din;assign dout[7:0]=din[10:3];// 取新地址的前八位;always @ (posedge fclk or posedge rb)// 用新的时钟信号作为累加模块的时钟信号;beginif(rb)din<=11'b0; //实现清零输出;elsedin[10:0]<=din[10:0]+ data[2:0];// 当上升沿带到来时,让原11位地址在地址加法器内与一个输入变量data进行一次相加,得到新的11位地址;endendmodulemodule sin(rout,dout,en,fclk); //正弦波形输出模块input[7:0] dout;input en,fclk;output[7:0] rout;wire[7:0] dout;wire en,fclk;reg[7:0] rout;always @(posedge fclk or posedge en)beginif(en)rout<=8'h00;elsebegincase(dout) //在正弦波形输出表中查找相应的值进行输出; 8'h0:rout=8'h7f;8'h1:rout=8'h82;8'h2:rout=8'h85;8'h3:rout=8'h88;8'h4:rout=8'h8b;8'h5:rout=8'h8e;8'h6:rout=8'h91;8'h7:rout=8'h94;8'h8:rout=8'h97;8'h9:rout=8'h9a;8'ha:rout=8'h9d;8'hb:rout=8'ha0;8'hc:rout=8'ha3;8'hd:rout=8'ha6;8'he:rout=8'ha9;8'hf:rout=8'hac;8'h10:rout=8'haf;8'h11:rout=8'hb2;8'h12:rout=8'hb5;8'h13:rout=8'hb8;8'h14:rout=8'hba;8'h15:rout=8'hbd;8'h16:rout=8'hc0;8'h17:rout=8'hc2;8'h18:rout=8'hc5;8'h19:rout=8'hc8;8'h1a:rout=8'hca;8'h1b:rout=8'hcd;8'h1c:rout=8'hcf;8'h1d:rout=8'hd1;8'h1f:rout=8'hd6; 8'h20:rout=8'hd8; 8'h21:rout=8'hda; 8'h22:rout=8'hdd; 8'h23:rout=8'hdf; 8'h24:rout=8'he1; 8'h25:rout=8'he3; 8'h26:rout=8'he4; 8'h27:rout=8'he6; 8'h28:rout=8'he8; 8'h29:rout=8'hea; 8'h2a:rout=8'heb; 8'h2b:rout=8'hed; 8'h2c:rout=8'hee; 8'h2d:rout=8'hf0; 8'h2e:rout=8'hf1; 8'h2f:rout=8'hf3; 8'h30:rout=8'hf4; 8'h31:rout=8'hf5; 8'h32:rout=8'hf6; 8'h33:rout=8'hf7; 8'h34:rout=8'hf8; 8'h35:rout=8'hf9; 8'h36:rout=8'hfa; 8'h37:rout=8'hfa; 8'h38:rout=8'hfb; 8'h39:rout=8'hfc; 8'h3a:rout=8'hfc; 8'h3b:rout=8'hfd; 8'h3c:rout=8'hfd; 8'h3d:rout=8'hfd; 8'h3e:rout=8'hfd; 8'h3f:rout=8'hfd; 8'h40:rout=8'hfd; 8'h41:rout=8'hfd; 8'h42:rout=8'hfd; 8'h43:rout=8'hfd; 8'h44:rout=8'hfd; 8'h45:rout=8'hfd; 8'h46:rout=8'hfc; 8'h47:rout=8'hfc; 8'h48:rout=8'hfb; 8'h49:rout=8'hfa;8'h4b:rout=8'hf9; 8'h4c:rout=8'hf8; 8'h4d:rout=8'hf7; 8'h4e:rout=8'hf6; 8'h4f:rout=8'hf5; 8'h50:rout=8'hf4; 8'h51:rout=8'hf3; 8'h52:rout=8'hf1; 8'h53:rout=8'hf0; 8'h54:rout=8'hef; 8'h55:rout=8'hed; 8'h56:rout=8'hec; 8'h57:rout=8'hea; 8'h58:rout=8'he8; 8'h59:rout=8'he6; 8'h5a:rout=8'he5; 8'h5b:rout=8'he3; 8'h5c:rout=8'he1; 8'h5d:rout=8'hdf; 8'h5e:rout=8'hdd; 8'h5f:rout=8'hdb; 8'h60:rout=8'hd8; 8'h61:rout=8'hd6; 8'h62:rout=8'hd4; 8'h63:rout=8'hd2; 8'h64:rout=8'hcf; 8'h65:rout=8'hcd; 8'h66:rout=8'hca; 8'h67:rout=8'hc8; 8'h68:rout=8'hc5; 8'h69:rout=8'hc3; 8'h6a:rout=8'hc0; 8'h6b:rout=8'hbd; 8'h6c:rout=8'hbb; 8'h6d:rout=8'hb8; 8'h6e:rout=8'hb5; 8'h6f:rout=8'hb2; 8'h70:rout=8'haf; 8'h71:rout=8'hac; 8'h72:rout=8'ha9; 8'h73:rout=8'ha7; 8'h74:rout=8'ha4; 8'h75:rout=8'ha1;8'h77:rout=8'h9b; 8'h78:rout=8'h97; 8'h79:rout=8'h94; 8'h7a:rout=8'h91; 8'h7b:rout=8'h8e; 8'h7c:rout=8'h8b; 8'h7d:rout=8'h88; 8'h7e:rout=8'h85; 8'h7f:rout=8'h82; 8'h80:rout=8'h7f; 8'h81:rout=8'h7c; 8'h82:rout=8'h78; 8'h83:rout=8'h75; 8'h84:rout=8'h72; 8'h85:rout=8'h6f; 8'h86:rout=8'h6c; 8'h87:rout=8'h69; 8'h88:rout=8'h66; 8'h89:rout=8'h63; 8'h8a:rout=8'h60; 8'h8b:rout=8'h5d; 8'h8c:rout=8'h5a; 8'h8d:rout=8'h57; 8'h8e:rout=8'h54; 8'h8f:rout=8'h51; 8'h90:rout=8'h4e; 8'h91:rout=8'h4b; 8'h92:rout=8'h48; 8'h93:rout=8'h46; 8'h94:rout=8'h43; 8'h95:rout=8'h40; 8'h96:rout=8'h3d; 8'h97:rout=8'h3b; 8'h98:rout=8'h38; 8'h99:rout=8'h36; 8'h9a:rout=8'h33; 8'h9b:rout=8'h31; 8'h9c:rout=8'h2e; 8'h9d:rout=8'h2c; 8'h9e:rout=8'h29; 8'h9f:rout=8'h27; 8'ha0:rout=8'h25; 8'ha1:rout=8'h23;8'ha3:rout=8'h1f; 8'ha4:rout=8'h1c; 8'ha5:rout=8'h1b; 8'ha6:rout=8'h19; 8'ha7:rout=8'h17; 8'ha8:rout=8'h15; 8'ha9:rout=8'h13; 8'haa:rout=8'h12; 8'hab:rout=8'h10; 8'hac:rout=8'hf; 8'had:rout=8'hd; 8'hae:rout=8'hc; 8'haf:rout=8'hb; 8'hb0:rout=8'h9; 8'hb1:rout=8'h8; 8'hb2:rout=8'h7; 8'hb3:rout=8'h6; 8'hb4:rout=8'h5; 8'hb5:rout=8'h4; 8'hb6:rout=8'h3; 8'hb7:rout=8'h3; 8'hb8:rout=8'h2; 8'hb9:rout=8'h1; 8'hba:rout=8'h1; 8'hbb:rout=8'h0; 8'hbc:rout=8'h0; 8'hbd:rout=8'h0; 8'hbe:rout=8'h0; 8'hbf:rout=8'h0; 8'hc0:rout=8'h0; 8'hc1:rout=8'h0; 8'hc2:rout=8'h0; 8'hc3:rout=8'h0; 8'hc4:rout=8'h0; 8'hc5:rout=8'h0; 8'hc6:rout=8'h1; 8'hc7:rout=8'h1; 8'hc8:rout=8'h2; 8'hc9:rout=8'h3; 8'hca:rout=8'h3; 8'hcb:rout=8'h4; 8'hcc:rout=8'h5; 8'hcd:rout=8'h6;8'hcf:rout=8'h8; 8'hd0:rout=8'h9; 8'hd1:rout=8'ha; 8'hd2:rout=8'hc; 8'hd3:rout=8'hd; 8'hd4:rout=8'he; 8'hd5:rout=8'h10; 8'hd6:rout=8'h11; 8'hd7:rout=8'h13; 8'hd8:rout=8'h15; 8'hd9:rout=8'h16; 8'hda:rout=8'h18; 8'hdb:rout=8'h1a; 8'hdc:rout=8'h1c; 8'hdd:rout=8'h1e; 8'hde:rout=8'h20; 8'hdf:rout=8'h22; 8'he0:rout=8'h24; 8'he1:rout=8'h27; 8'he2:rout=8'h29; 8'he3:rout=8'h2b; 8'he4:rout=8'h2e; 8'he5:rout=8'h30; 8'he6:rout=8'h33; 8'he7:rout=8'h35; 8'he8:rout=8'h38; 8'he9:rout=8'h3a; 8'hea:rout=8'h3d; 8'heb:rout=8'h40; 8'hec:rout=8'h42; 8'hed:rout=8'h45; 8'hee:rout=8'h48; 8'hef:rout=8'h4b; 8'hf0:rout=8'h4e; 8'hf1:rout=8'h50; 8'hf2:rout=8'h53; 8'hf3:rout=8'h56; 8'hf4:rout=8'h59; 8'hf5:rout=8'h5c; 8'hf6:rout=8'h5f; 8'hf7:rout=8'h62; 8'hf8:rout=8'h65; 8'hf9:rout=8'h68;8'hfb:rout=8'h6f;8'hfc:rout=8'h72;8'hfd:rout=8'h75;8'hfe:rout=8'h78;default:rout=8'hxx;endcase//波形存储器可使用器件内部的存储器模块来定义,也可以自己计算各点的值来给出; endendendmodulemodule square(fclk,en,address,qsqu); //方波波形输出模块input fclk,en;input[7:0] address;output[7:0] qsqu;reg[7:0] qsqu;wire fclk,en;wire[7:0] address;always @(posedge fclk or posedge en)beginif(en)qsqu <= 8'h00;elsebeginif(address[4]=='b0)qsqu[7:0]<= 8'h00;elseqsqu<= 8'hFF;endendendmodulemodule triangle(fclk,en,address,qtri); //三角波形输出模块input fclk, en;input [7:0] address;output [7:0] qtri;reg [7:0] qtri;reg [7:0] temp;always @ (posedge fclk or posedge en)beginif(en)qtri = 8'h00;elsebeginif(address <= 8'h8F)qtri<= address;//?address????elsebegintemp =~^address;qtri<=temp;//?address????????endendendendmodulemodule waveselect(waveo,rel,fclk,rout,qsqu,qtri); //波形选择输出模块input fclk;input[7:0] rout,qsqu,qtri;input[1:0] rel;output[7:0] waveo;wire fclk;wire[7:0] rout,qsqu,qtri;wire[1:0] rel;reg[7:0] waveo;always @(posedge fclk)case(rel)2'b00:waveo<=rout;2'b01:waveo<=qsqu;2'b10:waveo<=qtri;2'b11:waveo<=8'h00;default:waveo<=8'hxx;endcaseendmodulemodule dds1(clk,fclk,reset,rb,en,rel,data,dout,rout,qsqu,qtri,waveo); //顶层模块input clk,reset,rb,en;input[1:0] rel;input[2:0] data;output[7:0] dout,rout,qsqu,qtri,waveo;output fclk;wire reset,fclk,rb,en;wire[7:0] waveo,dout,rout,qsqu,qtri;wire[2:0] data;wire[1:0] rel;fen_10 f(.fclk(fclk),.clk(clk),.reset(reset));add_ram a(.dout(dout),.fclk(fclk),.data(data),.rb(rb)); //对分频和累加、存储波形输出模块进行调用;waveselect ws(.waveo(waveo),.rel(rel),.fclk(fclk),.rout(rout),.qsqu(qsqu),.qtri(qtri));square sq(.fclk(fclk),.en(en),.address(dout),.qsqu(qsqu)); sin s(.rout(rout),.dout(dout),.en(en),.fclk(fclk)); triangle t(.fclk(fclk),.en(en),.address(dout),.qtri(qtri)); endmodule。