当前位置:文档之家› 数字电路课程设计实验报告1

数字电路课程设计实验报告1

序言在测试、研究或调整电子电路及设备时,为测定电路的一些点参量,如测量频率响应、噪声系数,为电压表定度等,都要求提供符合所需技术要求的电信号,以模拟在实际工作中使用的待测设备的激励信号。

信号发生器即由此而来,作为电子设计中常用仪器仪表,信号发生器又称信号源,可以用来产生被测电路所需特定参数的电测试信号。

根据输出波形的不同,信号源可以分为正弦波信号发生器、矩形脉冲信号发生器、函数信号发生器和随机信号发生器等四大类。

例如当要求进行系统的稳定性测量时,需使用振幅、波形、幅值等能在一定范围内进行精确调整,有很好的稳定性,有输出指示。

基于信号发生器的广泛使用,对信号发生器设计的研究就显得非常有意义。

本课题是利用VHDL语言来实现计费功能的,VHDL具有与具体硬件电路无关和与设计平台无关的特性,并且具有良好的电路行为描述和系统描述的能力,并在语言易读性和层次化、结构化设计方面,表现了强大的生命力和应用潜力,因此选用VHDL语言进行编程。

本次课程设计巩固和运用了所学课程,通过理论联系实际,提高了分析、解决计算机技术实际问题的独立工作能力,通过对一个函数信号发生器的设计,进一步加深了对计算机原理以及数字电路应用技术方面的了解与认识,进一步熟悉了数字电路系统设计、制作与调试的方法和步骤。

进一步了解了计算机组成原理与系统结构,使自己对EDA技术的学习更深入,学会用VHDL语言去控制将会使我们对本专业知识可以更好地掌握。

现在的信号发生器设计有以下几种方法:(1) 模拟直接合成法。

这种方法充分利用了乘法器、除法器、混频器、滤波器和快速开关构成合成信号发生器,但是它的缺点是带宽不够高,性能差,构成信号发生器的电路体积比较庞大,而且功耗较高。

(2) 间接数字合成法。

它采用数字电路代替模拟合成法的锁相环,减小了多次倍乘和滤波所需的设置时间,使频率设置时间降低到几。

间接数字合成法还可获得非整数N的分频,即分数N的频率合成(N<1)。

(3) 更先进的数字合成法是直接数字合成(DDS)。

它完全摆脱间接数字合成的乘法/除法电路,直接在基准时钟的准确相位控制下获得合成频率输出,频率控制的相位累加器由寄存器和加法器组成,如果相位累加器的宽度是30位,则相当于数字230或109,频率控制输入等于1时,将获得360 /109的相位信息,存储在波形存储器内,再经数模转换后输出最低合成频率,随着频率控制输入的增长,输出合成频率亦增加。

相位累加器的宽度增加时,输出合成频率的准确度相应增加。

由它构成的低频信号发生器虽然低频信号较好,但体积较大,价格较贵。

(4) 用FPGA或CPLD来实现。

它的优点是可以进行功能仿真,而且FPGA和CPLD的片内资源丰富,设计的流程简单,缺点是开发成本高。

(5) 用DSP来实现。

这主要是采用软件和硬件结合的设计方法,相对于以上提到的几种硬件设计方法,采用DSP容易进行仿真,而且适用的范围广,同时开发的成本也比较低,而且开发的周期短。

以上几种设计方法各有自己的优缺点,可以根据对信号发生器功能不同的要求,采用不同的设计方法。

本课题采用的是基于DSP的设计,这种设计主要靠编程来实现,可以产生各种复杂的波形,完全可以满足产生正弦波、方波、三角波三种基本波形的设计要求。

第一章多功能信号发生器的设计实现1、课题要求1. 能显示三角波、方波、正弦波三种波形。

2. 附加功能:实现锯齿波、频率调节、幅度调节。

5. 用VHDL语言设计符合上述功能要求的函数信号发生器,并用层次化设计方法设计该电路。

6.各模块状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。

2、设计要求方案用FPGA设计一个多功能信号发生器,通过选择输入信号,可以输出锯齿波、三角波、方波和正弦波四种信号。

波形的频率可以通过256进制和16选1来控制。

信号发生器的控制模块可以用数据选择器实现,波形的选择可以用8选1数据选择器实现。

3、本人任务在本次课程设计中,我主要负责软件部分。

负责通过VHDL 语言设计频率调节模块、产生各波形模块、波形选择模块,以及仿真、调试、优化各模块。

最后将最好的软件下载到FPGA 芯片中。

第二章 信号发生器的结构框图1、结构框图其中用信号产生模块将产生所需要的各种信号,信号发生器的控制模块可以用数据选择器实现,用8选1数据选择器实现对几种信号的选择。

