
电子设计自动化第7章常用数字电路设计.ppt
187页7.1 组合逻辑电路 7.2 时序逻辑电路设计 7.3 常用时序逻辑电路的设计 7.4 实训 习题,7.1 组合逻辑电路 对于组合逻辑电路,电路任何时刻的输出信号仅取决于当时的输入信号,其输出的值由输入决定在设计组合逻辑电路时,在进程中要包括所有的输入信号,以确保每一个信号的变化都要启动进程常用的组合逻辑电路有编码器、译码器、比较器、三态门、加法器等7.1.1 编码器和译码器 1.优先级8-3编码器 优先级8-3编码器有d7~d0八个输入信号,y2、y1、y0三个输出信号,各信号高电平有效其真值表如表7-1所示,逻辑符号如图7-1所示硬件电路中的优先级关系在VHDL语言中可以用IF分支判断语句或在PROCESS进程语句中设置临时变量来实现如用IF语句,多条件的IF语句的条件是有优先级的,最前面的条件的优先级最高,越往后优先级越低例7-1是使用IF的分支判断语句实现优先级8-3编码器的VHDL程序,其利用了进程中语句顺序执行的特点,由于语句是由上至下执行的,因而后面的赋值将覆盖前面的赋值例7-2为使用PROCESS进程语句中变量的特点实现优先级8-3编码器的VHDL程序本章的程序为简单起见,全部采用小写形式,VHDL程序不区分大小写。
),图7-1 优先级8-3编码器逻辑符号,2.3-8译码器 3-8译码器的电路功能与编码器相反,其输入为a2、a1、a0三个信号,输出为y7~y0八个信号,另外还有三个控制信号g1、g2a和g2b其真值表如表7-2所示,逻辑符号如图7-2所示图7-2 3-8译码器逻辑符号,7.1.2 多位比较器 多位比较器的真值表如表7-3所示,逻辑符号如图7-3所示图7-3 8位比较器逻辑符号,【例7-4】下面为多位比较器的VHDL源程序,此程序为8位比较器7.1.3 三态门 三态门是驱动电路经常用到的器件,其输出有三种状态,分别为“1”、“0”与“Z”(即高阻状态)三态门的逻辑符号如图7-4所示图7-4 三态门逻辑符号,7.1.4 加法器 加法器的结构化设计见6.3.3节,其实也可以调用IEEE库中的STD_LOGIC_UNSIGNED库进行设计,对两个输入类型为STD_LOGIC_VECTOR的数直接进行加法运算 【例7-6】两个4位加法器的VHDL程序如下:,,7.2 时序逻辑电路设计 对于时序逻辑电路,其任何时刻的输出信号不仅取决于当时的输入信号,而且还取决于电路原来的工作状态,即与以前的输入信号及输出信号也有关系。
在时序逻辑电路的设计中,时钟信号比较重要,基本每一个时序逻辑电路都是由时钟控制的时序逻辑电路的控制信号还包括两种重要的信号:同步控制信号与异步控制信号7.2.1 时钟信号 时序逻辑电路只有在时钟信号的边沿到来时,其状态才发生改变因此,时钟信号通常描述时序电路程序执行的条件另外,时序逻辑电路总是以时钟进程的形式来进行描述的,其描述方式一般分两种情况 1.进程的敏感信号是时钟信号 在这种情况下,时钟信号应作为进程敏感信号,显式地出现在process语句后面的括号中,例如process(clock_signal)时钟信号边沿的到来,将作为时序逻辑电路语句执行的条件例7-7程序说明,该进程在时钟信号(clock_signal)发生变化时被启动,而在时钟边沿的条件得到满足后才真正执行时序电路所对应的语句2.用wait on或wait until语句控制进程启动 在这种情况下,描述时序电路的进程将没有敏感信号,而是用wait on 或wait until 语句来控制进程的执行,也就是说,进程通常停留在wait on 或wait until语句上,只有在时钟信号到来且满足边沿条件时,其余的语句才被执行,如例7-8所示。
在编写上述两个程序时应注意: (1) 无论if语句还是wait语句,在对时钟边沿说明时,一定要注明是上升沿还是下降没(前沿还是后沿),光说明是边沿是不行的 (2) 当时钟信号作为进程的敏感信号时,在敏感信号列表中不能出现一个以上的时钟信号;除时钟信号以外,像复位信号等是可以和时钟一起出现在敏感信号表中的 (3) wait语句只能放在进程的最前面或者最后面3.时钟边沿的描述 为了描述时钟边沿,一定要指定是上升沿还是下降沿,这一点可以用时钟信号的属性描述来实现也就是说,通过确定时钟信号的值是从“0”到“1”变化,还是从“1”到“0”变化,由此得知是时钟脉冲信号的上升沿还是下降沿 1) 时钟脉冲的上升沿描述 时钟脉冲上升沿波形与时钟信号属性的描述关系如图7-5所示 从图中可以看到,时钟信号起始值为“0”,故其属性值clk’last_value=‘0’;其上升沿的到来表示发生了一个事件,故用clk’event表示;上升沿以后,时钟信号的值为“1”,故其当前属性值为clk=‘1’这样,表示上升沿到来的条件可写为 if clk’event and clk’last_value='0' and clk='1' then,图7-5 时钟脉冲上升沿属性描述关系,2) 时钟脉冲的下降沿描述 时钟脉冲下降沿波形与时钟信号属性的描述关系如图7-6所示。
从图中可以看到,时钟信号起始值为“1”,故其属性值clk’last_value=‘1’;其下降沿的clk’last_value=‘1’,时钟信号当前值为clk=‘0’,下降沿到来的事件为clk’event这样表示下降沿到来的条件可写为 if clk’event and clk’last_value='1' and clk='0' then,图7-6 时钟脉冲下降沿属性描述关系,根据上面的描述,时钟的边沿检测条件可以统一描述如下: if clock_signal=current_value and clock_signal’last_value and clock_signal’event then 在某些应用中,也可以简写成如下形式: if clock_signal=current_value and clock_signal’event then 另外,对于STD_LOGIC类型的信号可以用预定义好的两个函数来表示时钟的边沿: rising_edge(clk) 表示时钟的上升沿 falling_edge(clk) 表示时钟的下降沿,7.2.2 其他控制信号 1.同步控制信号 在时序逻辑电路中,同步控制信号指该信号控制功能的产生必须等时钟的边沿到来时才有效,也即与时钟同步。
因此,要使同步控制信号能够可靠地产生控制作用,其宽度必须保证至少有一个时钟周期时钟的上升沿比同步控制信号的优先级要高,所以在编写程序时一定要把检测同步控制信号有效的语句放在检测时钟边沿的后面在进程的敏感信号列表中可以不包括同步控制信号,因为时钟边沿信号的优先级比同步控制信号要高,只有在时钟边沿到来时控制信号才有效,这时进程已经启动了,所以可以检测到同步控制信号当然在进程的敏感信号列表中也可以包含同步控制信号,但这会造成进程的多余启动,对于程序的运行结果则没有影响如果电路中含有使能信号(其性质是同步控制信号),则可以把使能信号看做同步控制信号例7-9】带有使能信号的同步清零的八进制计数器,其仿真波形见图7-7图7-7 同步控制信号仿真波形,2.异步控制信号 在时序逻辑电路中,异步控制信号指该信号的控制功能只要满足条件就立即产生,而不需等时钟的边沿到来时才有效因此,异步控制信号时钟的上升沿比同步控制信号的优先级要高,在编写程序时一定要把检测异步控制信号有效的语句放在检测时钟边沿的前面在进程的敏感信号列表中应该包括异步控制信号,因为时钟边沿信号的优先级比异步控制信号要低,所以只要异步控制信号有效,进程就必须启动。
【例7-10】设计带有使能信号的异步清零的八进制计数器,其仿真波形见图7-8图7-8 异步控制信号仿真波形,,7.3 常用时序逻辑电路的设计 7.3.1 存储器 1.存储器描述中的共性问题 1) 存储器的数据类型 存储器是众多存储单元的集合体,按照单元号顺序排列,每个单元由若干二进制位构成,以表示单元中存放的数据值这种结构和数组的结构是非常相似的每个存储单元所存放的数可以用不同的、由VHDL语句所定义的数的类型来描述,例如用整数和位矢量来描述: type memory is array (integer range) of integer; 这是一个元素用整数表示的数组,用它来描述存储器存储数据的结构 subtype word is std_logic_vector(k-1 downto 0); type memory is array(0 to 2**w-1) of word; 这是一个元素用位矢量表示的数组,用它来描述存储器存储数据的结构这里k表示存储单元二进制位数,w表示数组的元素个数2) 存储的初始化 在用VHDL语言描述ROM时,ROM的内容应该在仿真时事先读到ROM中,这就是所谓存储器的初始化。
存储器的初始化要依赖于外部文件的读取,也就是说依赖于TEXTIO下面就是对ROM进行初始化的例子2.只读存储器ROM 用VHDL语言编写ROM(Read Only Memory)时需要对其进行初始化3.随机存储器RAM RAM和ROM的主要区别在于RAM的描述中有“读”和“写”两种操作,而且其读、写操作对时间有着严格的要求 【例7-13】设计一个8×8位RAM,基中cs为片选信号,wr为写信号,rd为读信号当cs=1、在wr信号的上升沿时,将IO上的数据写入到由addr指定的单元;当cs=0、rd=0时,将addr指定的单元读出送至IO7.3.2 先入先出存储器 先入先出(First In First Out,FIFO)存储器作为数据缓冲器,通常其数据存放结构与RAM是一致的,只是存取方式有所不同7.3.3 堆栈 堆栈是一种常见的数据存储结构,它的特点是数据后进先出堆栈会在实现某些控制算法的电路中出现,但一般不会用来处理大流量的数据大多的器件厂家都没有提供专门的堆栈单元模块,因此需要在设计中描述寄存器堆来实现堆栈结构例7-16】 6分频的VHDL源程序如下,其中architecture a使用第一种方案,architecture b使用第二种方案,使用configuration配置语句为实体指定结构体。
7.3.5 波形产生电路 1.基于ROM的波形产生电路 波形产生电路主要通过调用寄存器中的数据,控制取出数据的速度从而控制周期波形周期的改变一般有两种方法:一种是改变时钟的速度,也即改变取出寄存器中数据的速度控制所产生波形的速度;另一种是通过控制取出寄存器中数据的间隔来控制产生波形的周期,所取数据的间隔越大,所产生的波形频率就越大 【例7-18】用一个数组表示数据寄存器,并把该数组用程序包进行描述2.任意波形的产生 1) 正弦波 【例7-19】正弦波的VHDL源程序如下:,2) 三角波 由于三角是由线性增加和线性递减的两条线段构成的,所以可以直接用VHDL语言编程来实现三角波当线性自加到最高点时,由控制语句控制其自减,直到减到最低点时再重复之前的过程,从而实现三角波例7-20】采用VHDL语言编程的三角波源程序如下:,3) 锯齿波 锯齿波的采样也可以用VHDL语言来实现:当波形自加到所要求的最高点时,由控制语句使其返回0点重复以前的过程,从而实现锯齿波另外设置一个控制按键,来控制输出上升锯齿波或下降锯齿波例7-21】锯齿波VHDL源程序如下:,4) 方波 由于时钟脉冲输出即为方波,因而对方波的设计可以简化为直接输出时钟脉冲信号。
但是,在本设计中方波与其他三个波形要同步且要经过D/A转换,所以还需把时钟脉冲变成8位输出才可以经由D/A转换输出,具体过程可以由例7-22所示的程序实现。
