




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章VHDL基本逻辑电路的设计
哈尔滨工业大学(威海)信息工程学院电子工程系
第六章VHDL基本逻辑电路的设计
1.组合逻辑电路2.时序电路设计3.存储器1组合逻辑电路设计1.1简单门电路1.2三态门及总线缓冲器1.3编、译码器与选择器1.4加法器、求补器1.1简单门电路libraryIEEE;useIEEE.STD_LOGIC_1164.all;entitynand2is port( a:inSTD_LOGIC; b:inSTD_LOGIC; y:outSTD_LOGIC );endnand2;architecturenand2ofnand2isbeginy<=anandb; endnand2;&abyarchitecturenand2ofnand2isbegin process(a,b) variablecomb:std_logic_vector(1downto0); comb:=a&b; casecombis when"00"=>y<='1'; when"01"=>y<='1'; when“10"=>y<='1'; when“11"=>y<='0'; whenothers=>y<='Z'; endcase;endprocess;endnand2;或非门y<=anorb;+abycasecombis when"00"=>y<='1'; when"01"=>y<='1'; when“10"=>y<='1'; when“11"=>y<='0'; whenothers=>y<='Z';endcase;1.1简单门电路反相器y<=nota;ayifa='1'then y<='0';else y<='1';endif;1.1简单门电路异或门y<=axorb;+abycasecombis when"00"=>y<=‘0'; when"01"=>y<='1'; when“10"=>y<='1'; when“11"=>y<='0'; whenothers=>y<='Z';endcase;1.1简单门电路1.2三态门及总线缓冲器单元器件的三态输出描述:引入中间信号,采用条件赋值语句;例:
4输入与非门y<=not(a0anda1anda2anda3);改为:y1<=not(a0anda1anda2anda3);y<=y1whenen='1'else'Z';数据传输控制单元:三态控制单向总线控制1.2三态门及总线缓冲器数据传输控制单元:三态控制单向总线控制74x541architecturedofk74541issignalen:std_logic;beginen<=not(g1org2);y<=awhenen='1'else(others=>'Z');endd;1.2三态门及总线缓冲器双向缓冲器缓冲器adrben
endr功能00a=b01b=a1X三态双向总线缓冲器真值表1.2三态门及总线缓冲器process(a,dr,en)beginifen='0'anddr='1'then bout<=a;else bout<="ZZZZZZZZ";endif;b<=bout;endprocess;process(a,dr,en)beginifen='0'anddr='0'then aout<=b;else aout<="ZZZZZZZZ";endif;a<=aout;endprocess;数据传输控制单元:三态控制双向总线控制1.2三态门及总线缓冲器数据传输控制单元:三态控制双向总线控制entityk74245isport(a,b:inoutstd_logic_vector(7downto0);dir,g:instd_logic);
endk74245;architecturedflofk74245isbeginb<=awhen(g='0')and(dir='0')else"ZZZZZZZZ";a<=bwhen(g='0')and(dir='1')else(others=>'Z');enddfl;数据传输控制单元:三态控制注意:双向总线在功能仿真时的输入设置a和b的输入不要同时存在;设置a的输入时,则b为输出,应将b的输入设置为高阻;反过来也是同样;转换传输方向时,应该以双向阻塞作为间隔,避免出现冲突。1.2三态门及总线缓冲器数据传输控制单元:
MUX1.2三态门及总线缓冲器数据传输控制单元:
MUXMUX是电路中控制数据流动最为常用的手段;根据控制量的数值由多路数据中选择一路输出;采用选择赋值能够非常直观地表达MUX的概念;1.3编、译码器与选择器数据传输控制单元:
MUX4路8位数据选择器architecturertlofmux4in8bisbeginwithsselecty<=awhen"00",bwhen"01",cwhen"10",dwhen"11",(others=>'U')whenothers;endrtl;1.3编、译码器与选择器数据传输控制单元:
MUXarchitecturebehofmux4in8pisbeginprocess(s,a,b,c,d)begincasesiswhen"00"=>y<=a;when"01"=>y<=b;when"10"=>y<=c;when"11"=>y<=d;whenothers=>y<=(others=>'U');endcase;endprocess;endbeh;采用进程和case语句实现数据编码转换单元该类电路为多路输入/多路输出,将输入的编码转换为对应的输出的编码;采用选择赋值语句可以对各类码制转换电路进行设计。1.3编、译码器与选择器数据编码转换单元:二进制译码器architecturertlofv74x138issignalyli:std_logic_vector(0to7);beginwithaselectyli<="01111111"when"000","10111111"when"001","11011111"when"010","11101111"when"011","11110111"when"100","11111011"when"101","11111101"when"110","11111110"when"111","11111111"whenothers;yl<=yLiwhen(g1andnotg2alandnotg2bl)=‘1’else“11111111”;
endrtl;1.3编、译码器与选择器数据编码转换单元:7段译码器输入4位BCD码,产生7个输出,分别驱动相应显示器件;考虑7段输出与数字的对应关系,可以得出如下关系
abcdefg0:0000--11111101:0001--01100002:0010--11011013:0011--1111001
1.3编、译码器与选择器数据编码转换单元:7段译码器architecturedofbcdseg7isbeginy<="1111110"whendata="0000"else"0110000"whendata="0001"else"1101101"whendata="0010"else"1111001"whendata="0011"else"0110011"whendata="0100"else"1011011"whendata="0101"else"0011111"whendata="0110"else"1110000"whendata="0111"else"1111111"whendata="1000"else"1110011"whendata="1001"else“0000000”;
endd;数据编码转换单元:优先编码器architecturertlofkencoderissignala1:std_logic_vector(2downto0);begina1<="000"wheni(7)='0'else"001"wheni(7downto6)="10"else"010"wheni(7downto5)="110"else"011"wheni(7downto4)="1110"else"100"wheni(7downto3)="11110"else"101"wheni(7downto2)="111110"else"110"wheni(7downto1)="1111110"else"111";a<=a1whenel='0'else"111";endrtl;数据检测单元:奇偶校验器奇偶校验电路是实现数据错误检验的一种基本电路,其方式是检测在输入数据中‘1’的个数是奇数还是偶数;通常采用异或门的结构实现。1.3编、译码器与选择器数据检测单元:奇偶校验器architecturertlofkparity9issignaly1,y2,y3,y:std_logic;beginy1<=i(1)xori(2)xori(3);y2<=i(4)xori(5)xori(6);y3<=i(7)xori(8)xori(9);y<=y1xory2xory3;odd<=y;even<=noty;endrtl;1.3编、译码器与选择器半加器二进制输入和输出进位输出basco0011010101100001半加器真值表半加器absco1.4加法器、求补器libraryIEEE;useIEEE.STD_LOGIC_1164.all;entityhalf_adderis port( a:inSTD_LOGIC; b:inSTD_LOGIC; s:outSTD_LOGIC; co:outSTD_LOGIC );endhalf_adder;architecturehalf_adderofhalf_adderissignalc,d:std_logic;beginc<=aorb;d<=anandb;co<=notd;s<=candd;endhalf_adder;全加器半加器ab+co半加器cinsU0_su1u2U0_co1.3编、译码器与选择器libraryIEEE;useIEEE.STD_LOGIC_1164.all;entityfull_adderis port( a,b,cin:inSTD_LOGIC; co,s:outSTD_LOGIC);endfull_adder;architecturefull_adderoffull_adderiscomponenthalf_adder port( a,b:inSTD_LOGIC; s,co:outSTD_LOGIC);endcomponent;signalu0_co,u0_s,u1_co:std_logic;beginu0:half_adderportmap(a,b,u0_s,u0_co);u1:half_adderportmap(u0_s,b,cin,s,u1_co);co<=u0_cooru1_co;endfull_adder;时序电路的结构与特点内部含有存储器件(触发器、锁存器);信号变化受时钟控制;通常采用状态变化进行描述;采用进程进行设计;2.时序电路设计同步时序电路的信号变化特点同步时序电路以时钟信号为驱动;电路内部信号的变化(或输出信号的变化)只发生在特定的时钟边沿;设计要点:时钟边沿的检测;输出赋值的控制:是否改变、如何改变。2.时序电路设计同步时序电路的时钟控制采用进程描述可以有效控制执行条件,进程中的条件控制可以将时钟信号(clk)做为控制信号,只有当时钟信号变化时,进程才执行;在时钟条件不满足时,任何输入信号的变化对电路(进程)不起作用;2.时序电路设计VHDL中的时钟检测方式VHDL通常采用属性语句检测时钟边沿;与时钟有关的属性语句:clk'event:boolean,clk有变化时为true;clk‘last_value:bit,clk在变化之前的值;注意:上述属性语句只能在子结构中应用(作为局部量)。2.时序电路设计VHDL中的时钟检测方式例:上升沿的检测:
clk'eventandclk='1';clk'eventandclk'last_value='0';在由上升沿导致的进程执行时,上述两个表达式的值都为true;而在由其他输入变化导致的进程执行时,上述表达式的值就是faith;2.时序电路设计时序电路的基本单元设计Latch:输出受时钟电平控制,在一段时间内可受输入变化影响发生而变化;(电平控制)flip-flop:输出只在时钟边沿时刻发生变化,输入信号变化不能直接导致输出变化;(边沿控制)2.时序电路设计时序电路的基本单元设计例:Dlatch的设计process(clk,d)
begin
ifclk='1'thenq<=d;
endif;endprocess;d和clk的任何变化都会导致进程执行;仅当clk为1时,d的变化才会导致q的变化;2.时序电路设计时序电路的基本单元设计例:Dflip-flop的设计:process(clk,d)
begin
ifclk'eventandclk='1'thenq<=d;
endif;endprocess;d和clk的任何变化都会导致进程执行;只有在clk上升沿引发的进程执行中,d的变化才会导致q的变化;触发沿选择与清零设置问题:process(clk,clr)
begin
ifclr='1'thenq<='0';
elsifclk'eventandclk='1'thenq<=d;
endif;endprocess;异步清零,上升沿触发;2.时序电路设计触发沿选择与清零设置问题:process(clk,clr)begin
ifclk'eventandclk='0'
ifclr='0'thenq<='0';
elseq<=d;
endif;
endif;endprocess;下降沿触发,同步清零;2.时序电路设计时序电路的基本单元设计采用wait语句进行时钟检测:processbeginwaitonclk; ifclk='1'then
q<=d;
endif;endprocess;2.时序电路设计时序电路的基本单元设计采用wait语句进行时钟检测:processbegin
waituntilclk='0';q<=d;endprocess;2.时序电路设计关于寄存器生成的控制问题寄存器的作用是在输入信号变化时,保持输出信号不变;当程序设计中隐含这一要求时,就会在综合时引入寄存器;寄存器只在满足一定条件时才允许改变输出值,因此只能通过条件判断语句才会引入寄存器;2.时序电路设计关于寄存器生成的控制问题例1:寄存器的引入process(clk,d)begin
ifclk='1'thenq<=d;elseq<='0';
endif;endprocess;2.时序电路设计关于寄存器生成的控制问题例1:寄存器的引入process(clk,d)begin
ifclk='1'thenq<=d;
endif;endprocess;2.时序电路设计关于寄存器生成的控制问题例2:双输出D触发器的设计比较1:process(clk)beginif(clk'eventandclk='1')then qi<=d;q<=qi;qn<=notqi;endif;endprocess;2.时序电路设计关于寄存器生成的控制问题例2:双输出D触发器的设计比较2:process(clk)beginif(clk'eventandclk='1')thenqi<=d;q<=d;qn<=notqi;endif;endprocess;2.时序电路设计关于寄存器生成的控制问题例2:双输出D触发器的设计比较3:process(clk)beginif(clk'eventandclk='1')thenq<=d;qn<=notd;endif;endprocess;关于寄存器生成的控制问题例2:双输出D触发器的设计比较4:process(clk)beginif(clk'eventandclk='1')thenqi<=d;endif;q<=qi;qn<=notqi;endprocess;关于寄存器的设计准则(1)一个进程中只引入一个寄存器(组);只含有一条时间测试语句;只对时间的一个边沿进行测试;(2)引入寄存器的优选语句应该是IF/THEN语句,因为该语句更容易控制寄存器的引入;在该语句中只应设置一条边沿测试描述分句;关于寄存器的设计准则(3)严格控制带时间测试语句的IF/THEN语句中赋值语句的数量,将不必要的语句放到该语句以外;(4)在各类条件控制语句中,注意控制条件的完整性,避免因漏掉条件而生成寄存器;(5)在过程中不能设计寄存器。寄存器的设计实例16位锁存寄存器设计
带有时钟使能控制和输出三态控制;libraryieee;useieee.std_logic_1164.all;
entitykreg16isport(clk,clken,oe,clr:instd_logic;d:instd_logic_vector(1to16);q:outstd_logic_vector(1to16));endkreg16;寄存器的设计实例architecturebehofkreg16is
signaliq:std_logic_vector(1to16);begin
process(clk,clr,oe,iq)begin
ifclr='1'theniq<=(others=>'0');
寄存器的设计实例
elsifclk'eventandclk='1'then
ifclken='1'theniq<=d;endif;
endif;
ifoe='1'thenq<=iq;
elseq<=(others=>'Z');endif;endprocess;endbeh;寄存器dclkqdclkqdclkqdclkqdffx(0)dffx(1)dffx(2)dffx(3)aclkb2.时序电路设计architectureshiftofshiftisbegincomponentdff port(d,clk:instd_logic; q:outstd_logic);endcomponent;signalz:std_logic_vector(0to4);begin z(0)<=a; g1:foriin0to3generate dffx:dffportmap(z(i),clk,z(i+1)); endgenerate; b<=z(4);endshift;同步计数器所谓同步计数器,就是在时钟脉冲的控制下,构成计数器的各触发器状态同时发生变化的那一类计数器可逆计数器process(clk,rst)begin ifrst='1'then count<=(others=>'0');elsifclk'eventandclk='1'then ifupdn='1'then count<=count+1; else count<=count-1; endif; endif;endprocess;2.时序电路设计异步计数器异步计数器又称行波计数器,它的下一位计数器的输出作为上一位计数器的始终信号。clkcount3dclkqdclkqdclkqdclkqcount0count1count2dclkqqnqnqnqn2.时序电路设计libraryIEEE;useIEEE.STD_LOGIC_1164.all;entityrplcontis port( clk:inSTD_LOGIC; count:outSTD_LOGIC_VECTOR(7downto0));endrplcont;architecturerplcontofrplcontissignalcount_in_bar:std_logic_vector(7downto0);componentdff port(clk,d:instd_logic;q,qb:outstd_logic);endcomponent;begincount_in_bar(0)<=clk;gen1:foriin0to7generate U:dffportmap(clk=>count_in_bar(i), d=>count_in_bar(i+1), q=>count(i),qb=>count_in_bar(i+1));endgenerate;endrplcont;计数器(counter)设计计数器也称为分频器,是数字电路中的基本时序模块;计数器通常以clk信号为基本输入,对输入信号进行计数,在clk每个周期中改变一次计数器状态,状态可以输出;经过n次计数后,计数器将回到初始状态,并给出进位输出信号;2.时序电路设计计数器的VHDL设计可以采用两种方式:1采用二进制串设置状态,指定循环的起点和终点,在时钟触发条件下对状态进行加1或减1运算,使状态顺序变化;2采用结构设计方式,先形成小型计数器,再扩展形成大型的计数器。计数器(counter)设计2.时序电路设计4位二进制加法计数器74163有同步复位,同步置数和进位控制功能;采用unsigned数据类型进行设计;libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;2.时序电路设计entityk74163isport(clk,clrl,ldl,enp,ent:instd_logic;d:inunsigned(3downto0);q:outunsigned(3downto0);rco:outstd_logic);endk74163;architecturebehofk74163issignaliq:unsigned(3downto0);begin计数器的行为设计:741632.时序电路设计process(clk,ent,iq)beginifclk‘eventandclk=’1‘then
--时钟沿检测
ifclrl='0'theniq<=(others=>'0');
--同步复位
elsifldl=‘0’theniq<=d;--同步置数
elsif(entandenp)='1'theniq<=iq+1;
--状态按顺序改变endif;endif;计数器的行为设计:741632.时序电路设计
if(iq=15)and(ent='1')thenrco<='1';
elserco<='0';
endif;
q<=iq;
endprocess;endbeh;对于usigned类型,在位数固定的条件下,加1或减1的运算可以自动产生循环,不需要考虑起点和终点设置问题。计数器的行为设计:741632.时序电路设计计数器的行为设计电路的综合与仿真结果:在状态12时输出进位信号;对上述程序只需要改变两句:elseif(entandenp)='1'and(iq=12)then
iq<=“0011”;--现态为终态时,次态为初态if(iq=12)and(ent=‘1’)thenrco<='1‘
--在终态输出1计数器的行为设计:BCD码计数器计数器的结构设计利用4个k74163连接成16位加法二进制计数器(模65536)libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entitykcount16isport(clk,clrl,ldl,en:instd_logic;d:inunsigned(15downto0);q:outunsigned(15downto0);rco:outstd_logic);endkcount16;计数器的结构设计architecturestrofkcount16iscomponentk74163port(clk,clrl,ldl,enp,ent:instd_logic;d:inunsigned(3downto0);q:outunsigned(3downto0);rco:outstd_logic);endcomponent;signalco0,co1,co2:std_logic;begin2.时序电路设计计数器的结构设计u1:k74163portmap
(clk,clrl,ldl,en,en,d(3downto0),
q(3downto0),co0);u2:k74163portmap
(clk,clrl,ldl,co0,co0,d(7downto4),
q(7downto4),co1);u3:k74163portmap
(clk,clrl,ldl,co1,co1,d(11downto8),
q(11downto8),co2);u4:k74163portmap
(clk,clrl,ldl,co2,co2,d(15downto12),
q(15downto12),rco);endstr;关于正负边沿同时触发的问题在一些特殊的电路中,需要同时使用时钟的正负边沿进行触发。在VHDL设计中,可以采用两个进程分别处理正边沿触发和负边沿触发,形成两个不同的信号,然后再考虑怎么将两个信号合成最终输出。关于正负边沿同时触发的问题例1:时钟边沿计数器要求对时钟信号的正负边沿同时进行计数;libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entityclkcountisport(clk:instd_logic;
y:outunsigned(7downto0));endclkcount;关于正负边沿同时触发的问题architecturebehofclkcountissignalc1,c2:unsigned(7downto0);begin
process(clk)
variableid:unsigned(7downto0):="00000000";beginif(clk'eventandclk='1')thenid:=id+1;--上升沿计数
endif;c1<=id;endprocess;关于正负边沿同时触发的问题process(clk)
variableid:unsigned(7downto0):="00000000";beginif(clk'eventandclk='0')thenid:=id+1;--下降沿计数
endif;c2<=id;endprocess;y<=c1+c2;--将两个计数相加endbeh;2.时序电路设计关于正负边沿同时触发的问题电路综合及仿真结果:2.时序电路设计关于正负边沿同时触发的问题有时将运算得到的信号与时钟信号进行“与”运算,也能使输出信号在时钟的两个边沿都发生变化;这对于某些特殊的信号发生器设计具有意义。例2:将模3计数器的输出与时钟信号进行运算,可以得到以下结果:2.时序电路设计关于正负边沿同时触发的问题y1<=yiandclk;y2<=yiandnotclk;y3<=yixorclk;考察y3信号的上升沿,可以认为该信号是对时钟信号的1.5分频(半整数分频)!2.时序电路设计Shift-Register移位寄存器设计移位寄存器可以寄存n位二进制数(可以将其视为串行排列的数组),在每个时钟周期,内部寄存数据移动1位(向右或向左),同时有1位数据移入或移出;利用进程中简单的赋值语句可以很方便地设计移位寄存器;2.时序电路设计移位寄存器设计:简单4位右移libraryieee;useieee.std_logic_1164.all;
entitykshfreg1isport(clk,d:instd_logic;y:outstd_logic);endkshfreg1;
architecturebehofkshfreg1issignalq0,q1,q2:std_logic;--中间信号begin2.时序电路设计移位寄存器设计:简单4位右移process(clk)beginif(clk'eventandclk='1')thenq0<=d;q1<=q0;q2<=q1;y<=q2;
--注意信号赋值的意义
endif;endprocess;endbeh;2.时序电路设计移位寄存器设计:简单4位右移利用连接运算符号&,也可以将上述程序改为如下形式:architecturebehofkshfreg1issignalq:std_logic_vector(0to2);beginprocess(clk)beginif(clk'eventandclk='1')thenq<=d&q(0to1);y<=q(2);--&实现数据q右移endif;endprocess;endbeh;移位寄存器设计:8位多功能器件可实现异步复位、同步置数(并行输入)、状态输出(并行输出)、串入串出的左/右移控制;
2.时序电路设计移位寄存器设计:8位多功能器件libraryieee;useieee.std_logic_1164.all;entitykshfreg2isport(clk:instd_logic;--时钟
dir,clr,ld,dr,dl:instd_logic;--各种控制信号
d:instd_logic_vector(7downto0);--并行输入
q:outstd_logic_vector(7downto0));--并行输出endkshfreg2;移位寄存器设计:8位多功能器件architecturebehofkshfreg2issignalqi:std_logic_vector(7downto0);
--内部传递信号beginprocess(clk,clr)beginifclr=‘1’thenqi<=(others=>‘0’);
--异步置零
elsif(clk'eventandclk='1')then
--时钟控制
ifld=‘1’thenqi<=d;--并入控制2.时序电路设计移位寄存器设计:8位多功能器件
elsifdir=‘0’then--右移控制
qi<=qi(6downto0)&dr;else
--左移控制
qi<=dl&qi(7downto1);endif;endif;q<=qi;--并行输出endprocess;endbeh;2.时序电路设计移位寄存器设计:8位多功能器件电路综合结果:2.时序电路设计典型的存储器模块有:寻址存储器:ROMRAM顺序存储器:FIFO
Stack
(LIFO)
存储器模块的VHDL设计3.存储器ROM和RAM属于通用大规模器件,一般不需要自行设计;但是在数字系统中,有时也需要设计一些小型的存储器件,用于特定的用途:l例如临时存放数据,构成查表运算等。此类器件的特点为地址与存储内容直接对应,设计时将输入地址作为给出输出内容的条件,采用条件赋值方式进行设计。寻址存储器的VHDL设计3.存储器设计思想:将每个8位数组作为一个字(word);总共存储16个字;将ram作为由16个字构成的数组,以地址为下标;通过读写控制模式实现对特定地址上字的读出或写入;寻址存储器设计:16x8位RAM3.存储器libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;
entitykramisport(clk,wr,cs:instd_logic;d:inoutstd_logic_vector(7downto0);adr:instd_logic_vector(3downto0));endkram;寻址存储器设计:16x8位RAM3.存储器architecturebehofkramissubtypewordisstd_logic_vector(7downto0);typememoryisarray(0to15)ofword;signaladr_in:integerrange0to15;signalsram:memory;beginadr_in<=conv_integer(adr);--将地址转换为数组下标process(clk)begin寻址存储器设计:16x8位RAM3.存储器if(clk'eventandclk='1')thenif(cs='1'andwr='1')then--片选、写
sram(adr_in)<=d;endif;if(cs='1'andwr='0')then--片选、读
d<=sram(adr_in);endif;endif;endprocess;endbeh;寻址存储器设计:16x8位RAM3.存储器ROM的内容是初始设计电路时就写入到内部的,通常采用电路的固定结构来实现存储;ROM只需设置数据输出端口和地址输入端口;设计思想:采用二进制译码器的设计方式,将每个输入组态对应的输出与一组存储数据对应起来;寻址存储器设计:16x8位ROM3.存储器libraryieee;useieee.std_logic_1164.all;
entityromisport(dataout:outstd_logic_vector(7downto0);addr:instd_logic_vector(3downto0);ce:instd_logic);endrom;寻址存储器设计:16x8位ROM3.存储器architecturedofromissignalid:std_logic_vector(4downto0);beginid<=addr&ce;dataout<="00001111"whenid="00000"else"11110000"whenid="00010"else"11001100"whenid="00100"else"00110011"whenid="00110"else"10101010"whenid="01000"else"01010101"whenid="01010"else"10011001"whenid="01100"else寻址存储器设计:16x8位ROM
"01100110"whenid="01110"else"00000000"whenid="10000"else"11111111"whenid="10010"else"00010001"whenid="10100"else"10001000"whenid="10110"else"10011001"whenid="11000"else"01100110"whenid="11010"else"10100110"whenid="11100"else"01100111"whenid="11110"else"XXXXXXXX";endd;寻址存储器设计:16x8位ROM顺序存储器的特点是不设置地址,所有数据的写入和读出都按顺序进行;数据写入或读出时通常采用移位操作设计;在设计时必须考虑各存储单元的存储状态;顺序存储器(堆栈和FIFO)的设计3.存储器设计要求:存入数据按顺序排放;存储器全满时给出信号并拒绝继续存入;数据读出时按后进先出原则;存储数据一旦读出就从存储器中消失;堆栈(后进先出存储器)的设计3.存储器设计思想:将每个存储单元设置为字(word);存储器整体作为由字构成的数组;为每个字设置一个标记(flag),用以表达该存储单元是否已经存放了数据;每写入或读出一个数据时,字的数组内容进行相应的移动,标记也做相应的变化;堆栈(后进先出存储器)的设计3.存储器libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_signed.all;
entitystackisport(datain:instd_logic_vector(7downto0);push,pop,reset,clk:instd_logic;stackfull:outstd_logic;dataout:bufferstd_logic_vector(7downto0));endstack;堆栈设计:移位寄存器方式3.存储器architecturebofstackistypearraylogicisarray(15downto0)ofstd_logic_vector(7downto0);signaldata:arraylogic;signalstackflag:std_logic_vector(15downto0);beginstackfull<=stackflag(0);
process(clk,reset,pop,push)variableselfunction:std_logic_vector(1downto0);begin
selfunction:=push&pop;堆栈设计:移位寄存器方式3.存储器ifreset='1'thenstackflag<=(others=>'0');dataout<=(others=>'0');foriin0to15loopdata(i)<="00000000“;endloop;elsifclk'eventandclk='1'thencaseselfunctioniswhen"10"=>ifstackflag(0)=’0’then
data(15)<=datain;
stackflag<='1'&stackflag(15downto1);
foriin0to14loop
data(i)<=data(i+1);endloop;endif;堆栈设计:移位寄存器方式when"01"=>dataout<=data(15);stackflag<=stackflag(14downto0)&'0';foriin15downto1loopdata(i)<=data(i-1);endloop;whenothers=>null;endcase;endif;endprocess;endb;堆栈设计:移位寄存器方式3.存储器architecturebofstackistypearraylogicisarray(15downto0)ofstd_logic_vector(7downto0);signaldata:arraylogic;beginprocess(clk,reset,pop,push)variablep:naturalrange0to15;variableselfunction:std_logic_vector(1downto0);variables:std_logic;begin堆栈设计:地址指针方式3.存储器stackfull<=s;selfunction:=push&pop;ifreset='1'thenp:=0;dataout<=(others=>'0');s:='0';foriin0to15loopdata(i)<="00000000";endloop;elsifclk'eventandclk='1'thenifp<15andselfunction="10"thendata(p)<=datain;p:=p+1;endif;
堆栈设计:地址指针方式3.存储器ifp=15andselfunction="10"ands='0'thendata(p)<=datain;s:='1';endif;ifp>0andselfunction="01"ands='0'thenp:=p-1;dataout<=data(p);endif;ifp=15andselfunction="01"ands='1'thendataout<=data(p);s:='0';endif;endif;endprocess;endb;堆栈设计:地址指针方式3.存储器设计要求:存入数据按顺序排放;存储器全满时给出信号并拒绝继续存入;全空时也给出信号并拒绝读出;读出时按先进先出原则;存储数据一旦读出就从存储器中消失;FIFO(先进先出存储器)的设计3.存储器设计思想:结合堆栈指针的设计思想,采用环行寄存器方式进行设计;分别设置写入指针wp和读出指针rp,标记下一个写入地址和读出地址;地址随写入或读出过程顺序变动;设计时需要注意处理好从地址最高位到地址最地位的变化;FIFO(先进先出存储器)的设计3.存储器libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_signed.all;
entitykfifoisport(datain:instd_logic_vector(7downto0);push,pop,reset,clk:instd_logic;full,empty:outstd_logic;dataout:outstd_logic_vector(7downto0));endkfifo;
FIFO设计:地址指针方式3.存储器architecturebofkfifoistypearraylogicisar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 欠款委托协议书范本
- 2025项目管理合同协议书的范本格式
- 商场烟柜转让合同协议
- 2025规范合同样板:家庭装修合同协议
- 母子拆迁协议书格式
- 品牌备案产品合同协议
- 2025购销合同范本范例
- 品牌运营合同协议
- 2025年店面经营权转让合同协议
- 2025标准室内设计合同范本
- 第九章-人类与自然地理环境.课件
- 中考动员大会校长演讲稿
- 各种各样的房子课件
- 课题申报书:产教融合视域下职业教育赋能新质生产力的模型构建和实现路径研究
- 临床试验入组经验分享
- 跨国合作:应对全球传染病挑战
- 《永辉超市S店库存管理问题及产生原因和优化建议》8700字(论文)
- 《光储充一体化电站技术规范》标准编制说明+征求意见稿
- 《电力人工智能平台样本标准规范编制说明》
- 2025年上海市高考语文备考之记、论、说等文言文二知识点汇编(附录24一模文言文二高频分析题汇编)
- 财报分析-伊利
评论
0/150
提交评论