用VHDL语言设计基本逻辑电路.ppt_第1页
用VHDL语言设计基本逻辑电路.ppt_第2页
用VHDL语言设计基本逻辑电路.ppt_第3页
用VHDL语言设计基本逻辑电路.ppt_第4页
用VHDL语言设计基本逻辑电路.ppt_第5页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CHAPTER 3 DIGITAL CURCUITS WITH VHDL DESIGN,在前面的学习中,我们对VHDL语言的语句、语法及利用VHDL语言设计逻辑电路的基本方法作了详细介绍。 为了深入理解使用VHDL语言设计逻辑电路的具体步骤和方法,本章以常用的基本逻辑电路设计为例,再次对其进行系统和详细的介绍,以使大家初步掌握用VHDL语言描述基本逻辑电路的方法。,3.1 Summary of basic statements in VHDL codes,1、 Sequential Assignment Statements,1)IF、CASE、LOOP、NULL statements only using in process, procedure and function. 2)IF、CASE用于条件选择;LOOP用于循环控制偏重计算;NULL是一条空语句,一般用于CASE语句中。,2、Concurrent Assignment Statements,1)PROCESS语句注意敏感信号表,一般将进程中的输入信号或变量都写入敏感信号表中,如无敏感信号,则使用WAIT语句。 2)BLOCK语句改善并行语句及其结构的可读性。 3)并行信号赋值语句: (1)简单信号赋值语句 (2) WHEN ELSE 语句(ELSE 后面无符号),(3)选择信号赋值语句的用法 ARCHITECTURE ar_7 OF fzh_2 IS BEGIN WITH q SELECT y= a WHEN 00, -选择值用“,” 结束 b WHEN 01, c WHEN 10, d WHEN OTHERS; END ar_7; 4)元件例化语句:主要用于在VHDL中的层次设计。 5)生成语句:作用就是复制 FOR 循环变量 IN 取值范围 GENERATE,3 .Subprogram,VHDL中的子程序包括函数(FUNCTION)和过程(PROCEDURE)等两类。 函数的作用就是输入若干个参数,通过函数运算求值,最后直接返回一个值。 过程的调用是一条语句,调用时通过其接口返回0个或多个值。,4. Library and Package,3.2 VHDL for Combinational Circuits,Having learned a number of useful circuits that can be used as building blocks in larger circuits in before courses, such as logic gates, multiplexers, decoders and encoders, we will now consider how such circuits can be described in VHDL.,3.2.1 Logic Gates,简单门电路包括2输入“与非”门、集电极开路的2输入“与非”门、 2输入“或非”门、反相器、集电极开路的反相器、 3输入“与非”门、 2输入“或”门和2输入“异或”门等,它们是构成所有逻辑电路的基本电路。,Two-input XOR Gate,f.e.,3.2.2 Encoder, Decoder and Multiplexer,编、译码器和选择器是组合电路中较简单的3种通用电路。它们可以由简单的门电路组合连接而成,但采用这种方式,只给出电路,让读者来判断该电路的功能,那么要读通该电路需要花较多的时间。如果采用VHDL语言,从行为、功能来描述,不仅逻辑设计变得非常容易,而且阅读也会很方便。,例1:一位共阴七段数码管译码器 LIBRARY ieee; USE ieee.std_logic_1164.ALL; entity bcd7 IS PORT(d3,d2,d1,d0: IN std_logic; a,b,c,d,e,f,g:OUT std_logic); END; ARCHITECTURE arc_bcd7 OF bcd7 IS SIGNAL din: std_logic_vector(3 DOWNTO 0); SIGNAL dout: std_logic_vector(6 DOWNTO 0);,BEGIN din dout dout dout dout dout dout dout= “1011111“; -显示6,WHEN “1000“= dout dout dout= “1110000“; -显示7 . . . END CASE; END PROCESS; a=dout(6); b=dout(5); c=dout(4); d=dout(3); e=dout(2); f=dout(1); g=dout(0); END arc_bcd7;,2. Priority Encoder,f.e. 2,3.2.3 Complement Circuits,二进制运算经常要用到求补的操作。 这里用八位二进制求补电路为例。 我们当然可以采用结构描述方式来描述构造体,但是这样对每个门进行描述和连接太繁琐。这里采用RTL描述就显得更加简洁、清楚。,1. 二进制求补电路,2. Multiplication Circuit,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY mul IS PORT(A,B: IN STD_LOGIC_VECTOR(2 DOWNTO 0); M: OUT STD_LOGIC_VECTOR(5 DOWNTO 0); END mul;,ARCHITECTURE beha OF mul IS SIGNAL tmp0:STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL tmp1:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL tmp2:STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN PROCESS(A,B) BEGIN,IF B(0)=1 THEN tmp0=A; ELSE tmp0=“000“; END IF; IF B(1)=1 THEN tmp1=A,IF B(2)=1 THEN tmp2=A,Ex3: 设计一个四位加减法器,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY add_sub IS PORT(sub:IN STD_LOGIC; a,b: IN STD_LOGIC_VECTOR(3 DOWNTO 0); y: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); co: OUT STD_LOGIC); END add_sub;,ARCHITECTURE rtl OF add_sub IS SIGNAL tmp:STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN PROCESS(sub,a,b) BEGIN,IF sub=0 THEN tmp=0,3.2.4 Tristate-gate and Bus Buffer,三态门和双向缓冲器是接口电路和总线驱动电路经常用到的器件。 它们虽然不属于组合电路,但我们也在这里进行介绍。,f.e.1,f.e. 2,f.e. 3,这里对一个实体采用了三种构造体进行描述,若要把上述三个例题写在一起,可以用配置来实现:, ENTITY tri_gate IS END tri_gate; ARCHITECTURE zas IS END zas; ARCHITECTURE blk IS ,END blk; ARCHITECTURE nas IS END nas; CONFIGURATION triif OF tri_gate IS FOR zas END FOR; END triif;,CONFIGURATION triblk OF tri_gate IS FOR blk END FOR; END triblk; CONFIGURATION tricase OF tri_gate IS FOR nas END FOR; END tricase;,2、 Unidirectional Bus Buffer,在微机的总线驱动中经常要用单向总线缓冲器,它通常由多个三态门组成,用来驱动地址总线和控制总线。,f.e. 1,f.e. 2,f.e. 3,3、Bi-Directional Bus Buffer,f.e. 1,3.3 Design for Sequential Circuits,Sequential circuits in which the values of the outputs depend on not only on the present values of the inputs but also on the past behavior of the circuit. Such circuits include storage elements that store the values of logic signals.,3.3.1 Clock Signals and Clear Signals,1、Clock Signals 任何时序电路都以时钟信号为驱动信号,时序电路只是在时钟信号的边沿到来时,其状态才发生改变。因此,时钟信号通常是描述时序电路的程序执行的条件。另外,时序电路也总是以时钟进程形式来进行描述的,其描述方式一般有两种:,1)进程的敏感信号是时钟信号 在这种情况下,时钟信号应作为敏感信号,显式的出现在PROCESS语句后跟的括号中,如PROCESS(clock_signal)。时钟信号边沿的到来,将作为时序电路语句执行的条件,如下例所示: 该进程在时钟信号发生变化时被启动,而在时钟边沿的条件得到满足后才真正执行时序电路所对应的语句。,f.e. 1,2)用进程中的WAIT ON语句等待时钟 在这种情况下,描述时序电路的进程将没有敏感信号,而是用WAIT ON语句来控制进程的执行。也就是说,进程通常停留在WAIT ON语句上,只有在时钟信号到来,且满足边沿条件时,其余的语句才能执行。 如下例所示:,f.e. 2,在编写上述两个程序时应注意: 无论是IF语句还是WAIT ON语句,在对时钟边沿说明时,一定要注明是上升沿还是下降沿,光说明边沿是不行的。 当时钟信号作为进程的敏感信号时,在敏感信号的表中不能出现一个以上的时钟信号,除时钟信号以外,像复位信号等是可以和时钟信号一起出现在敏感表中的。 WAIT ON语句只能放在进程的最前面或者最后面。,3)时钟边沿的描述 为了描述时钟边沿,一定要指定是上升沿还是下降沿,这一点可以使用时钟信号的属性描述来达到。也就是说,时钟信号的值是从“0”到“1”变化;还是从“1”到“0”变化。由此可以得知是时钟脉冲信号的上升沿还是下降沿。,(a)时钟脉冲上升沿描述,If rising_edge(clk),(b)时钟脉冲下降沿描述,If falling_edge(clk),根据上面的描述,时钟信号边沿检出条件可以统一描述如下:,2、触发器的同步和非同步复位 触发器的初始状态应由复位信号来设置,复位信号对触发器复位的操作不同,使其可以分为同步复位和非同步复位两种。 所谓同步复位,就是当复位信号有效且在给定的时钟边沿到来时,触发器才被复位;而非同步复位则是,一旦复位信号有效,触发器就被复位。,1)Synchronous Clear 在用VHDL语言描述时,同步复位一定在以时钟为敏感信号的进程中定义,且用IF语句来描述必要的复位条件。 下面两个例子就是同步复位方式的描述实例:,f.e. 1,f.e. 2,2)Asynchronous Clear 非同步复位即异步复位,在描述时与同步方式不同:首先在进程的敏感信号中,除了时钟信号以外,还应加入复位信号;其次是用IF语句描述复位条件;最后在ELSIF段描述时钟边沿的条件,并加上EVENT属性。,f.e. 1,添加clock_event是为了防止没有时钟事件发生时的误操作。譬如,现在时钟事件没有发生而是发生了复位事件,这样该进程就得到了启动。在此情况下,若复位条件没有满足,而时钟边沿条件却是满足的,那么与时钟信号有关的那一段程序(ELSIF段)就会得到执行,从而造成错误操作。,3.3.2 Flip-Flops,1、Latch 1).Gated D Latch,f.e. 1 library ieee; use ieee.std_logic_1164.all; entity dff1 is port(d,clk:in std_logic; q:out std_logic); end dff1;,architecture rtl of dff1 is begin process(clk) begin if clk=1 then q=d; end if; end process; end rtl;,电平触发还是边沿触发?,若改为 process(clk, d),电平触发还是边沿触发?,f.e. 2 library ieee; use ieee.std_logic_1164.all; entity dff2 is port(d,clk:in std_logic; q:out std_logic); end dff2;,architecture rtl of dff2 is begin process begin wait until clkevent and clk=1; q=d; end process; end rtl;,2)Gated D Latch with Asynchronous Clear,非同步复位的D锁存器与一般的D锁存器相比多了一个复位输入端clr。当clr=0时,输出被强制复位。,f.e. 1 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY dffr IS PORT(d,clk,clr: IN STD_LOGIC; q: OUT STD_LOGIC); END dffr;,ARCHITECTURE rtl OF dffr IS BEGIN PROCESS(clk,clr) BEGIN IF clr=0 THEN q=0; ELSIF clkEVENT and clk=1THEN q=d; END IF; END PROCESS; END rtl;,DFF with a synchronous clear: PROCESS(clk) BEGIN IF clkEVENT and clk=1 THEN IF clr=0 THEN q=0; ELSE q=d; END IF; END IF; END PROCESS;,Ex: Write the VHDL codes for a DFF with asynchronous clear and preset.,Note: preset is priority of clear.,2、JK Flip-Flop,f.e. 1 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY jkff1 IS PORT(clk,clr,pset,j,k: IN STD_LOGIC; qb,q: OUT STD_LOGIC); END jkff1; ARCHITECTURE rtl OF jkff1 IS SIGNAL qs,qbs:STD_LOGIC; BEGIN PROCESS(j,k,clk,clr,pset),BEGIN IF pset=0THEN qs=1; qbs=0; ELSIF clr=0 THEN qs=0; qbs=1; ELSIF clkEVENT and clk=1THEN IF j=0 AND k=1 THEN qs=0; qbs=1; ELSIF j=1 AND k=0 THEN qs=1; qbs=0; ELSIF j=1 AND k=1 THEN qs=NOT qs; qbs=NOT qbs; END IF;,END IF; END PROCESS; q=qs; qb=qbs; END rtl;,Question: If the clear and preset are active simultaneously, whats the result?,为了与真值表一致,可以修改如下:,IF pset=0 AND clr=1 THEN qs=1; qbs=0; ELSIF clr=0 AND pset=1 THEN qs=0; qbs=1; . .,Using CASE statement:,ARCHITECTURE rtl OF jkff2 IS SIGNAL qs,qbs:STD_LOGIC; SIGNAL tmp:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN tmp=j,PROCESS(clk,clr,pset) BEGIN IF pset=0THEN qs=1; ELSIF clr=0 THEN qs=0; ELSIF clkEVENT and clk=1THEN,CASE tmp IS WHEN “00“=qsqsqsqsqs=X; END CASE; END IF;,qbs=NOT qs; END PROCESS; q=qs; qb=qbs; END rtl;,3.3.3 Registers,When a set of n flip-flops is used to store n bits of information, such as an n-bit number, we refer to these flip-flops as a register. A register that provides the ability to shift its contents is called a shift register. Parallel input and parallel output, serial input and serial output, parallel input and serial output, serial input and parallel output.,1、Serial input and serial output shift register,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY shift8 IS PORT(a,clk: IN STD_LOGIC; b : OUT STD_LOGIC); END shift8;,f.e. 1,ARCHITECTURE rtl OF shift8 IS COMPONENT dff PORT(d,clk: IN STD_LOGIC; q : OUT STD_LOGIC); END COMPONENT; SIGNAL z:STD_LOGIC_VECTOR(0 TO 8); BEGIN z(0)=a; g1: FOR i IN 0 TO 7 GENERATE dffx: dff PORT MAP(z(i),clk,z(i+1); END GENERATE; b=z(8); END rtl;,Or using IF-GENERATE Statement:,ARCHITECTURE rtl OF shift8_2 IS COMPONENT dff PORT(d,clk: IN STD_LOGIC; q : OUT STD_LOGIC); END COMPONENT; SIGNAL z:STD_LOGIC_VECTOR(1 TO 7); BEGIN g1: FOR i IN 0 TO 7 GENERATE g11:IF i=0 GENERATE,dffx: dff PORT MAP(a,clk,z(i+1); END GENERATE; g12:IF i=7 GENERATE dffx: dff PORT MAP(z(i),clk,b); END GENERATE; g13:IF i/=0 AND i/=7 GENERATE dffx: dff PORT MAP(z(i),clk,z(i+1); END GENERATE; END GENERATE; END rtl;,Or describing the signals connect:,f.e. 2,思考:若将上例中的信号量变为变量,代入符号改成赋值符号“:”,那么该程序所描述的是否仍是一个8位移位寄存器?,答:不是。这样在一个脉冲时间a就直接被送到b,不符合移位寄存器的特征。,2、Rotated Shift Registers,f.e. 1,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; PACKAGE CPAC IS PROCEDURE shift( din,s:IN STD_LOGIC_VECTOR; SIGNAL dout: OUT STD_LOGIC_VECTOR); END CPAC;,PACKAGE BODY CPAC IS PROCEDURE shift( din,s:IN STD_LOGIC_VECTOR; SIGNAL dout: OUT STD_LOGIC_VECTOR) IS VARIABLE sc: INTEGER; BEGIN sc:=CONV_INTEGER(s); FOR i IN dinRANGE LOOP IF ( sc+i=dinLEFT) THEN dout(sc+i)=din(i); ELSE dout(sc+idinLEFT)=din(i); END IF; END LOOP; END shift; END CPAC;,Using the shift procedure to describe a 8-bit rotated shift register:,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE WORK.CPAC.ALL; ENTITY bshift IS PORT(enb,clk:IN STD_LOGIC; din: IN STD_LOGIC_VECTOR(8 DOWNTO 1); s: IN STD_LOGIC_VECTOR(2 DOWNTO 0); dout: OUT STD_LOGIC_VECTOR(8 DOWNTO 1); END bshift;,ARCHITECTURE rtl OF bshift IS BEGIN PROCESS(clk) BEGIN IF (clkEVENT and clk=1) THEN IF enb=0 THEN dout=din; ELSE shift(din,s,dout); END IF; END IF; END PROCESS; END rtl;,3.3.4 Counters,Counter circuits are used in digital systems for many purposes. They may count the number of occurrences of certain events, generate timing intervals for control of various tasks in a system, keep track of time elapsed between specific events, and so on.,1、Synchronous Counters,所谓同步计数器,就是在时钟脉冲的控制下,构成计数器的各触发器状态同时发生变化的那一类计数器。 (1)带允许端的十二进制计数器,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY counter12_2 IS PORT(en,clk,clr:IN STD_LOGIC; qd,qc,qb,qa: OUT STD_LOGIC); END counter12_2; ARCHITECTURE rtl OF counter12_2 IS SIGNAL q:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN,f.e. 1,PROCESS(clk,clr) BEGIN IF clr=1 THEN q=“0000“; ELSIF (clkEVENT and clk=1) THEN IF en=1 THEN IF (q=“1011“) THEN q=“0000“; ELSE q=q+1; END IF;,ELSE q=q; END IF; END IF; END PROCESS; qd=q(3);qc=q(2);qb=q(1); qa=q(0); END rtl;,Ex: Design a up-down 6-bit binary counter.,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY counter64 IS PORT(updn,clk,clr:IN STD_LOGIC; qf,qe,qd,qc,qb,qa: OUT STD_LOGIC); END counter64;,ARCHITECTURE rtl OF counter64 IS SIGNAL q:STD_LOGIC_VECTOR(5 DOWNTO 0); BEGIN PROCESS(clk,clr) BEGIN IF clr=1 THEN q=“000000“;,ELSIF (clkEVENT and clk=1) THEN IF updn=1 THEN q=q+1; ELSE q=q-1; END IF; END IF; END PROCESS; qf=q(5);qe=q(4);qd=q(3);qc=q(2);qb=q(1);qa=q(0); END rtl;,(2)Modulo-60 Counter,为了把个位和十位分开,我们采用2位十进制计数器连接起来构成一个六十进制计数器。 配合bcd1wr,bcdtwr与datain使用,可以实现对六十进制计数器的个位和十位预置数操作。需要注意的是,在对个位和十位进行预置数操作时,datain输入端是公用的,因而个位和十位的预置数操作必定要串行进行。,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY counter60_2 IS PORT(clk,cin,bcd1wr,bcdtwr:IN STD_LOGIC; datain: IN STD_LOGIC_VECTOR(3 DOWNTO 0); bcd1: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); bcdt: OUT STD_LOGIC_VECTOR(2 DOWNTO 0); co: OUT STD_LOGIC); END counter60_2;,f.e. 1,ARCHITECTURE rtl OF counter60_2 IS SIGNAL bcd1n:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL bcdtn:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN bcd1=bcd1n; bcdt=bcdtn; PROCESS(clk,bcd1wr) BEGIN IF bcd1wr=1 THEN bcd1n=datain; ELSIF (clkEVENT and clk=1) THEN,IF cin=1 THEN IF bcd1n=9 THEN bcd1n=“0000“; ELSE bcd1n=bcd1n+1; END IF; END IF; END IF; END PROCESS;,PROCESS(clk,bcdtwr) BEGIN IF bcdtwr=1 THEN bcdtn=datain(2 downto 0); ELSIF (clkEVENT and clk=1) THEN IF (cin=1AND bcd1n=9) THEN IF bcdtn=5 THEN bcdtn=“000“; ELSE bcdtn=bcdtn+1;,END IF; END IF; END IF; END PROCESS; PROCESS(bcdtn,bcd1n,cin) BEGIN IF (cin=1 AND bcd1n=9 AND bcdtn=5) THEN co=1; ELSE co=0; END IF; END PROCESS; END rtl;,2、Asynchronous Counter,异步计数器又称为行波计数器,它的下一位计数器的输出作为上一位计数器的时钟信号,这一级一级串行连接起来就构成了异步计数器。 异步计数器与同步计数器不同之处在于时钟脉冲的提供方式,除此之外就没有什么不同,它同样可以构成各种各样的计数器。但是由于异步计数器采用行波计数,从而使计数延迟增加,在要求延迟小的领域受到了很大限制。但由于它电路简单,仍有广泛的应用。,f.e. 1,3.4 Storage,Storages have two classes: RAM and ROM. 3.4.1 存贮器描述中的一些共性问题 1、存贮器的数据类型 存贮器是众多存贮单元的一个集合体,按单元号顺序排列。每个单元由若干个二进制位构,成,以表示单元中存放的数据值。这种结构和数组的结构很相似。不妨认为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论