EDA课程报告_正弦波信号发生器的设计
- 格式:doc
- 大小:141.50 KB
- 文档页数:18
《EDA》课程设计报告——正弦波信号发生器的设计
一、设计目的
通过本次课程设计,进一步了解QUARTUS Ⅱ与LPM_ROM与FPGA硬件功能的使用方法。培养自己查阅资料及解决问题的能力。
二、设计要求
1、通过按键,可以控制输出的是正弦波或三角
波。
2、通过ADC0832输出正弦波与三角波,电压V范
围在0至-10V之间
3、通过示波器观察波形。
三、设计内容:
在QUARTUSII上完成信号发生器的设计。最后在实验板上实测,包括FPGA中ROM的在系统数据
读写测试和利用示波器测试。信号输出的D/A使
用实验板上的ADC0832。
四、设计原理:
图1所示的波信号发生器的结构由五部分组
成:
1、计数器或地址发生器(这里选择8位)。正弦
信号数据ROM(8位地址线,8位数据线),含
有256个8位数据(一个周期)。
2、VHDL顶层设计。
3、8位D/A
图1所示的信号发生器结构图中,顶层文件adc.vhd在FPGA中实现,包含两个部分:ROM的地址信号发生器,由8位计数器担任;一个正弦数据ROM(或者一个三角波数据ROM),由LPM_ROM模块构成。地址发生器的时钟clk的输入频率fo与每周期的波形数据点数(在此选择256点),以及D/A输出的频率f的关系是:f=fo/256
图1 正弦信号发生器结构框图
图一 信号发生器结构图
FPGA DAC08328clk 运放
Vo
按键
图2 信号发生器的设计图
五、 设计步骤:
1、 建立.mif 格式文件 mif 文件可用C 语言程序生成, 产生正弦波数值的C 程序如下: #include
VHDL 顶层 设计adc.vhd 8位计数
器 (地址发正弦波数据
存储ROM1
8位D/A
三角波数据
存储ROM2
按
键
3 20
分频
main()
{
int i;
float s;
for(i=0;i<256;i++)
{
s=sin(atan(1)*8*i/256);
printf("%d :%d;\n",i,(int)((s+1)*255/2)) }
}
以zx.c保存。
产生三角波数值的C程序如下:
#include
#include
main()
{
int i;
float s;
for(i=0;i<256;i++)
{
s=i;
printf("%d :%d;\n",i,s);
}
}
以sj.c保存。
其次,把上述程序编译后,会生成EXE文件,在DOS命令行下分别执行以下命令:
zx > zx.mif;
sj > sj.mif;
将生成的*.mif 文件,再加上.mif文件的头部说明即可。
.mif文件的头部说明如下所示:
WIDTH=8;
DEPTH=256;
ADDRESS_RADIX=DEC;
DATA_RADIX=DEC;
CONTENT BEGIN
……
……(数据略去)
END;
2、在设计信号发生器前,必须首先完成存放波形数据ROM的设计。设计步骤如下:
1)打开QUARTUS Ⅱ。在files菜单中选择new 产生一个对话框,选择Block Diagram/Schematic File 项,会生成一个*.bdf文件,双击文件空白处,跳出symbol窗口,在改窗口下选择megafunctions>storage>lpm_rom。
2)在跳出的 MegaWizard Plug-In Manager中选择VHDL,路径保存在D:\chengxv\中
3)在parameter settings 窗口中,选择currently selected device family :cyclone.选择ROM控制线、地址线和数据线。在弹出的对话框中选择地址线位宽和ROM中数据数分别为8和64;
选择地址锁存控制信号dual clock。在对话框的“What should the RAM…”栏选择默认的Auto。4)单击NEXT,将此界面数据如图设置
5)单击Next按钮,选择BROWSE,选择利用C做成的MIF文件,将此模块命名为ROM0,再单击Finish 按钮后完成ROM0定制。
6)打开此文件可以看到其中调用初始化数据文件的语句为:init_file => ".mif"。最后生成的
ROM0元件文件如源代码1所示.
六、源代码:
1)、源代码1如下所示:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.all;
ENTITY ROM0 IS
PORT
(
address : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
inclock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
END ROM0;