EDA课程报告正弦波信号发生器的方案设计书.docx
《EDA课程报告正弦波信号发生器的方案设计书.docx》由会员分享,可在线阅读,更多相关《EDA课程报告正弦波信号发生器的方案设计书.docx(17页珍藏版)》请在冰豆网上搜索。
EDA课程报告正弦波信号发生器的方案设计书
封面
作者:
PanHongliang
仅供个人学习
《EDA》课程设计报告
——正弦波信号发生器的设计
一、设计目的:
进一步熟悉QuartusII及其LPM_ROM与FPGA硬件资源的使用方法。
培养动手能力以及合作能力。
二、设计要求:
1、clk为12MHz。
2、通过DAC0832输出正弦波电压信号,电压范围0~-5V。
3、通过示波器观察波形。
三、设计内容:
在QUARTUS
上完成正弦波信号发生器的设计,包括仿真和资源利用情况了解(假设利用Cyclone器件)。
最后在实验系统上实测,包括FPGA中ROM的在系统数据读写测试和利用示波器测试。
信号输出的D/A使用实验系统上的ADC0832。
四、设计原理:
图1所示的正弦波信号发生器的结构由四部分组成:
1、计数器或地址发生器(这里选择10位)。
2、正弦信号数据ROM(10位地址线,8位数据线),含有1024个8位数据(一个周期)。
3、VHDL顶层设计。
4、8位D/A(实验中可用ADC0832代替)。
图1所示的信号发生器结构图中,顶层文件singt.vhd在FPGA中实现,包含两个部分:
ROM的地址信号发生器,由10位计数器担任;一个正弦数据ROM,由LPM_ROM模块构成。
LPM_ROM底层是FPGA中的EAB、ESB或M4K等模块。
地址发生器的时钟clk的输入频率fo与每周期的波形数据点数(在此选择1024点),以及D/A输出的频率f的关系是:
f=fo/1024
图1正弦信号发生器结构框图
图2正弦波信号发生器的设计图
五、设计步骤:
1、建立.mif格式文件
首先,mif文件可用C语言程序生成,产生正弦波数值的C程序如下:
#include
#include
main()
{
inti。
floats。
for(i=0。
i<1024。
i++)
{
s=sin(atan
(1)*8*i/256)。
printf("%d:
%d。
\n",i,(int)((s+1)*255/2))
}
}
其次,把上述程序编译后,在DOS命令行下执行命令:
romgen>sdata.mif。
将生成的sdata.mif文件,再加上.mif文件的头部说明即可。
.mif文件的头部说明如下所示:
WIDTH=8。
DEPTH=1024。
ADDRESS_RADIX=DEC。
DATA_RADIX=DEC。
CONTENTBEGIN
0:
127。
1:
130。
2:
133。
3:
136。
4:
139。
5:
143。
6:
146。
……(数据略去)
1016:
102。
1017:
105。
1018:
108。
1019:
111。
1020:
115。
1021:
118。
1022:
121。
1023:
124。
END。
2、在设计正弦波信号发生器前,必须首先完成存放波形数据ROM的设计。
利用MegaWizardPlug-Inmanager定制正弦信号数据ROM宏功能块,并将以上的波形数据加载于此ROM中。
设计步骤如下:
1)打开MegaWizardPlug-Inmanager初始对话框。
在Tools菜单中选择MegaWizardPlug-Inmanager产生一个对话框,选择Createanewcustom...项,即定制一个新的模块。
单击Next按钮后,在所产生的对话框的左栏选择Storage项下的LPM_ROM,再选择CycloneⅡ器件和VHDL语言方式;最后输入ROM文件存放的路径和文件名:
e:
\www\rom_1024.vhd,单击Next按钮。
2)选择ROM控制线、地址线和数据线。
在弹出的对话框中选择地址线位宽和ROM中数据数分别为10和1024;选择地址锁存控制信号clock。
3)单击Next按钮在对话框的“WhatshouldtheRAM…”栏选择默认的Auto。
在栏选择“Doyouwantto…Yes,usethisfileformemorycontentdata”项,并按Browse钮,选择指定路径上的文件rom_1024.mif。
在“AllowIn-SystemMemory…”栏选择打勾,并在“TheInstanceIDofthisROM”栏输入ROM1,作为ROM的ID名称。
最后单击Next按钮,再单击Finish按钮后完成ROM定制。
4)打开此文件可以看到其中调用初始化数据文件的语句为:
init_file=>"sdata.mif"。
最后生成的ROM元件文件如源代码1所示,其中的init_file指向已做了修改。
修改后用于例化的波形数据ROM文件rom_1024.vhd如下。
六、源代码:
1)、源代码1如下所示:
LIBRARYieee。
USEieee.std_logic_1164.all。
LIBRARYaltera_mf。
USEaltera_mf.altera_mf_components.all。
ENTITYrom_1024IS
PORT
(address:
INSTD_LOGIC_VECTOR(9DOWNTO0)。
clock:
INSTD_LOGIC。
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
)。
ENDrom_1024。
ARCHITECTURESYNOFrom_1024IS
SIGNALsub_wire0:
STD_LOGIC_VECTOR(7DOWNTO0)。
COMPONENTaltsyncram
--例化altsyncram元件,调用了LPM模块altsyncram
GENERIC(--参数传递语句
--类属参量数据类型定义
intended_device_family:
STRING。
width_a:
NATURAL。
widthad_a:
NATURAL。
numwords_a:
NATURAL。
operation_mode:
STRING。
outdata_reg_a:
STRING。
address_aclr_a:
STRING。
outdata_aclr_a:
STRING。
width_byteena_a:
NATURAL。
init_file:
STRING。
lpm_hint:
STRING。
lpm_type:
STRING
)。
PORT(--altsyncram元件接口声明
clock0:
INSTD_LOGIC。
address_a:
INSTD_LOGIC_VECTOR(9DOWNTO0)。
q_a:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
)。
ENDCOMPONENT。
BEGIN
q<=sub_wire0(7DOWNTO0)。
altsyncram_component:
altsyncram
GENERICMAP(
intended_device_family=>"Cyclone",
--参数传递映射
width_a=>8,--数据线宽度8
widthad_a=>10,--地址线宽度10
numwords_a=>1024,--数据数量1024
operation_mode=>"ROM",--LPM模式ROM
outdata_reg_a=>"CLOCK0",--输出锁存CLOCK0
address_aclr_a=>"NONE",--无异步地址清0
outdata_aclr_a=>"NONE",--无输出锁存异步清0
width_byteena_a=>1,--byteena_a输出口宽度1
init_file=>"sdata.mif",--ROM初始化数据文件
lpm_hint=>"ENABLE_RUNTIME_MOD=NO",
lpm_type=>"altsyncram"--LPM类型
)
PORTMAP(
clock0=>clock,
address_a=>address,
q_a=>sub_wire0
)。
ENDSYN。
2)、顶层设计代码:
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entitysingtis
port(clk:
instd_logic。
--信号源时钟
dout:
outstd_logic_vector(7downto0))。
--8位波形数据输出
endsingt。
architecturedaccofsingtis
componentrom_1024
--调用波形数据存储器LPM_ROM,
文件:
rom_1024.vhd声明
port(address:
instd_logic_vector(9downto0)。
--10位地址信号
clock:
instd_logic。
--地址锁存时钟
q:
outstd_logic_vector(7downto0))。
endcomponent。
signalq1:
std_logic_vector(9downto0)。
--设内部节点作为地址计数器
begin
process(clk)--LPM_ROM地址发生进程
begin
ifclk'eventandclk='1'then
q1<=q1+1。
--Q1作为地址发生器计数器
endif。
endprocess。
u1:
rom_1024portmap(address=>q1,q=>dout,clock=>clk)。
--例化
enddacc。
3)为此顶层设计创建一项工程,工程名和实体名都是singt。
4)全程编译一次后进入时序仿真测试。
由波形可见,随着每一个时钟上升沿的到来,输出端口将正弦波数据依次输出。
5)硬件测试。
选择电路模式5,则时钟CLK接实验箱的clock0。
将dout(0)…dout(7)分别锁定于实验系统上与DAC0832相接的I/O口:
PIO24、PIO25、PIO26、PIO27、PIO28、PIO29、PIO30、PIO31。
编译下载singt.sof后,打开电压开关,将CLK的时钟通过实验箱上clock0的跳线选择频率为12MHZ,再将示波器接于实验箱的两个挂钩上就能观察波形的输出情况了。
七、仿真波形图:
八、仿真电路图:
九、引脚锁定:
一十、设计结果:
Clock0=12MHZ,输出频率为:
f=47KHZ,周期为:
T=21us
一十一、设计体会:
在本次设计的过程中,我在编译过程中出现问题,第一个问题出在建立.mif格式文件中,没有将生成的sdata.mif文件加上.mif文件的头部说明。
.mif文件的头部说明如下所示:
WIDTH=8。
DEPTH=1024。
ADDRESS_RADIX=DEC。
DATA_RADIX=DEC。
CONTENTBEGIN
0:
127。
1:
130。
……(数据略去)
1023:
124。
END。
由于没有加.mif文件的头部说明,导致用于例化的波形数据ROM文件rom_1024.vhd编译失败。
最后在老师的指导帮助下,正确的把.mif文件的头部说明加在了生成的sdata.mif文件中,这样rom_1024.vhd文件编译成功。
第二个问题出现在完成存放波形数据ROM的设计过程中,没有正确的选择指定路径文件名sdata.mif导致用于例化的波形数据ROM文件rom_1024.vhd编译失败,经过我的思考和分析后,我正确的选择指定路径文件名sdata.mif,这样编译正确通过。
最后,正确的设计正弦波信号发生器的顶层文件sight.vhd,使设计顺利的通过编译。
在编译下载singt.sof后,当改变实验箱上clock0的跳线频率时,相应的波形输出情况也发生相应的变化。
在这次设计中,我也深深地体会到“细节决定成败”这句话的真正含义,也许就因为一个小的细节就会导致设计的失败。
这次设计也启发了我在以后的学习中一定要耐心、细心、认真,不可粗枝大叶。
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entityabcis
port(
clk:
instd_logic。
dout:
outintegerrange255downto0。
a:
instd_logic)。
END。
architectureoneofabcis
signalQ:
integerrange127downto0。
signalW:
integerrange255downto0。
signalD:
integerrange255downto0。
signalC:
integerrange63downto0。
begin
process(clk)
begin
ifclk'eventandclk='1'thenQ<=Q+1。
C<=C+1。
ifQ<127THENQ<=Q+1。
ELSEQ<=0。
ifC<63THENC<=C+1。
ELSEC<=0。
ENDIF。
ENDIF。
ENDIF。
ENDPROCESS。
PROCESS(C,Q)
BEGIN
CASECIS
WHEN000=>D<=255。
WHEN001=>D<=254。
WHEN002=>D<=252。
WHEN003=>D<=249。
WHEN004=>D<=245。
WHEN005=>D<=239。
WHEN006=>D<=233。
WHEN007=>D<=225。
WHEN008=>D<=217。
WHEN009=>D<=207。
WHEN010=>D<=197。
WHEN011=>D<=186。
WHEN012=>D<=174。
WHEN013=>D<=162。
WHEN014=>D<=150。
WHEN015=>D<=137。
WHEN016=>D<=124。
WHEN017=>D<=112。
WHEN018=>D<=99。
WHEN019=>D<=87。
WHEN020=>D<=75。
WHEN021=>D<=64。
WHEN022=>D<=53。
WHEN023=>D<=43。
WHEN024=>D<=34。
WHEN025=>D<=26。
WHEN026=>D<=19。
WHEN027=>D<=13。
WHEN028=>D<=8。
WHEN029=>D<=4。
WHEN030=>D<=1。
WHEN031=>D<=0。
WHEN032=>D<=0。
WHEN033=>D<=1。
WHEN034=>D<=4。
WHEN035=>D<=8。
WHEN036=>D<=13。
WHEN037=>D<=19。
WHEN038=>D<=26。
WHEN039=>D<=34。
WHEN040=>D<=43。
WHEN041=>D<=53。
WHEN042=>D<=64。
WHEN043=>D<=75。
WHEN044=>D<=87。
WHEN045=>D<=99。
WHEN046=>D<=112。
WHEN047=>D<=124。
WHEN048=>D<=137。
WHEN049=>D<=150。
WHEN050=>D<=162。
WHEN051=>D<=174。
WHEN052=>D<=186。
WHEN053=>D<=197。
WHEN054=>D<=207。
WHEN055=>D<=217。
WHEN056=>D<=225。
WHEN057=>D<=233。
WHEN058=>D<=239。
WHEN059=>D<=245。
WHEN060=>D<=249。
WHEN061=>D<=252。
WHEN062=>D<=254。
WHEN063=>D<=255。
ENDCASE。
CASEQIS
WHEN000=>W<=255。
WHEN001=>W<=251。
WHEN002=>W<=247。
WHEN003=>W<=243。
WHEN004=>W<=239。
WHEN005=>W<=235。
WHEN006=>W<=231。
WHEN007=>W<=227。
WHEN008=>W<=223。
WHEN009=>W<=219。
WHEN010=>W<=215。
WHEN011=>W<=211。
WHEN012=>W<=207。
WHEN013=>W<=203。
WHEN014=>W<=199。
WHEN015=>W<=195。
WHEN016=>W<=191。
WHEN017=>W<=187。
WHEN018=>W<=183。
WHEN019=>W<=179。
WHEN020=>W<=175。
WHEN021=>W<=171。
WHEN022=>W<=167。
WHEN023=>W<=163。
WHEN024=>W<=159。
WHEN025=>W<=155。
WHEN026=>W<=151。
WHEN027=>W<=147。
WHEN028=>W<=143。
WHEN029=>W<=139。
WHEN030=>W<=135。
WHEN031=>W<=131。
WHEN032=>W<=127。
WHEN033=>W<=123。
WHEN034=>W<=119。
WHEN035=>W<=115。
WHEN036=>W<=111。
WHEN037=>W<=107。
WHEN038=>W<=103。
WHEN039=>W<=99。
WHEN040=>W<=95。
WHEN041=>W<=91。
WHEN042=>W<=87。
WHEN043=>W<=83。
WHEN044=>W<=79。
WHEN045=>W<=75。
WHEN046=>W<=71。
WHEN047=>W<=67。
WHEN048=>W<=63。
WHEN049=>W<=59。
WHEN050=>W<=55。
WHEN051=>W<=51。
WHEN052=>W<=47。
WHEN053=>W<=43。
WHEN054=>W<=39。
WHEN055=>W<=35。
WHEN056=>W<=31。
WHEN057=>W<=27。
WHEN058=>W<=23。
WHEN059=>W<=19。
WHEN060=>W<=15。
WHEN061=>W<=11。
WHEN062=>W<=7。
WHEN063=>W<=3。
WHEN064=>W<=3。
WHEN065=>W<=7。
WHEN066=>W<=11。
WHEN067=>W<=15。
WHEN068=>W<=19。
WHEN069=>W<=23。
WHEN070=>W<=27。
WHEN071=>W<=31。
WHEN072=>W<=35。
WHEN073=>W<=39。
WHEN074=>W<=43。
WHEN075=>W<=47。
WHEN076=>W<=51。
WHEN077=>W<=55。
WHEN078=>W<=59。
WHEN079=>W<=63。
WHEN080=>W<=67。
WHEN081=>W<=71。
WHEN082=>W<=75。
WHEN083=>W<=79。
WHEN084=>W<=83。
WHEN085=>W<=87。
WHEN086=>W<=91。
WHEN087=>W<=95。
WHEN088=>W<=99。
WHEN089=>W<=103。
WHEN090=>W<=107。
WHEN091=>W<=111。
WHEN092=>W<=115。
WHEN093=>W<=119。
WHEN094=>W<=123。
WHEN095=>W<=127。
WHEN096=>W<=131。
WHEN097=>W<=135。
WHEN098=>W<=139。
WHEN099=>W<=143。
WHEN100=>W<=147。
WHEN101=>W<=151。
WHEN102=>W<=155。
WHEN103=>W<=159。
WHEN104=>W<=163。
WHEN105=>W<=167。
WHEN106=>W<=171。
WHEN107=>W<=175。
WHEN108=>W<=179。
WHEN109=>W<=183。
WHEN110=>W<=187。
WHEN111=>W<=191。
WHEN112=>W<=195。
WHEN113=>W<=199。
WHEN114=>W<=203。
WHEN115=>W<=207。
WHEN116=>W<=211。
WHEN117=>W<=215。
WHEN118=>W<=219。
WHEN119=>W<=223