您的当前位置:首页正文

用VHDL设计多功能信号发生器

2020-09-17 来源:意榕旅游网
实验二 用VHDL设计多功能信号发生器

一、实验目的

1掌握运用quartusⅡ软件仿真 2,熟练运用VHDL语言编程 二、实验要求

基于《VHDL语言》,通过给定的仪器(EDA6000试验箱)设计一个多功能信号发生器,要求:

(1)能产生周期性正弦波、方波、三角波、锯齿波以及用户自己编辑的特定波形(选作); (2)输出信号的频率范围为100Hz~200KHz,且输出频率可以调节; (3)具有显示输出波形、频率的功能。(选作) 系统顶层框图 时钟 预置分频数控分频器 三角波波形数据 8位数据 数据选择器 数 ) (0-255 复位信号 波形选择开关

正弦波波形数据 fout 方波波形数据 任意波形数据 在原理框图中,正(余)弦查找表由ROM构成,内部存有一个完整周期正(余)弦波的数字幅度信息,每个查找表的地址对应正(余)弦波幅度信号,同时输出到数模转换器(DAC)输入端,DAC输出的模拟信号经过低通滤波器(LPF),可以得到一个频谱纯净的正(余)弦波。

三、实验原理

用VHDL语言结合原理图设计实现一个函数信号发生器,输出正弦波、方波和三角波三种波形。将频率控制、分频、三角波、正弦波、方波发生邓各个模块分别用VHDL语言编程为一个子程序,并把每一个模块转换成图形文件,然后在原理图编辑框调用这些图形模块,连接电路如上图系统顶层框图所示。通过按键1到按键8控制频率调节f〔7...0〕,用按键6、按键7、按键8控制dlt、sin、sqr波形选通,最后把八位输出接DAC0832通过D/A转换,从示波器上就能看到波形输出。按下不同的按键输出不同的波形及频率。 (1)数控分频器模块

在时钟的作用下,通过预置分频数DIN,来改变输出频率。假如分频系数为N,波形存储模块存储一个周期的波形,实验里按照一个周期波形采样64个点存储在波形存储模块里。则输出频率foutfclk 64.N(2).数据存储模块 (存储波形数据)

数据存储模块主要存的是正弦波、三角波、锯齿波等一个周期的采样点。

三角波模块可设计一个可逆计数器实现,设计时设置一变量作为工作状态标志,在此变量为0时,当检测到时钟的上升沿进行加同一个数操作;为1时,进行减同一个数操作。DA转换采用的DA0832,输入有8个数据端,范围是0到255;而且设置64个时钟周期为一个三角波周期,所有每次加、减为8. 锯齿波的存储数据与三角波类似。

方波可以通过交替输出全0和全1,并给以32个周期的延时来实现。

正弦波:要通过波形变换实现把sina 变换成(cosa1)*127.5的形式进行采样,然后变换成8位二进制码,存储在波形存储器里。

(3)数据选择器模块

在波形开关的控制下,选择相应的波形输出。可以用3个按键来控制波形选择 (4).LED显示模块 (选作)

LED显示模块主要是完成频率控制字的显示,由于本次实验采用八位的由键盘输入的频率控制字,累计寻址,读取8位地址长度256点的一个周期波形的数字幅度信息,所以频率控制字控制着频率的大小,而恰好此时的频率控制字就是系统输出波形的频率,所以,LED显示的也是波形的频率。此模块主要的功能是将外部键盘的8位二进制数转换成三位BCD码。 四、实验步骤 1建立.hex文件

2、定制LPM_ROM原件,生成的的ROM文件data_rom.vhd如下

LIBRARY ieee;

USE ieee.std_logic_1164.all; entity sindata is

port(address:in std_logic_vector(5 downto 0); inclock:in std_logic;

q:out std_logic_vector(7 downto 0); end sindata;

architecture syn of sindata is

signal sub_wire0 :std_logic_vector(7 downto 0); component 1pm_rom

generic(1pm_width :natural; 1pm_widthid :natural;

1pm_address_control:string; 1pm_outdata:string; 1pm_file:string);

port(address:in std_logic_vector(5 downto 0); inclock:in std_logic;

q:out std_logic_v ector(7 downto 0)); end component; begin

q<=sub_wire0(7 downto 0); 1pm_rom_component:1pm_rom

generic map(lpm_width=>8,lpm_widthad=>6,

lpm_address_comtrol=>\"registered\

lpm_file=>\"D:/SIN_G/DATA/sin_data.mif\")

port map(address=>address,inclock=>inclock,q=>sub_wire0); end syn;

3、顶层设计

正弦波信号发生器顶层设计源程序:

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity singt is

port(clk:in std_logic;

dout:out std_logic_vector(7 downto 0)); end;

architecture dacc of singt is component sindata

port(address:in std_logic_vector(5 downto 0); inclock:in std_logic;

q:out std_logic_vector(7 downto 0)); end conponent;

signal q1:std_logic_vector(5 downto 0); begin

process(clk) begin

if clk'event and clk='1'then q1<=q1+1; end if end process;

u1:sindata port map(address=>q1,q=>dout,inclock=>clk); end;

方波信号发生器顶层设计文件

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY SIG IS

PORT( CLK:IN STD_LOGIC;

SINOUT:OUT STD_LOGIC_VECTOR(7 TO 0)); END;

ARCHITECTURE ONE OF SIG IS

SIGNAL MSIN:INTEGER RANGE 0 TO 60; BEGIN

PROCESS(CLK)

VARIABLE VSIN:INTEGER RANGE 0 TO 60; BEGIN

IF CLK'EVENT AND CLK='1' THEN IF VSIN=60 THEN VSIN:=0; ELSE VSIN:=VSIN+1; END IF; END IF; MSIN<=VSIN; END PROCESS; PROCESS(MSIN) BEGIN

CASE MSIN IS

WHEN 0=>SINOUT<=\"01111110\"; WHEN 1=>SINOUT<=\"10001011\"; WHEN 2=>SINOUT<=\"10011000\"; WHEN 3=>SINOUT<=\"10100101\"; WHEN 4=>SINOUT<=\"10110001\"; WHEN 5=>SINOUT<=\"10111101\"; WHEN 6=>SINOUT<=\"11001000\"; WHEN 7=>SINOUT<=\"11010010\"; WHEN 8=>SINOUT<=\"11011100\"; WHEN 9=>SINOUT<=\"11100100\"; WHEN 10=>SINOUT<=\"11101011\"; WHEN 11=>SINOUT<=\"11110001\"; WHEN 12=>SINOUT<=\"11110110\"; WHEN 13=>SINOUT<=\"11111001\"; WHEN 14=>SINOUT<=\"11111011\"; WHEN 15=>SINOUT<=\"11111100\"; WHEN 16=>SINOUT<=\"11111011\"; WHEN 17=>SINOUT<=\"11111001\"; WHEN 18=>SINOUT<=\"11110110\"; WHEN 19=>SINOUT<=\"11110001\"; WHEN 20=>SINOUT<=\"11101011\"; WHEN 21=>SINOUT<=\"11100100\"; WHEN 22=>SINOUT<=\"11011100\"; WHEN 23=>SINOUT<=\"11010010\"; WHEN 24=>SINOUT<=\"11001000\"; WHEN 25=>SINOUT<=\"10111101\"; WHEN 26=>SINOUT<=\"10110001\"; WHEN 27=>SINOUT<=\"10100101\"; WHEN 28=>SINOUT<=\"10011000\"; WHEN 29=>SINOUT<=\"10001011\"; WHEN 30=>SINOUT<=\"01111110\"; WHEN 31=>SINOUT<=\"01110001\"; WHEN 32=>SINOUT<=\"01100100\"; WHEN 33=>SINOUT<=\"01010111\"; WHEN 34=>SINOUT<=\"01001011\";

WHEN 35=>SINOUT<=\"00111111\"; WHEN 36=>SINOUT<=\"00110100\"; WHEN 37=>SINOUT<=\"00101010\"; WHEN 38=>SINOUT<=\"00100000\"; WHEN 39=>SINOUT<=\"00011000\"; WHEN 40=>SINOUT<=\"00010001\"; WHEN 41=>SINOUT<=\"00001011\"; WHEN 42=>SINOUT<=\"00000110\"; WHEN 43=>SINOUT<=\"00000011\"; WHEN 44=>SINOUT<=\"00000001\"; WHEN 45=>SINOUT<=\"00000000\"; WHEN 46=>SINOUT<=\"00000001\"; WHEN 47=>SINOUT<=\"00000011\"; WHEN 48=>SINOUT<=\"00000110\"; WHEN 49=>SINOUT<=\"00001011\"; WHEN 50=>SINOUT<=\"00010001\"; WHEN 51=>SINOUT<=\"00011000\"; WHEN 52=>SINOUT<=\"00100000\"; WHEN 53=>SINOUT<=\"00101010\"; WHEN 54=>SINOUT<=\"00110100\"; WHEN 55=>SINOUT<=\"00111111\"; WHEN 56=>SINOUT<=\"01001011\"; WHEN 57=>SINOUT<=\"01010111\"; WHEN 58=>SINOUT<=\"01100100\"; WHEN 59=>SINOUT<=\"01110001\"; WHEN 60=>SINOUT<=\"01111110\"; WHEN OTHERS=>NULL; END CASE; END PROCESS; END;

三角波顶层文件设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY TRIGON IS

PORT(CLK:IN STD_LOGIC;

TRIOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END;

ARCHITECTURE ONE OF TRIGON IS BEGIN

PROCESS(CLK)

VARIABLE PD:STD_LOGIC;

VARIABLE TGE:STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

IF CLK'EVENT AND CLK='1'THEN IF PD='0'THEN

IF TGE=\"11101110\"THEN TGE:=\"11111111\";PD:='1'; ELSE TGE:=TGE+17; END IF; ELSE

IF TGE=\"00010001\"THEN TGE:=\"00000000\";PD:='0'; ELSE TGE:=TGE-17; END IF; END IF; END IF; TRIOUT<=TGE; END PROCESS; END;

波形选择源文件 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY SELECTE IS

PORT(SELIN:IN STD_LOGIC_VECTOR(2 DOWNTO 0); ADDIN:IN STD_LOGIC_VECTOR(5 DOWNTO 0);

SININ,TRIIN,SQUIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0); RI:OUT STD_LOGIC;

QADD:BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0); Q:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0)); END;

ARCHITECTURE ONE OF SELECTE IS BEGIN

PROCESS(SELIN)

VARIABLE RI1:STD_LOGIC;

VARIABLE X:STD_LOGIC_VECTOR(8 DOWNTO 0); VARIABLE Y:STD_LOGIC_VECTOR(9 DOWNTO 0); BEGIN

CASE SELIN IS

WHEN\"000\"=>Q<=SININ;RI1:='1';QADD<=\"ZZZZZZ\"; WHEN\"001\"=>Q<=TRIIN;RI1:='1';QADD<=\"ZZZZZZ\"; WHEN\"010\"=>Q<=SQUIN;RI1:='1';QADD<=\"ZZZZZZ\"; WHEN\"011\"=>QADD<=ADDIN;RI1:='0';Q<=\"ZZZZZZZZ\";

WHEN\"100\"=>X:='0'&SININ+TRIIN;Q<=X(8 DOWNTO 1);RI1:='1';QADD<=\"ZZZZZZ\"; WHEN\"101\"=>X:='0'&SININ+SQUIN;Q<=X(8 DOWNTO 1);RI1:='1';QADD<=\"ZZZZZZ\"; WHEN\"110\"=>X:='0'&TRIIN+SQUIN;Q<=X(8 DOWNTO 1);RI1:='1';QADD<=\"ZZZZZZ\"; WHEN\"111\"=>X:='0'&TRIIN+SININ;Y:='0'&X+SQUIN;Q<=Y(9 DOWNTO 2); RI1:='1';QADD<=\"ZZZZZZ\";

WHEN OTHERS=>NULL; END CASE; RI<=RI1; END PROCESS; END;

4、全程编译并进行仿真仿真结果如下

(1)正弦波

仿真波形图如图12所示:

图12

FRCT:相位控制端; CLK:时钟输入; SINOUT:正弦波输出; VSIN:正弦波地址寄存器;

(2)方波

仿真波形图如图13所示:

图13

CLK:时钟输入; FRCT:相位控制端; SQUOUT:方波输出;

(3)三角波

仿真波形图如图14所示:

图14

CLK:时钟输入; FRCT:相位控制端; TRIOUT:三角波输出;

(4)任意波形的地址 仿真波形图如图15所示:

图15

FRCT:相位控制端; CLK:时钟输入; ADDOUT:地址输出;

(5)波形选择

仿真波形图如图16所示:

图16

RI:RAM的读数控制端;

SELIN:波形选择输入端(0:正弦波;1:三角波;2:方波;3:任意波地址;4:三角波和正弦波的叠加;5:方波和正弦波的叠加;6:方波和三角波的叠加;7:三

种波形的叠加)

ADDIN:地址输入端; SININ:正弦波输入端; TRIIN:三角波输入端; SQUIN:方波输入端; QADD:地址输出端; Q:波形选择输出端;

五、参考文献

1、科学出版社《EDA技术使用教程》 潘松、黄继业主编

2、成都电子科技大学出版社《电子设计自动化(EDA)教程》王锁萍编 3、电子工业出版社《VHDL 数字电路设计教程》乔庐峰等译

4、电子工业出版社《基于quartusⅡ的数字系统Veriog HDL设计实例讲解》5、成都电子科技大学出版社《VHDL 实用教程》潘松 、王国栋主编

周润编

因篇幅问题不能全部显示,请点此查看更多更全内容