EDA课程报告正弦波信号发生器的设计Word格式文档下载.docx
《EDA课程报告正弦波信号发生器的设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《EDA课程报告正弦波信号发生器的设计Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
,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:
numwords_a:
operation_mode:
outdata_reg_a:
address_aclr_a:
outdata_aclr_a:
width_byteena_a:
init_file:
lpm_hint:
lpm_type:
STRING
PORT(--altsyncram元件接口声明
clock0:
address_a:
q_a:
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=>
--无输出锁存异步清0
width_byteena_a=>
1,--byteena_a输出口宽度1
init_file=>
--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:
--地址锁存时钟
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文件的头部说明,导致用于例化的波形数据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;
entityabcis
port(
clk:
instd_logic;
dout:
outintegerrange255downto0;
a:
instd_logic);
architectureoneofabcis
signalQ:
integerrange127downto0;
signalW:
integerrange255downto0;
signalD:
signalC:
integerrange63downto0;
begin
process(clk)
ifclk'
eventandclk='
thenQ<
=Q+1;
C<
=C+1;
ifQ<
127THENQ<
ELSEQ<
=0;
ifC<
63THENC<
ELSEC<
ENDIF;
ENDPROCESS;
PROCESS(C,Q)
CASECIS
WHEN000=>
D<
=255;
WHEN001=>
=254;
WHEN002=>
=252;
WHEN003=>
=249;
WHEN004=>
=245;
WHEN005=>
=239;
WHEN006=>
=233;
WHEN007=>
=225;
WHEN008=>
=217;
WHEN009=>
=207;
WHEN010=>
=197;
WHEN011=>
=186;
WHEN012=>
=174;
WHEN013=>
=162;
WHEN014=>
=150;
WHEN015=>
=137;
WHEN016=>
=124;
WHEN017=>
=112;
WHEN018=>
=99;
WHEN019=>
=87;
WHEN020=>
=75;
WHEN021=>
=64;
WHEN022=>
=53;
WHEN023=>
=43;
WHEN024=>
=34;
WHEN025=>
=26;
WHEN026=>
=19;
WHEN027=>
=13;
WHEN028=>
=8;
WHEN029=>
=4;
WHEN030=>
=1;
WHEN031=>
WHEN032=>
WHEN033=>
WHEN034=>
WHEN035=>
WHEN036=>
WHEN037=>
WHEN038=>
WHEN039=>
WHEN040=>
WHEN041=>
WHEN042=>
WHEN043=>
WHEN044=>
WHEN045=>
WHEN046=>
WHEN047=>
WHEN048=>
WHEN049=>
WHEN050=>
WHEN051=>
WHEN052=>
WHEN053=>
WHEN054=>
WHEN055=>
WHEN056=>
WHEN057=>
WHEN058=>
WHEN059=>
WHEN060=>
WHEN061=>
WHEN062=>
WHEN063=>
ENDCASE;
CASEQIS
W<
=251;
=247;
=243;
=235;
=231;
=227;
=223;
=219;
=215;
=211;
=203;
=199;
=195;
=191;
=187;
=183;
=179;
=175;
=171;
=167;
=163;
=159;
=155;
=151;
=147;
=143;
=139;
=135;
=131;
=127;
=123;
=119;
=115;
=111;
=107;
=103;
=95;
=91;
=83;
=79;
=71;
=67;
=63;
=59;
=55;
=51;
=47;
=39;
=35;
=31;
=27;
=23;
=15;
=11;
=7;
=3;
WHEN064=>
WHEN065=>
WHEN066=>
WHEN067=>
WHEN068=>
WHEN069=>
WHEN070=>
WHEN071=>
WHEN072=>
WHEN073=>
WHEN074=>
WHEN075=>
WHEN076=>
WHEN077=>
WHEN078=>
WHEN079=>
WHEN080=>
WHEN081=>
WHEN082=>
WHEN083=>
WHEN084=>
WHEN085=>
WHEN086=>
WHEN087=>
WHEN088=>
WHEN089=>
WHEN090=>
WHEN091=>
WHEN092=>
WHEN093=>
WHEN094=>
WHEN095=>
WHEN096=>
WHEN097=>
WHEN098=>
WHEN099=>
WHEN100=>
WHEN101=>
WHEN102=>
WHEN103=>
WHEN104=>
WHEN105=>
WHEN106=>
WHEN107=>
WHEN108=>
WHEN109=>
WHEN110=>
WHEN111=>
WHEN112=>
WHEN113=>
WHEN114=>
WHEN115=>
WHEN116=>
WHEN117=>
W