地大EDA第三次作业.docx
《地大EDA第三次作业.docx》由会员分享,可在线阅读,更多相关《地大EDA第三次作业.docx(27页珍藏版)》请在冰点文库上搜索。
地大EDA第三次作业
第七章宏功能模块与IP应用
7-5
将例7-4的顶层程序和例7-3的ROM程序合并成为一个程序,要求用例化语句直接调用LPM模块altsyncram,编译验证,使之功能与原设计相同。
VHDL文件:
LIBRARYIEEE;
LIBRARYaltera_mf;
USEaltera_mf.altera_mf_components.all;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSINGTIS
PORT(CLK:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
END;
ARCHITECTUREDACCOFSINGTIS
COMPONENTaltsyncram
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(clock0:
INSTD_LOGIC;
address_a:
INSTD_LOGIC_VECTOR(5DOWNTO0);
q_a:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENT;
SIGNALQ1:
STD_LOGIC_VECTOR(5DOWNTO0);
BEGIN
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THENQ1<=Q1+1;
ENDIF;
ENDPROCESS;
altsyncram_component:
altsyncram
GENERICMAP(intended_device_family=>"Cyclone",
width_a=>8,
widthad_a=>6,
numwords_a=>64,
operation_mode=>"ROM",
outdata_reg_a=>"UNREGISTERED",
address_aclr_a=>"NONE",
outdata_aclr_a=>"NONE",
width_byteena_a=>1,
init_file=>"./dataHEX/SDATA.hex",
lpm_hint=>"ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=NONE",
lpm_type=>"altsyncram")
PORTMAP(clock0=>clk,address_a=>Q1,q_a=>DOUT);
END;
RTL文件:
实验与设计
7-2
(1)8位十六进制频率计设计
VHDL描述:
LIBRARYIEEE;--测频控制
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYftctrlIS
PORT(CLKK:
INSTD_LOGIC;--1Hz
CNT_EN,RST_CNT,LOAD:
OUTSTD_LOGIC);
ENDftctrl;
ARCHITECTUREbehavOFftctrlIS
SIGNALDIV2CLK:
STD_LOGIC;
BEGIN
PROCESS(CLKK)
BEGIN
IFCLKK'EVENTANDCLKK='1'THENDIV2CLK<=NOTDIV2CLK;
ENDIF;
ENDPROCESS;
PROCESS(CLKK,DIV2CLK)
BEGIN
IFCLKK='0'ANDDiv2CLK='0'THENRST_CNT<='1';
ELSERST_CNT<='0';ENDIF;
ENDPROCESS;
LOAD<=NOTDIV2CLK;CNT_EN<=DIV2CLK;
ENDbehav;
LIBRARYIEEE;--32位锁存器
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYREG32BIS
PORT(LK:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(31DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDREG32B;
ARCHITECTUREbehavOFREG32BIS
BEGIN
PROCESS(LK,DIN)
BEGIN
IFLK'EVENTANDLK='1'THENDOUT<=DIN;--时钟到来时,锁存输入数据
ENDIF;
ENDPROCESS;
ENDbehav;
LIBRARYIEEE;--32位计数器
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcounter32bIS
PORT(ENABL,CLR,FIN:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDcounter32b;
ARCHITECTUREbehavOFcounter32bIS
SIGNALCQI:
STD_LOGIC_VECTOR(31DOWNTO0);
BEGIN
PROCESS(ENABL,CLR,FIN)
BEGIN
IFCLR='1'THENCQI<=(OTHERS=>'0');--清零
ELSIFFIN'EVENTANDFIN='1'THEN
IFENABL='1'THENCQI<=CQI+1;
ENDIF;
ENDIF;
ENDPROCESS;
DOUT<=CQI;
ENDbehav;
libraryieee;
useieee.std_logic_1164.all;
entitypreqtestis
port(clk1hz:
instd_logic;
fsin:
instd_logic;
dout:
outstd_logic_vector(31downto0));
endpreqtest;
architecturestrucofpreqtestis
componentftctrl
port(clkk:
instd_logic;
cnt_en:
outstd_logic;
rst_cnt:
outstd_logic;
load:
outstd_logic);
endcomponent;
componentcounter32b
port(fin:
instd_logic;
clr:
instd_logic;
enabl:
instd_logic;
dout:
outstd_logic_vector(31downto0));
endcomponent;
componentreg32b
port(lk:
instd_logic;
din:
instd_logic_vector(31downto0);
dout:
outstd_logic_vector(31downto0));
endcomponent;
signaltsten1:
std_logic;
signalclr_cnt1:
std_logic;
signalload1:
std_logic;
signaldt01:
std_logic_vector(31downto0);
signalcarry_out1:
std_logic_vector(6downto0);
begin
u1:
ftctrlportmap(clkk=>clk1hz,cnt_en=>tsten1,
rst_cnt=>clr_cnt1,load=>load1);
u2:
reg32bportmap(lk=>load1,din=>dt01,dout=>dout);
u3:
counter32bportmap(fin=>fsin,clr=>clr_cnt1,
enabl=>tsten1,dout=>dt01);
endstruc;
RTL文件:
波形仿真:
第八章状态机设计
8-5在不改变原代码功能的条件下用两种方法改写例8-2,使其输出的控制信号(ALE、START、OE、LOCK)没有毛刺。
方法1:
将输出信号锁存后输出;方法2:
使用状态码直接输出型状态机,并比较这三种状态机的特点。
方法1:
VHDL文件:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYADCINTIS
PORT(D:
INSTD_LOGIC_VECTOR(7DOWNTO0);--来自0809转换好的8位数据
CLK:
INSTD_LOGIC;--状态机工作时钟
EOC:
INSTD_LOGIC;--转换状态指示,低电平表示正在转换
ALE:
OUTSTD_LOGIC;--8个模拟信号通道地址锁存信号
START:
OUTSTD_LOGIC;--转换开始信号
OE:
OUTSTD_LOGIC;--数据输出三态控制信号
ADDA:
OUTSTD_LOGIC;--信号通道最低位控制信号
LOCK0:
OUTSTD_LOGIC;--观察数据锁存时钟
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));--8位数据输出
ENDADCINT;
ARCHITECTUREbehavOFADCINTIS
TYPEstatesIS(st0,st1,St2,st3,st4);--定义各状态子类型
SIGNALcurrent_state,next_state:
states:
=st0;
SIGNALREGL:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALLOCK:
STD_LOGIC;--转换后数据输出锁存时钟信号
SIGNALALE0:
STD_LOGIC;--8个模拟信号通道地址锁存信号
SIGNALSTART0:
STD_LOGIC;--转换开始信号
SIGNALOE0:
STD_LOGIC;--数据输出三态控制信号
BEGIN
ADDA<='1';--当ADDA<='0',模拟信号进入通道IN0;当ADDA<='1',则进入通道INI
Q<=REGL;--LOCK0<=LOCK;
COM:
PROCESS(current_state,EOC,CLK)BEGIN--规定各状态转换方式
CASEcurrent_stateIS
WHENst0=>ALE0<='0';START0<='0';LOCK<='0';OE0<='0';
next_state<=st1;--0809初始化
WHENst1=>ALE0<='1';START0<='1';LOCK<='0';OE0<='0';
next_state<=st2;--启动采样
WHENst2=>ALE0<='0';START0<='0';LOCK<='0';OE0<='0';
IF(EOC='1')THENnext_state<=st3;--EOC=1表明转换结束
ELSEnext_state<=st2;ENDIF;--转换未结束,继续等待
WHENst3=>ALE0<='0';START0<='0';LOCK<='0';OE0<='1';
next_state<=st4;--开启OE,输出转换好的数据
WHENst4=>ALE0<='0';START0<='0';LOCK<='1';OE0<='1';next_state<=st0;
WHENOTHERS=>next_state<=st0;
ENDCASE;
IFCLK'EVENTANDCLK='1'THEN
ALE<=ALE0;START<=START0;LOCK0<=LOCK;OE<=OE0;--方法1:
信号锁存后输出
ENDIF;
ENDPROCESSCOM;
REG:
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THENcurrent_state<=next_state;ENDIF;
ENDPROCESSREG;--由信号current_state将当前状态值带出此进程:
REG
LATCH1:
PROCESS(LOCK)--此进程中,在LOCK的上升沿,将转换好的数据锁入
BEGIN
IFLOCK='1'ANDLOCK'EVENTTHENREGL<=D;ENDIF;
ENDPROCESSLATCH1;
ENDbehav;
RTL文件:
方法2:
VHDL程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYAD0809IS
PORT(D:
INSTD_LOGIC_VECTOR(7DOWNTO0);
CLK,EOC:
INSTD_LOGIC;
ALE,START,OE,ADDA:
OUTSTD_LOGIC;
c_state:
OUTSTD_LOGIC_VECTOR(4DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDAD0809;
ARCHITECTUREbehavOFAD0809IS
SIGNALcurrent_state,next_state:
STD_LOGIC_VECTOR(4DOWNTO0);
CONSTANTst0:
STD_LOGIC_VECTOR(4DOWNTO0):
="00000";
CONSTANTst1:
STD_LOGIC_VECTOR(4DOWNTO0):
="11000";
CONSTANTst2:
STD_LOGIC_VECTOR(4DOWNTO0):
="00001";
CONSTANTst3:
STD_LOGIC_VECTOR(4DOWNTO0):
="00100";
CONSTANTst4:
STD_LOGIC_VECTOR(4DOWNTO0):
="00110";
SIGNALREGL:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALLOCK:
STD_LOGIC;
BEGIN
ADDA<='1';Q<=REGL;START<=current_state(4);ALE<=current_state(3);
OE<=current_state
(2);LOCK<=current_state
(1);c_state<=current_state;
COM:
PROCESS(current_state,EOC)BEGIN--规定各状态转换方式
CASEcurrent_stateIS
WHENst0=>next_state<=st1;--0809初始化
WHENst1=>next_state<=st2;--启动采样
WHENst2=>IF(EOC='1')THENnext_state<=st3;--EOC=1表明转换结束
ELSEnext_state<=st2;--转换未结束,继续等待
ENDIF;
WHENst3=>next_state<=st4;--开启OE,输出转换好的数据
WHENst4=>next_state<=st0;
WHENOTHERS=>next_state<=st0;
ENDCASE;
ENDPROCESSCOM;
REG:
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THENcurrent_state<=next_state;
ENDIF;
ENDPROCESSREG;--由信号current_state将当前状态值带出此进程:
REG
LATCH1:
PROCESS(LOCK)--此进程中,在LOCK的上升沿,将转换好的数据锁入
BEGIN
IFLOCK='1'ANDLOCK'EVENTTHENREGL<=D;
ENDIF;
ENDPROCESSLATCH1;
ENDbehav;
RTL:
对比分析:
方法2使用的状态机占用资源最少。
实验与设计
8-3数据采集电路和简易存储示波器
(3)实验内容1:
设ADDA=‘1’;即模拟信号来自0809的IN1口(可用实验系统的电位器产生被测模拟信号)完成此项设计,给出仿真波形及其分析,将设计结果在Cyclone中硬件实现,用QuartusⅡ在系统RAM/ROM数据编辑器了解锁入RAM中的数据。
元件ADCINT的VHDL描述:
libraryieee;
useieee.std_logic_1164.all;
entityADCINTis
port(D:
instd_logic_vector(7downto0);
CLK:
instd_logic;
EOC:
instd_logic;
ALE:
outstd_logic;
START:
outstd_logic;
OE:
outstd_logic;
ADDA:
outstd_logic;
LOCK0:
outstd_logic;
Q:
outstd_logic_vector(7downto0));
endADCINT;
ARCHITECTUREbehavOFADCINTIS
TYPEstatesIS(st0,st1,st2,st3,st4);
SIGNALcurrent_state,next_state:
states:
=st0;
SIGNALREGL:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALLOCK:
STD_LOGIC;
BEGIN
ADDA<='1';--当ADDA<='0',模拟信号进入通道IN0;当ADDA<='1',则进入通道IN1
Q<=REGL;LOCK0<=LOCK;
COM:
PROCESS(current_state,EOC)BEGIN--规定各状态转换方式
CASEcurrent_stateIS
WHENst0=>ALE<='0';START<='0';LOCK<='0';OE<='0';next_state<=st1;--0809初始化
WHENst1=>ALE<='1';START<='1';LOCK<='0';OE<='0';next_state<=st2;--启动采样
WHENst2=>ALE<='0';START<='0';LOCK<='0';OE<='0';
IF(EOC='1')THENnext_state<=st3;--EOC=1表明转换结束
ELSEnext_state<=st2;ENDIF;--转换未结束,继续等待
WHENst3=>ALE<='0';START<='0';LOCK<='0';OE<='1';next_state<=st4;--开启OE,输出转换好的数据
WHENst4=>ALE<='0';START<='0';LOCK<='1';OE<='1';next_state<=st0;
WHENOTHERS=>next_state<=st0;
ENDCASE;
ENDPROCESSCOM;
REG:
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THENcurrent_state<=next_state;ENDIF;
ENDPROCESSREG;--由信号current_state将当前状态值带出此进程:
REG
LATCH1:
PROCESS(LOCK)--此进程中,在LOCK的上升沿,将转换好的数据锁入
BEGIN
IFLOCK='1'ANDLOCK'EVENTTHENREGL<=D;ENDIF;
ENDPROCESSLATCH1;
ENDbehav;
CNT10B的VHDL描述:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT10BIS
PORT(LOCK0,CLR:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;
WE:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(8DOWNTO0);
CLKOUT:
OUTSTD_LOGIC);
ENDCNT10B;
ARCHITECTUREbehavOFCNT10BIS
SIGNALCQI:
STD_LOGIC_VECTOR(8DOWNTO0);
SIGNALCLK0:
STD_LOGIC;
BEGIN
CLK0<=LOCK0WHENWE='1'ELSE
CLK;
PROCESS(CLK0,CLR,CQI)
BEGIN
IFCLR='1'THENCQI<="000000000";
ELSIFCLK0'EVENTANDCLK0='1'THENCQI<=CQI+1;ENDIF;
ENDPROCESS;
DOUT<=CQI;CLKOUT<=CLK0;
ENDbehav;
ADC0809采样电路系统的原理图及引脚指定图:
波形仿真:
第九章VHDL结构与要素
9-15
用两种方法设计8位比较器,比较器的输入是两个待比较的8位数A=[A7..A0]和B=[B7..B0],输出是D、E、F。
当