一、实验目的
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个点存储在波形存储模块里。则输出频率foutfclk 64.N(2).数据存储模块 (存储波形数据)
数据存储模块主要存的是正弦波、三角波、锯齿波等一个周期的采样点。
三角波模块可设计一个可逆计数器实现,设计时设置一变量作为工作状态标志,在此变量为0时,当检测到时钟的上升沿进行加同一个数操作;为1时,进行减同一个数操作。DA转换采用的DA0832,输入有8个数据端,范围是0到255;而且设置64个时钟周期为一个三角波周期,所有每次加、减为8. 锯齿波的存储数据与三角波类似。
方波可以通过交替输出全0和全1,并给以32个周期的延时来实现。
正弦波:要通过波形变换实现把sina 变换成(cosa1)*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 实用教程》潘松 、王国栋主编
周润编
因篇幅问题不能全部显示,请点此查看更多更全内容