最后将波形数据送入D/A 转换器,将数字信号转换为模拟信号输出。

用示波器测试D/A 转换器的输出,可以观测到几种波形的输出。

2、以下为软件结构简图:用两个256进制计数器将50MHz 的晶振进行分频通过16选1数据选择器选择频256进制 计数器16选1数据选择器三角波方波8选1数据 选择器正弦波锯齿波时钟信号 信号控制 D/A 转换 输出信号选择信号率从而实现频率调节。

通过波形产生模块产生各个波形,再通过8选1数据选择器选择输出的波形。

第三章软件电路设计与仿真图1、四个波形的各个程序(1)三角波的编译:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sanjiao isport(CLK:in std_logic;reset:in std_logic;a:out std_logic_vector(7 downto 0));end sanjiao;architecture one of sanjiao isbeginprocess(CLK,reset)variable Q:std_logic_vector(7 downto 0);variable sign:std_logic;beginif reset='1' thenQ:="00000000";sign:='0';elsif CLK'event and CLK='1' thenif sign='0' thenif Q="11111110"thenQ:="11111111";sign:='1';elseQ:=Q+'1';end if;elseif Q="00000001" thenQ:="00000000";sign:='0';elseQ:=Q-'1';end if;end if;end if;a<=Q;end process;end one;(中间部分波形图省略)分析:当reset=1时,计数器被清零;当reset=0,且clk为上升沿时,将进行计数。

在进行计数时,先判断计数方向是否为‘0’,若为‘0’则进行加计数,否则进行减计数,sign=0时先判断当前计数值是否为“11111110”,如果是,则将计数值置为“11111111”,并将sign置为‘1’;否则进行加1计数。

Sign=1时,先判断当前计数值是否为“00000001”,如果是,则将计数值置为“00000000”,并将sign置为‘0’;否则进行减1计数。

(2)正弦波的编译:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity sine isport( clk:in std_logic;reset:in std_logic;dout:out std_logic_vector(7 downto 0)); end sine;architecture six of sine issignal cnt_val:integer;beginu1:process(clk,reset)variable cnt: integer range 0 to 63; beginif reset='1' thencnt:=0;elsif clk'event and clk='1' thenif cnt=63 thencnt:=0;elsecnt:=cnt+1;end if;end if;cnt_val<=cnt;end process u1;u2:process(cnt_val)begincase cnt_val iswhen 0=>dout<="11111111";when 1=>dout<="11111110";when 2=>dout<="11111100";when 3=>dout<="11111001";when 4=>dout<="11110101";when 5=>dout<="11101111";when 6=>dout<="11101001";when 7=>dout<="11100001";when 8=>dout<="11011001";when 9=>dout<="11001111";when 10=>dout<="11000101";when 11=>dout<="10111010";when 12=>dout<="10101110";when 13=>dout<="10100010";when 14=>dout<="10010110";when 15=>dout<="10001001";when 16=>dout<="01111100";when 17=>dout<="01110000";when 18=>dout<="01100011";when 19=>dout<="01010111";when 20=>dout<="01001011"; when 21=>dout<="01000000"; when 22=>dout<="00110101"; when 23=>dout<="00101011"; when 24=>dout<="00100010"; when 25=>dout<="00011010"; when 26=>dout<="00010011"; when 27=>dout<="00001101"; when 28=>dout<="00001000"; when 29=>dout<="00000100"; when 30=>dout<="00000001"; when 31=>dout<="00000000"; when 32=>dout<="00000000"; when 33=>dout<="00000001"; when 34=>dout<="00000100"; when 35=>dout<="00001000"; when 36=>dout<="00001101"; when 37=>dout<="00010011"; when 38=>dout<="00011010"; when 39=>dout<="00100010"; when 40=>dout<="00101011"; when 41=>dout<="00110101"; when 42=>dout<="01000000"; when 43=>dout<="01001011"; when 44=>dout<="01010111"; when 45=>dout<="01100011"; when 46=>dout<="01110000"; when 47=>dout<="01111100"; when 48=>dout<="10001001"; when 49=>dout<="10010110"; when 50=>dout<="10100010"; when 51=>dout<="10101110"; when 52=>dout<="10111010"; when 53=>dout<="11000101"; when 54=>dout<="11001111"; when 55=>dout<="11011001"; when 56=>dout<="11100001"; when 57=>dout<="11101001"; when 58=>dout<="11101111"; when 59=>dout<="11110101"; when 60=>dout<="11111001"; when 61=>dout<="11111100"; when 62=>dout<="11111110"; when 63=>dout<="11111111";when others=>null;end case;end process u2;end six;分析:当reset=1时,表示复位有效;当reset=0时,判断脉冲信号输入是否为上升沿,如果为上升沿脉冲,将进行采样次数的计数。

相关主题