版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章常用电路的VHDL描述组合电路设计时序电路设计存储器设计本章内容:6.1组合逻辑电路VHDL描述组合逻辑电路的功能可以用真值表、表达式、电路图等方式描述。基于这3种方式可以分别采用行为式、数据流式和结构式的VHDL描述风格及层次。常见的组合逻辑电路:基本门电路加法器编码器译码器选择器分配器等组合电路的VHDL描述方法:
1、真值表:行为描述(IF:有优先级;CASE),例如优先编码器例7-7、译码器例7-8
2、表达式:数据流(赋值),例如比较器例7-9、加法器例5-26
3、逻辑电路:结构式(元件例化),例如等值比较器例4-5、例7-3。
4、三态门及双向电路设计:例7-15、例7-176.1组合逻辑电路VHDL描述6.1组合逻辑电路VHDL描述行为式1:【例6-7】优先编码器74LS148程序设计。真值表符号libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityencoder_74ls148isport(d:instd_logic_vector(7downto0); st:instd_logic; y:outstd_logic_vector(2downto0); yex:outstd_logic; ys:outstd_logic);endencoder_74ls148;6.1组合逻辑电路VHDL描述程序设计—实体architectureBehavioralofencoder_74ls148isbeginprocess(st,d)beginifst='1'then
y<="111"; yex<='1';s<='1';
elsifd="11111111"then y<="111"; yex<='1';ys<='0';elsifd(7)='0'then
y<="000"; yex<='0';ys<='1';
…
…elsifd(0)='0'then y<="111"; yex<='0';ys<='1';endif;endprocess;endBehavioral;6.1组合逻辑电路VHDL描述程序设计—结构体行为式2:【例6-8】译码器74LS138程序设计。6.1组合逻辑电路VHDL描述真值表符号libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitydecoderisport(sta:instd_logic; stb:instd_logic; stc:instd_logic; a:instd_logic_vector(2downto0); y:outstd_logic_vector(7downto0) );enddecoder;6.1组合逻辑电路VHDL描述程序设计—实体architectureBehavioralofdecoderisbeginprocess(sta,stb,stc,a)begin if(sta='1'andstb='0'andstc='0')then caseaiswhen"000"=>y<="11111110";
…
…
when"111"=>y<="01111111";
whenothers=>y<="11111111"; endcase; else y<="11111111"; endif;endprocess;endBehavioral;6.1组合逻辑电路VHDL描述程序设计—结构体libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;
entitycompisport(a:instd_logic_vector(3downto0); b:instd_logic_vector(3downto0);a_greater_b:outstd_logic;a_less_b:outstd_logic;a_equal_b:outstd_logic);endcomp;6.1组合逻辑电路VHDL描述行为式3:【例6-9】两个4位二进制数比较器程序设计。architectureBehavioral1ofcompisbeginprocess(a,b) begin ifa>bthena_greater_b<='1';a_less_b<='0';a_equal_b<='0'; elsifa<bthen a_greater_b<='0';a_less_b<='1';a_equal_b<='0'; else a_greater_b<='0';a_less_b<='0'; a_equal_b<='1'; endif;endprocess;endBehavioral1;6.1组合逻辑电路VHDL描述architectureBehavioral2ofcompisbegina_greater_b<='1'whena>belse‘0’; a_less_b<='1'whena<belse‘0’; a_equal_b<='1'whena=belse‘0’;endBehavioral2;6.1组合逻辑电路VHDL描述6.1组合逻辑电路VHDL描述数据流式:例5-26全加器真值表表达式libraryieee;useieee.std_logic_1164.all;entityadder1isport(a,b,ci:instd_logic;co,s:outstd_logic);endadder1;6.1组合逻辑电路VHDL描述程序设计—实体6.1组合逻辑电路VHDL描述architecturebehavioralofadder1ISbeginco<=(aandb)or(aandci)or(bandci);s<=axorbxorci;endbehavioral;程序设计—结构体结构化:例4-5(4位等值比较器)、
【例6-3】4输入与逻辑设计6.1组合逻辑电路VHDL描述表达式:结构图:6.1组合逻辑电路VHDL描述两输入与逻辑设计【例6-1】:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityand_gate_2isport(a:instd_logic; b:instd_logic;f:outstd_logic);endand_gate_2;architectureBehavioralofand_gate_2isbeginf<=aandb;endBehavioral;6.1组合逻辑电路VHDL描述4输入与逻辑程序设计:architectureBehavioralofand_gate_4is
signaltemp1,temp2:std_logic;componentand_gate_2isport(a:instd_logic; b:instd_logic; f:outstd_logic);endcomponent;begin
U1:and_gate_2portmap(a=>a,b=>b,f=>temp1);
U2:and_gate_2portmap(a=>c,b=>d,f=>temp2);
U3:and_gate_2portmap(temp1,temp2,f);
endBehavioral;
6.1组合逻辑电路VHDL描述libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitytri_gateisport(a:instd_logic; b:instd_logic; en:instd_logic; f:outstd_logic);endtri_gate;6.1.7三态门电路描述例6-13三态与非门6.1.7三态门电路描述architectureBehavioraloftri_gateisbegin process(a,b,en) begin ifen='1'then f<=anandb; else
f<='Z'; endif; endprocess;endBehavioral;6.1.7三态门电路描述单向总线驱动器在微型计算机的总线驱动中经常要用单向总线缓冲器,它通常由多个三态门组成,用来驱动地址总线和控制总线。一个8位的单向总线缓冲器如下图所示。单向总线驱动器程序设计—实体LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYTRI_BUF8ISPORT(DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);
EN:INSTD_LOGIC;
DOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYTRI_BUF8;单向总线驱动器ARCHITECTUREARTOFTRI_BUF8ISBEGINPROCESS(EN,DIN)ISBEGINIF(EN=‘1’)THENDOUT<=DIN;
ELSE
DOUT<="ZZZZZZZZ";
ENDIF;
ENDPROCESS;ENDARCHITECTUREART;程序设计—结构体多通道三态总线电路设计【例】8位4通道三态总线结构图:多通道三态总线电路设计libraryieee;useieee.std_logic_1164.all;entitytriisport(ctl:instd_logic_vector(1downto0);datain1,datain2,datain3,datain4:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endtri;architecturebody_trioftriisbegin
q<=datain1whenctl="00"else(others=>'Z');q<=datain2whenctl="01"else(others=>'Z');q<=datain3whenctl="10"else(others=>'Z');q<=datain4whenctl="11"else(others=>'Z');endbody_tri;程序设计:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBIDIRISPORT(A,B:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);DIR:INSTD_LOGIC);ENDENTITYBIDIR;6.1.8双向端口ABDIR结构图:双进程描述:【例】6-14程序设计—实体ARCHITECTUREARTOFBIDIRISSIGNALAOUT,BOUT:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(A,DIR)IS --A为输入BEGINIF(DIR=‘1’)THENBOUT<=A;ELSEBOUT<="ZZZZZZZZ";
ENDIF;B<=BOUT; --B为输出ENDPROCESS;6.1.8双向端口程序设计—结构体ABDIRPROCESS(B,DIR)IS --B为输入BEGINIF(DIR=‘0’)THENAOUT<=B;ELSEAOUT<="ZZZZZZZZ";ENDIF;A<=AOUT; --A为输出ENDPROCESS;ENDARCHITECTUREART;6.1.8双向端口进程B设计:ABDIRARCHITECTUREARTOFBIDIRISBEGINProcess(A,B,DIR)beginif(DIR='0')thenA<=B;
B<="ZZZZZZZZ";ElseB<=A;
A<="ZZZZZZZZ";endif;endprocess;ENDARCHITECTUREART;6.1.8双向端口单进程描述:【例】6-15ABDIR时序电路的VHDL描述方法
(1)PROCESS+IF:
1、PROCESS
敏感表中放异步控制信号、时钟信号;
多进程对应异步结构。
2、IF:
不完整if形成触发器结构;
条件判断顺序对应控制信号的优先级。
(2)有限状态机描述控制部件6.2时序逻辑电路设计常用时序部件
6.2时序逻辑电路设计触发器;计数器;序列信号发生器;序列信号检测器;状态控制器
6.2.1触发器时钟
锁存器、寄存器同步、异步控制复位、置位信号边沿提取应用
...PROCESS(CLK,D)BEGINIFCLK='1'THEN--电平触发型寄存器
Q<=D;ENDIF;ENDPROCESS;锁存器、寄存器
锁存器锁存器、寄存器
D触发器:例6-16architectureBehavioralofd_cfqisbeginprocess(clk,d)beginifclk'eventandclk='1'then--时钟上升沿
q<=d;endif;endprocess;endBehavioral;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYASYNDCFQISPORT(CLK,D,PRESET,CLR:INSTD_LOGIC;
Q:OUTSTD_LOGIC);ENDENTITYASYNDCFQ;同步、异步控制
异步复位、置位控制D触发器ARCHITECTUREARTOFASYNDCFQISBEGINPROCESS(CLK,PRESET,CLR)ISBEGINIF(PRESET=‘0')THEN--置位
Q<='1';
ELSIF(CLR=‘0')THEN--复位
Q<='0';
ELSIF(CLK'EVENTANDCLK=‘1’)THENQ<=D;
ENDIF;ENDPROCESS;ENDARCHITECTUREART;异步控制
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSYNDCFQISPORT(D,CLK,RESET:INSTD_LOGIC;
Q:OUTSTD_LOGIC);ENDENTITYSYNDCFQ;同步、异步控制
同步复位控制D触发器ARCHITECTUREARTOFSYNDCFQISBEGINPROCESS(CLK)ISBEGINIF(CLK'EVENTANDCLK=‘1’)THENIF(RESET=‘0’)THEN Q<=‘0’;--时钟边沿到来且有复位信号,触发器被复位
ELSEQ<=D;
ENDIF;ENDIF;ENDPROCESS;ENDARCHITECTUREART;同步控制
【例6-19】设计信号上升沿和下降沿提取电路。libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitycnt4isport(rst:instd_logic;clk:instd_logic;d:instd_logic;d_up:outstd_logic;d_down:outstd_logic );endcnt4;信号边沿提取
architectureBehavioralofcnt4issignald1,d2:std_logic;beginprocess(clk,rst,d)beginifrst='0'then d1<='0';d2<='0';elsifclk'eventandclk='1'then
d1<=d;d2<=d1;endif;endprocess;
信号边沿提取
d_up<=d1and(notd2);d_down<=(notd1)andd2;endBehavioral;信号边沿提取
信号边沿提取
计数器是在数字系统中使用最多的时序电路,它不仅能用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲和脉冲序列以及进行数字运算等。6.2.2计数器二进制、非二进制计数器同步、异步计数器序列信号发生器应用libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;Entitycounter4isport(clk:instd_logic;cnt:outstd_logic_vector(3downto0) );endcounter4;二进制计数器【例6-20】4位二进制加法计数器的设计。architectureBehavioralofcounter4issignalcnt1:std_logic_vector(3downto0):="0000";beginprocess(clk)beginifclk'eventandclk='1'then
cnt1<=cnt1+1;endif;endprocess;cnt<=cnt1;endBehavioral;二进制计数器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycounter12isport(rst:instd_logic;--复位输入信号
en:instd_logic;--计数使能信号
clk:instd_logic;--输入时钟信号
q:outstd_logic--十二分频输出信号
);endcounter12;非二进制计数器【例6-21】12分频器architectureBehavioralofcounter12is
signalcnt1:std_logic_vector(3downto0):="0000";beginprocess(rst,clk)beginifrst='0'thencnt1<=(others=>'0');elsifclk'eventandclk='1'thenifen=’1’then
ifcnt1=11thencnt1<=(others=>'0'); else cnt1<=cnt1+1; endif;endif;endif;endprocess;
q<='1'whencnt1=11else'0';endBehavioral;非二进制计数器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycnt10is port(rst:instd_logic; clk:instd_logic; cnt:bufferstd_logic_vector(3downto0) );endcnt10;BCD十进制计数器例4-26:模值为10的计数器architectureBehavioralofcnt10isbeginprocess(clk,rst)beginifrst='0'then cnt<="0000"; elsifclk'eventandclk='1'then ifcnt=9then
cnt<="0000"; else
cnt<=cnt+1;
endif; endif;endprocess;endBehavioral;BCD十进制计数器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNTM60ISPORT(CI:INSTD_LOGIC;--计数控制
NRESET:INSTD_LOGIC;--异步复位控制
LOAD:INSTD_LOGIC;--置数控制
D:INSTD_LOGIC_VECTOR(7DOWNTO0);
CLK:INSTD_LOGIC;
CO:OUTSTD_LOGIC; --进位输出
QH,QL:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));
--输出高4位、输出低4位
ENDENTITYCNTM60;BCD六十进制计数器模为60,具有异步复位、同步置数功能的8421BCD码计数器。ARCHITECTUREARTOFCNTM60ISBEGINCO<=‘1’WHEN(QH="0101"ANDQL="1001"ANDCI=‘1’)ELSE'0';
--进位输出的产生PROCESS(CLK,NRESET)ISBEGINIF(NRESET=‘0’)THEN--异步复位
QH<=“0000”;QL<=“0000”;ELSIF(CLK'EVENTANDCLK=‘1’)THEN--同步置数
IF(LOAD=‘1’)THENQH<=D(7DOWNTO4);
QL<=D(3DOWNTO0);
ELSIF(CI=‘1’)THEN --模60的实现BCD六十进制计数器IF(QL=9)THEN--低位计数实现
QL<="0000";
IF(QH=5)THEN--高位计数实现
QH<=“0000”;
ELSE QH<=QH+1;
ENDIF;
ELSEQL<=QL+1;
ENDIF;--ENDIFCIENDIF;--ENDIFLOAD ENDIF;ENDPROCESS;ENDARCHITECTUREART;BCD六十进制计数器多进程同步BCD六十进制计数器CNT1:PROCESS(CLK,NRESET)IS--个位BEGINIF(NRESET=‘0’)THEN--异步复位 QL<=“0000”;ELSIF(CLK'EVENTANDCLK=‘1’)THEN--同步置数IF(LOAD=‘1’)THENQL<=D(3DOWNTO0);ELSIF(CI=‘1’)THENIF(QL=9)THEN--模10计数
QL<=“0000”;
ELSEQL<=QL+1;
ENDIF;ENDIF;ENDPROCESSCNT1;CNT2:PROCESS(CLK,NRESET)IS--十位BEGINIF(NRESET=‘0’)THEN --异步复位 QH<="0000";ELSIF(CLK'EVENTANDCLK=‘1’)THEN--同步置数IF(LOAD=‘1’)THENQH<=D(7DOWNTO4);ELSIF(CI=‘1’)AND(QL=9)THEN IF(QH=5)THEN--模6计数
QH<=“0000”;
ELSEQH<=QH+1;ENDIF;ENDIF;ENDPROCESSCNT2;多进程同步BCD六十进制计数器…SIGNALCLK10:STD_LOGIC;BEGINCNT1:PROCESS(CLK)IS--个位BEGINIF(CLK'EVENTANDCLK=‘1’)THENIF(QL=9)THEN--模10计数
QL<=“0000”;
CKL10<=‘1’;ELSEQL<=QL+1;
CKL10<=‘0’;ENDIF;ENDIF;ENDPROCESSCNT1; 多进程异步BCD六十进制计数器CNT2:PROCESS(CLK10)IS--十位BEGINIF(CLK10'EVENTANDCLK10=‘1’)THEN IF(QH=5)THEN--模6计数
QH<=“0000”;
ELSEQH<=QH+1;ENDIF;ENDIF;ENDPROCESSCNT2;多进程异步BCD六十进制计数器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityseq_genisport(clk:instd_logic;rst:instd_logic;q:outstd_logic );endseq_gen;序列信号发生器【例6-22】利用计数器方式设计产生序列信号“11011001”architectureBehavioralofseq_genissignald:std_logic_vector(2downto0);beginCNT:process(rst,clk)beginifrst='0'then d<="000"; elsifclk'eventandclk='1'then d<=d+1; endif;endprocessCNT;序列信号发生器【例6-23】COM:process(clk,d)begin
ifclk'eventandclk='1'thencasedis when"000"=>q<='1';when"001"=>q<='1'; when"010"=>q<='0'; when"011"=>q<=‘1'; when"100"=>q<=‘1';when"101"=>q<=‘0'; when"110"=>q<='0'; when"111"=>q<='1'; whenothers=>q<='Z'; endcase;
endif;endprocessCOM;endBehavioral;序列信号发生器序列信号发生器单向移位寄存器双向移位寄存器6.2.3移位寄存器【例6-24】4位单向移位寄存器设计单向移位寄存器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityreg4isport(clk:instd_logic;
din:instd_logic;q:outstd_logic_vector(3downto0) );endreg4;单向移位寄存器程序设计—实体architectureBehavioralofreg4issignalqin:std_logic_vector(3downto0);beginprocess(clk,din)beginifclk'eventandclk='1'thenqin<=qin(2downto0)&din;endif;endprocess;q<=qin;endBehavioral;单向移位寄存器程序设计—结构体双向移位寄存器【例6-25】8位双向移位寄存器设计具有同步置数、同步清零、左移、右移功能:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityreg4isport(clk,rst:instd_logic;din_left:instd_logic;din_right:instd_logic;sel:instd_logic_vector(1downto0);din:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endreg4;双向移位寄存器程序设计—实体architectureBehavioralofreg4issignalqin:std_logic_vector(7downto0);beginprocess(clk,sel)beginifclk'eventandclk='1'then ifrst='0'thenqin<=(others=>'0'); elsifsel="11"then qin<=din; elsifsel="01"then
qin<=qin(6downto0)&din_left;
elsifsel="10"then
qin<=din_right&qin(7downto1);endif; endif;endprocess;
q<=qin;endBehavioral;双向移位寄存器程序设计—结构体6.2.4状态机设计状态机结构状态机信号:
输入、输出;现态、次态;时钟、复位。7.2.4状态机状态机操作(1)状态机内部状态转换(次态指定和时钟驱动转移)。状态机的下一状态由状态译码器根据当前状态和输入条件决定。(2)产生输出信号序列。输出信号由输出译码器根据当前状态和输入条件决定。在产生输出的过程中,由是否使用输入信号可以确定状态机的类型。两种典型的状态机是摩尔(MOORE)状态机和米立(MEALY)状态机。状态机设计方法:双进程描述7.2.4状态机状态信号定义方法1:使用枚举型数据类型来指定现态、次态的类型;
Typestatesis(s0,s1,s2,s3,s4,s5,s6,s7);
signalcurrent_sta,next_sta:states;
方法2:直接对状态进行编码,定义状态常量;signalcurrent_sta,next_sta:std_logic_vector(2downto0);
constants0:std_logic_vector(2downto0):=“000”;
…constants7:std_logic_vector(2downto0):=“111”;7.2.4状态机应用一:序列信号发生器【例6-26】使用状态机方式设计序列信号发生器,输出“11000101···”序列。7.2.4状态机S0S1S2S3/1/1/0S7S6S5S4/0/1/0/输出/0/1libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;Entitystate_seqisport(clk:instd_logic;rst:instd_logic;q:outstd_logic );endstate_seq;序列信号发生器程序设计—实体architectureBehavioralofstate_seqistypestateis(s0,s1,s2,s3,s4,s5,s6,s7);--定义状态信号
signalpresent_state,next_state:state;beginREG:process(rst,clk)--时序进程beginifrst='0'then present_state<=s0;elsifclk'eventandclk='1'then present_state<=next_state;endif;endprocessREG;序列信号发生器程序设计—结构体COM:process(present_state)--组合进程begincasepresent_stateis whens0=>q<='1';next_state<=s1; whens1=>q<='1';next_state<=s2; whens2=>q<='0';next_state<=s3; whens3=>q<='0';next_state<=s4; whens4=>q<='0';next_state<=s5; whens5=>q<='1';next_state<=s6; whens6=>q<='0';next_state<=s7; whens7=>q<='1';next_state<=s0; whenothers=>q<='0';next_state<=s0;endcase;endprocessCOM;endBehavioral;序列信号发生器architectureBehavioralofstate_seqistypestateis(s0,s1,s2,s3,s4,s5,s6,s7);--定义状态信号
signalpresent_state:state;beginREG:process(rst,clk)--时序进程beginifrst='0'then present_state<=s0;elsifclk'eventandclk='1'then
序列信号发生器(单进程)程序设计—结构体casepresent_stateis whens0=>q<='1';present_state<=s1; whens1=>q<='1';present_state<=s2; whens2=>q<='0';present_state<=s3; whens3=>q<='0';present_state<=s4; whens4=>q<='0';present_state<=s5; whens5=>q<='1';present_state<=s6; whens6=>q<='0';present_state<=s7; whens7=>q<='1';present_state<=s0; whenothers=>q<='0';present_state<=s0;endcase;endif;endprocessREG;endBehavioral;序列信号发生器(单进程)应用二:序列检测器【例6-27】使用状态机方式设计“11000101···”序列检测器。7.2.4状态机S0S1S2S31/0S7S6S5S4输入/输出0/01/11/00/00/00/01/0libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityseq_detectisport(clk:instd_logic;rst:instd_logic;din:instd_logic;q:outstd_logic );endseq_detect;序列检测器程序设计—实体architectureBehavioralofseq_detectistypestateis(s0,s1,s2,s3,s4,s5,s6,s7);signalcurrent_state,next_state:state;beginREG:process(clk,rst)beginifrst='0'then current_state<=s0;elsifclk'eventandclk='1'then current_state<=next_state;endif;endprocessREG;序列检测器程序设计—结构体process(current_state,din)begincasecurrent_stateis whens0=>ifdin='1'thennext_state<=s1; else next_state<=s0; endif; q<='0';……whens7=>ifdin='1'thenq<=‘1'; else q<='0'; endif;
next_state<=s0;endcase;endprocess;endBehavioral;序列检测器6.3存储器设计ROMRAM6.3.1ROMROM一般用来存储固定值参数,输入信号有时钟、地址、使能,输出信号为存储数据。以一个深度为16、数据宽度为8位的ROM存储器为例介绍ROM存储器的设计。7.3.1ROM【例6-28】ROM存储器设计libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityrom_16_8isport(clk:instd_logic;en:instd_logic; addr:instd_logic_vector(3downto0); data:outstd_logic_vector(7downto0));endrom_16_8;7.3.1ROMarchitectureBehavioralofrom_16_8isbeginprocess(clk,en,addr)beginifclk'eventandclk='1'then ifen='1'then caseaddris when"0000"=>data<="00000001"; …… when"1111"=>data<="10000011"; whenothers=>data<="ZZZZZZZZ";endcase; endif;endif;endprocess;endBehavioral;when"0001"=>data<="00000001"; when"0010"=>data<="00000001"; when"0011"=>data<="00000001"; when"0100"=>data<="00000001"; when"0101"=>data<="00000001"; when"0110"=>data<="00000001"; when"0111"=>data<="00000001"; when"1000"=>data<="00000001"; when"1001"=>data<="00000001"; when"1010"=>data<="00000001"; when"1011"=>data<="00000001"; when"1100"=>data<="00000001"; when"1101"=>data<="00000001"; when"1110"=>data<="00000001";7.3.1ROM7.3.1ROMarchitectureBehavioralofrom_16_8isSignaldata:std_logic_vector(7downto0);beginprocess(clk,en,addr)beginifen='1'thenifclk'eventandclk='1'then caseaddris when"0000"=>data<="00000001"; …… when"1111"=>data<="10000011"; whenothers=>data<="ZZZZZZZZ";endcase;endif;Data1<=data;elsedata1<="ZZZZZZZZ";endif;endprocess;endBehavioral;6.3.2RAMRAM存储器可对存储器中的地址单元进行数据写入或从地址单元中读取数据。以一个4位地址深度、8位数据宽度的RAM存储器为例介绍RAM存储器的设计。
7.3.2RAM【例6-29】RAM存储器设计libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityram_16_8isport(clk:instd_logic;we:instd_logic;--写使能信号rd:instd_logic;--读使能信号
waddr:instd_logic_vector(3downto0); raddr:instd_logic_vector(3downto0); datain:instd_logic_vector(7downto0); dataout:outstd_logic_vector(7downto0) );
endram_16_8;6.3.2RAMarchitectureBehavioralofram_16_8istypememoryisarray(0to15)ofstd_logic_vector(7downto0);signalram:memory;beginwrite_process:process(clk,we,waddr)beginifclk'eventandclk='1'then ifwe='1'then ram(conv_integer(waddr))<=datain; endif;endif;endprocess;6.3.2RAMrd_process:process(clk,rd,raddr)beginifclk'eventandclk='1'then ifrd='1'then dataout<=ram(conv_integer(raddr)); endif;endif;endprocess;endBehavioral;6.3.2RAMLPM_RAMLPM_ROMLPM_DLLSignalTap应用本章内容:第7章宏功能模块与IP核应用LPM:参数可设置模块库,基于Altera特定器件的优化设计Altera提供的宏模块与LPM函数有:第7章宏功能模块与IP核应用第7章宏功能模块与IP核应用LPM模块定制向导:MegaWizardPlug-InManager使用步骤:
LPM定制;原理图或HDL文件中例化7.1LPM_RAM
LPM_RAM
定制
顶层文件中例化
1.打开MegaWizardPlug-InManager
2.RAM参数配置
3.初始化数据
4.完成RAM定制
5.编译
7.1.1LPM_RAM定制
7.1.1LPM_RAM定制
1.打开MegaWizardPlug-InManager
7.1.1LPM_RAM定制
2.RAM参数配置3.指定初始化数据文件(.mif)
7.1.1LPM_RAM定制
4.完成RAM定制
7.1.1LPM_RAM定制
5.编译
建立项目、编译、仿真测试
7.1.1LPM_RAM定制
【例7-1】
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityram_testis
port(rst:instd_logic; --复位信号,低电平有效
clk:instd_logic; --时钟信号
wen:instd_logic; --写使能信号,高电平有效
ren:instd_logic; --读使能信号,高电平有效
waddr:instd_logic_vector(4downto0); --写端口地址信息
raddr:instd_logic_vector(4downto0); --读端口地址信息
datain:instd_logic_vector(7downto0); --数据写入端口
dataout:outstd_logic_vector(7downto0)); --数据输出端口
endentity;7.1.2LPM_RAM例化
architecturebehavofram_testis
componentram_lpmis--调用单端口RAM存储器
port(clock:instd_logic;
wren:instd_logic;
data:instd_logic_vector(7downto0);
address:instd_logic_vector(4downto0);
q:outstd_logic_vector(7downto0)
);
endcomponent;
signalwren:std_logic;
signaladdr:std_logic_vector(4downto0);7.1.2LPM_RAM例化
begin
process(rst,clk,wen,ren)
begin
ifrst='0'then
wren<='0';
addr<="00000";
elsifclk'eventandclk='1'then
ifwen='1'then
wren<='1';
addr<=waddr;
elsifren='1'then
wren<='0';
addr<=raddr;
endif;
endif;
endprocess;
u0:ram_lpmportmap(clock=>clk,wren=>wren,data=>datain,address=>addr,
q=>dataout);
endbehav;7.1.2LPM_RAM例化
1.建立初始化数据文件
2.LPM_ROM定制
3.LPM_ROM例化
7.2LPM_ROM1.新建“MemoryInitializationFile”文件
2.设定数据文件容量
3.输入数据
4.保存mif文件
7.2.1建立初始化数据文件7.2.2LPM_ROM定制1.打开MegaWizardPlug-InManager
2.ROM参数配置
3.初始化数据文件指定
4.完成ROM定制
5.编译
【例7-2】
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityrom_testis
port(rst:instd_logic; --复位信号,低电平有效
clk:instd_logic; --时钟信号
en:instd_logic; --使能信号,高电平有效
dataout:outstd_logic_vector(7downto0)--数据输出信号
);
endentity;7.2.3LPM_ROM例化
architecturebehavofrom_testis
componentrom_lpmis
port(clock:instd_logic;
address:instd_logic_vector(4downto0);
q:outstd_logic_vector(7downto0)
);
endcomponent;
signalcnt:std_logic_vector(4downto0);7.2.3LPM_ROM例化
begin
process(rst,clk,en)
begin
ifrst='0'then
cnt<="00000";
elsifclk'eventandclk='1'then
ifen='1'then
cnt<=cnt+1;
endif;
endif;
endprocess;
u0:rom_lpmportmap(clock=>clk,address=>cnt,q=>dataout);
endbehav;7.2.3LPM_ROM例化
例基于LPM_ROM的4位乘法器设计
设计原理:硬件乘法器有多种设计方法,但相比之下,由LPM_ROM构成的乘法表方式的乘法器的运算速度最快。这里定制LPM_ROM的地址位宽为8;地址输入由时钟inclock的上升沿锁入;数据位宽也为8。最后为ROM配置乘法表数据文件。
LPM_ROM中作为乘法表的数据文件rom_data.mif如表所示。其中的地址/数据表达方式是,冒号左边写ROM地址值,冒号右边写对应此地址放置的16进制数据。如47﹕28,表示47为地址,28为该地址中的数据,这样,地址高4位和低4位可以分别看成是乘数和被乘数,输出的数据可以看成是它们的乘积。基于LPM_ROM的4位乘法器设计用LPM_ROM设计的4位乘法器原理图编辑mif文件
时钟锁相环PLL
(phase-lockedloop)
可以实现对输入时钟的分频、倍频、相移等功能,能够减少时间延迟,增加时钟信号的稳定性。7.3L
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度融资担保合同:担保公司与借款人之间的融资担保协议
- 皮质椅子采购合同范例
- 涂料劳动合同范例
- 私教合同范例
- 2024版设备租赁合同的设备名称、租赁期限与维修责任
- 2024版城市供水排水承包合同:基础设施建设项目
- 租房房主合同范例
- 维修养护合同范例
- 简易赠予合同模板
- 木工车床购销合同范例
- 电大学前教育本教育实习教学活动设计
- 神经内科非计划拔管不良事件分析与讨论模板
- 农业合作社盈余及盈余分配表
- 广东省中小学生学籍管理的实施细则
- 四年级上册数学课件-7.1 认 识 垂 线 |冀教版 (共18张PPT)
- 结构力学小论文
- 感恩节(中英文对照版)
- 小学综合实践六年级上册第1单元《主题活动四:自主选题》教案
- 化学小实验 树叶上镀铜
- 钻孔记录表(记录表2)
- 民航旅客运输完整版ppt-全体教学教程课件最新
评论
0/150
提交评论