欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    数字系统设计教学资料-第四章时序逻辑电路.ppt

    • 资源ID:73405239       资源大小:524KB        全文页数:37页
    • 资源格式: PPT        下载积分:11.9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要11.9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数字系统设计教学资料-第四章时序逻辑电路.ppt

    本章目录本章目录不当的设计实例不当的设计实例误用异步复位误用异步复位误用门控时钟误用门控时钟误用派生时钟误用派生时钟功耗考虑功耗考虑计数器计数器二进制计数器二进制计数器格雷码计数器格雷码计数器环形计数器环形计数器线性反馈移位寄存器(线性反馈移位寄存器(LFSRLFSR)寄存器充当快速临时存储寄存器充当快速临时存储n同步设计在设计规模巨大、复杂的系统时是最重要的。同步设计在设计规模巨大、复杂的系统时是最重要的。n在过去,一些非同步的设计实践被用来节约芯片和面积在过去,一些非同步的设计实践被用来节约芯片和面积滥用异步复位滥用异步复位滥用门控时钟滥用门控时钟滥用派生时钟滥用派生时钟时序电路设计:实践时序电路设计:实践n原则:在寄存器正常工作的时候,不要用复位信号来清空寄存原则:在寄存器正常工作的时候,不要用复位信号来清空寄存器。器。n这里有一个不太实用的这里有一个不太实用的10进制计数器例子,当计数值达到进制计数器例子,当计数值达到“1010”时,立刻清空计数器。时,立刻清空计数器。误用异步复位误用异步复位误用异步复位误用异步复位library ieee;use ieee.std_logic_1164.all;use;entity mod10_counter isport(clk,reset:in std_logic;q:out std_logic_vector(3 downto 0);end mod10_counter;architecture poor_async_arch of mod10_counter issignal r_reg:unsigned(3 downto 0);signal r_next:unsigned(3 downto 0);signal async_clr:std_logic;begin -registerprocess(clk,async_clr)beginif(async_clr=1)then r_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-asynchronous clear async_clr=1 when(reset=1 or r_reg=1010)else 0;-next state and output logic r_next=r_reg+1;q=std_logic_vector(r_reg);end poor_async_arch;n问题所在:问题所在:从从“1001”到到“0000”的跳转时,经过了的跳转时,经过了“1010”状态(如时序图所状态(如时序图所示)。示)。在驱动在驱动aync_clr信号的组合逻辑中,任意的毛刺都会复位计数器信号的组合逻辑中,任意的毛刺都会复位计数器不能应用时序分析来决定最大的时钟频率不能应用时序分析来决定最大的时钟频率误用异步复位误用异步复位因此,异步复位信因此,异步复位信号只能在上电初始号只能在上电初始化的时候使用!化的时候使用!n补救方法:同步载入补救方法:同步载入“0000”。误用异步复位误用异步复位architecture two_seg_arch of mod10_counter issignal r_reg:unsigned(3 downto 0);signal r_next:unsigned(3 downto 0);begin -registerprocess(clk,reset)beginif(reset=1)then r_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logic r_next 0)when r_reg=9 else r_reg+1;-output logic q=std_logic_vector(r_reg);end two_seg_arch;n原则:不能插入逻辑(例如与门)来阻止时钟更新寄存器的值原则:不能插入逻辑(例如与门)来阻止时钟更新寄存器的值n时钟树是一种特殊的设计结构,不能被外部干涉。时钟树是一种特殊的设计结构,不能被外部干涉。n考虑一个带有使能信号的计数器,一种实现使能的方法是和考虑一个带有使能信号的计数器,一种实现使能的方法是和clk信号相与,如下图所示。信号相与,如下图所示。误用门控时钟误用门控时钟使用门控时钟来禁用触发器n存在的问题:存在的问题:en不能改变不能改变clk,有可能仅仅是减少触发器时钟的时钟脉冲宽度。,有可能仅仅是减少触发器时钟的时钟脉冲宽度。如果如果en易受毛刺影响,计数器可能会比预想的计数要多。易受毛刺影响,计数器可能会比预想的计数要多。由于时钟路径里面存在与门,会影响分布时钟树的构建和分析。由于时钟路径里面存在与门,会影响分布时钟树的构建和分析。误用门控时钟误用门控时钟n下面给出一种简单但不实用的解决方法。下面给出一种简单但不实用的解决方法。误用门控时钟误用门控时钟library ieee;use ieee.std_logic_1164.all;use;entity binary_counter isport(clk,reset:in std_logic;en:in std_logic;q:out std_logic_vector(3 downto 0);end binary_counter;architecture gated_clk_arch of binary_counter issignal r_reg:unsigned(3 downto 0);signal r_next:unsigned(3 downto 0);signal gated_clk:std_logic;begin -registerprocess(gated_clk,reset)beginif(reset=1)then r_reg 0);elsif(gated_clkevent and gated_clk=1)then r_reg=r_next;end if;end process;-gated clock-poor design practice gated_clk=clk and en;-next-state and output logic r_next=r_reg+1;q=std_logic_vector(r_reg);end gated_clk_arch;误用门控时钟误用门控时钟architecture two_seg_arch of binary_counter issignal r_reg:unsigned(3 downto 0);signal r_next:unsigned(3 downto 0);begin -registerprocess(clk,reset)beginif(reset=1)then r_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logic r_next=r_reg+1 when en=1 else r_reg;-output logic q=std_logic_vector(r_reg);end two_seg_arch;n下面给出一种更好的解决方法。下面给出一种更好的解决方法。n存在的问题:存在的问题:子系统可能会运行在不同的时钟频率。子系统可能会运行在不同的时钟频率。误用派生时钟误用派生时钟n原则:不要为一个慢的子系统派生一个慢的时钟原则:不要为一个慢的子系统派生一个慢的时钟n左图的问题在于这个系统不再同步了。派生时钟会增加时序分左图的问题在于这个系统不再同步了。派生时钟会增加时序分析的复杂度,致使我们不能再用前面简单的方法来分析了,我析的复杂度,致使我们不能再用前面简单的方法来分析了,我们必须把它视为两个不同频率和相位的时钟系统。们必须把它视为两个不同频率和相位的时钟系统。n考虑一个实现考虑一个实现“秒和分的计数器秒和分的计数器”功能的设计,假设它的输入时钟为功能的设计,假设它的输入时钟为1MHz。误用派生时钟误用派生时钟n一个使用派生时钟的设计例子如下:一个使用派生时钟的设计例子如下:误用派生时钟误用派生时钟library ieee;use ieee.std_logic_1164.cb;use;entity timer isport(clk,reset:in std_logic;sec,min:out std_logic_vector(5 downto 0);end timer;architecture multi_clock_arch of timer issignal r_reg:unsigned(19 downto 0);signal r_next:unsigned(19 downto 0);signal s_reg,m_reg:unsigned(5 downto 0);signal s_next,m_next:unsigned(5 downto 0);signal sclk,mclk:std_logic;begin -registerprocess(clk,reset)beginif(reset=1)then r_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logic r_next 0)when r_reg=999999 else r_reg+1;-output logic-clock has 50%duty cycle sclk=0 when r_reg 500000 else 1;n一个使用派生时钟的设计例子如下一个使用派生时钟的设计例子如下(续)(续)误用派生时钟误用派生时钟-second dividerprocess(sclk,reset)beginif(reset=1)then s_reg 0);elsif(sclkevent and sclk=1)then s_reg=s_next;end if;end process;-next-state logic s_next 0)when s_reg=59 else s_reg+1;-output logic(50%duty cycle)mclk=0 when s_reg 30 else 1;sec=std_logic_vector(s_reg);-minute dividerprocess(mclk,reset)beginif(reset=1)then m_reg 0);elsif(mclkevent and mclk=1)then m_reg=m_next;end if;end process;-next-state logic m_next 0)when m_reg=59 else m_reg+1;-output logic min=std_logic_vector(m_reg);end multi_clock_arch;n一种更好的使用同步一种更好的使用同步1个时钟脉冲的方法个时钟脉冲的方法误用派生时钟误用派生时钟architecture single_clock_arch of timer issignal r_reg:unsigned(19 downto 0);signal r_next:unsigned(19 downto 0);signal s_reg,m_reg:unsigned(5 downto 0);signal s_next,m_next:unsigned(5 downto 0);signal s_en,m_en:std_logic;begin -registerprocess(clk,reset)beginif(reset=1)then r_reg 0);s_reg 0);m_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;s_reg=s_next;m_reg=m_next;end if;end process;-next-state/output logic for mod-1000000 counter r_next 0)when r_reg=999999 else r_reg+1;s_en=1 when r_reg=500000 else 0;n一种更好的使用同步一种更好的使用同步1个时钟脉冲的方法(续)个时钟脉冲的方法(续)误用派生时钟误用派生时钟-next state logic/output logic for second divider s_next 0)when (s_reg=59 and s_en=1)else s_reg+1 when s_en=1 else s_reg;m_en=1 when s_reg=30 and s_en=1 else 0;-next-state logic for minute divider m_next 0)when (m_reg=59 and m_en=1)else m_reg+1 when m_en=1 else m_reg;-output logic sec=std_logic_vector(s_reg);min=std_logic_vector(m_reg);end single_clock_arch;n功耗现在已经成为一个主要的设计准则功耗现在已经成为一个主要的设计准则n在在CMOS工艺中,高时钟频率隐含着高速的开关频率,高速的工艺中,高时钟频率隐含着高速的开关频率,高速的开关频率令动态功耗增加。开关频率令动态功耗增加。n对时钟进行操作会减少开关转换的频率,但这个不能在寄存器对时钟进行操作会减少开关转换的频率,但这个不能在寄存器传输层实现。传输层实现。n恰当的流程如下:恰当的流程如下:设计、综合、验证常规的同步子系统。设计、综合、验证常规的同步子系统。使用特殊的电路(例如锁相环)来获得派生时钟使用特殊的电路(例如锁相环)来获得派生时钟使用使用“功耗优化功耗优化”的软件工具在一些寄存器上加上门控时的软件工具在一些寄存器上加上门控时钟钟功耗考虑功耗考虑n计数器会按照一系列的模式不断重复其内部状态计数器会按照一系列的模式不断重复其内部状态二进制计数器二进制计数器格雷码计数器格雷码计数器环形计数器环形计数器线性反馈移位寄存器(线性反馈移位寄存器(LFSR)BCD码计数器码计数器计数器计数器n状态会根据二进制计数序列来改变状态会根据二进制计数序列来改变n使用一个自增器来实现下一个状态使用一个自增器来实现下一个状态二进制计数器二进制计数器n每一次状态的变换,仅仅改变其中的一位每一次状态的变换,仅仅改变其中的一位n使用一个格雷码自增器使用一个格雷码自增器格雷码计数器格雷码计数器十进制数十进制数自然二进制数自然二进制数格雷码格雷码000000000100010001200100011300110010401000110501010111601100101701110100810001100910011101101010111111101111101211001010131101101114111010011511111000library ieee;use ieee.std_logic_1164.all;use;entity gray_counter4 isport(clk,reset:in std_logic;q:out std_logic_vector(3 downto 0);end gray_counter4;architecture arch of gray_counter4 isconstant WIDTH:natural:=4;signal g_reg:unsigned(WIDTH-1 downto 0);signal g_next,b,b1:unsigned(WIDTH-1 downto 0);begin -registerprocess(clk,reset)beginif(reset=1)then g_reg 0);elsif(clkevent and clk=1)cb g_reg=g_next;end if;end process;-next-state logic-gray to binary b=g_reg xor(0&b(WIDTH-1 downto 1);b1=b+1;-increment -binary to gray g_next=b1 xor(0&b1(WIDTH-1 downto 1);-output logic q=std_logic_vector(g_reg);end arch;格雷码计数器格雷码计数器n循环移动单个循环移动单个1,例如,例如4位的环形计数器:位的环形计数器:“1000”“0100”“0010”“0001”环形计数器环形计数器nN位的寄存器就有位的寄存器就有N个模式,输出也是个模式,输出也是N个相位的信号。个相位的信号。n在自我错误修复的设计中,在自我错误修复的设计中,“0001”在初始化的时候被插入在初始化的时候被插入library ieee;use ieee.std_logic_1164.all;entity ring_counter isport(clk,reset:in std_logic;q:out std_logic_vector(3 downto 0);end ring_counter;architecture reset_arch of ring_counter isconstant WIDTH:natural:=4;signal r_reg:std_logic_vector(WIDTH-1 downto 0);signal r_next:std_logic_vector(WIDTH-1 downto 0);begin -registerprocess(clk,reset)beginif(reset=1)then r_reg 1,others=0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logic r_next=r_reg(0)&r_reg(WIDTH-1 downto 1);-output logic q=r_reg;end reset_arch;环形计数器环形计数器n在自我错误修复的设计中,必须保证一个在自我错误修复的设计中,必须保证一个“1”总是在环形中总是在环形中循环。可以这样实现:检测高循环。可以这样实现:检测高3位,如果高位,如果高3位为位为“000”,则,则利用组合逻辑在它的最低位插入一个利用组合逻辑在它的最低位插入一个“1”。环形计数器环形计数器architecture self_correct_arch of ring_counter isconstant WIDTH:natural:=4;signal r_reg,r_next:std_logic_vector(WIDTH-1 downto 0);signal s_in:std_logic;begin -registerprocess(clk,reset)beginif(reset=1)then-no special input pattern is needed in this version-since the 1 is not circulated-its generated r_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logics_in=1 when r_reg(WIDTH-1 downto 1)=000 else 0;r_next=s_in&r_reg(WIDTH-1 downto 1);-output logic q=r_reg;end self_correct_arch;nLFSR是一个带有决定下一系列输入值的异或(是一个带有决定下一系列输入值的异或(XOR)反馈网)反馈网络移位寄存器络移位寄存器n仅有一部分的寄存器的位被用来进行异或操作,如果位的选择仅有一部分的寄存器的位被用来进行异或操作,如果位的选择恰当,恰当,N位的寄存器组成的位的寄存器组成的LFSR可以设计为可以设计为2n-1个状态循环。个状态循环。n下面是一个下面是一个4位的位的LFSR。线性反馈移位寄存器(线性反馈移位寄存器(LFSRLFSR)“1000”“0100”“0010”“1001”“1100”“0110”“1011”“0101”“1010”“1101”“1110”“1111”“0111”“0011”“0001”需要注意的是需要注意的是“0000”并没有并没有包含其中,如包含其中,如果出现了,则果出现了,则LFSR会被阻会被阻塞塞nLFSR的特性来源于有限域的理论的特性来源于有限域的理论n因为反馈表达式用因为反馈表达式用AND和和XOR操作来表示,所以使用线性项操作来表示,所以使用线性项定义一个线性代数系统。定义一个线性代数系统。n除了除了“2n-1个状态个状态”的性质之外,的性质之外,LFSR还具有以下性质:还具有以下性质:对于任意对于任意n,反馈网络都会生成最大的状态数目。,反馈网络都会生成最大的状态数目。输出的序列是伪随机的,存在一定的统计特性和随机特性输出的序列是伪随机的,存在一定的统计特性和随机特性线性反馈移位寄存器(线性反馈移位寄存器(LFSRLFSR)nLFSR的应用的应用伪随机序列:用于测试数据的编码和解码伪随机序列:用于测试数据的编码和解码简单的简单的“next-state logic”计数器计数器n例如,一个例如,一个128位的位的LFSR使用使用3个个XOR门可以产生门可以产生2128-1种种模式,对于一个模式,对于一个100GHz的系统,需要的系统,需要1012年的时间年的时间线性反馈移位寄存器(线性反馈移位寄存器(LFSRLFSR)library ieee;use ieee.std_logic_1164.all;entity lfsr4 isport(clk,reset:in std_logic;q:out std_logic_vector(3 downto 0);end lfsr4;architecture no_zero_arch of lfsr4 issignal r_reg,r_next:std_logic_vector(3 downto 0);signal fb:std_logic;constant SEED:std_logic_vector(3 downto 0):=0001;begin -registerprocess(clk,reset)beginif(reset=1)then r_reg=SEED;elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logic fb=r_reg(1)xor r_reg(0);r_next=fb&r_reg(3 downto 1);-output logic q=r_reg;end no_zero_arch;线性反馈移位寄存器(线性反馈移位寄存器(LFSRLFSR)n下面将利用二进制计数器来实现下面将利用二进制计数器来实现PWM调制。调制。n脉宽调试(脉宽调试(PWM)占空比:信号有效所占的时间百分比占空比:信号有效所占的时间百分比计数器应用例子计数器应用例子nPWM使用一个信号使用一个信号w来表示占空比:来表示占空比:当当w不为不为“0000”时,占空比为时,占空比为w/16当当w为为“0000”时,占空比为时,占空比为16/16计数器应用例子计数器应用例子library ieee;use ieee.std_logic_1164.all;use;entity pwm isport(clk,reset:in std_logic;w:in std_logic_vector(3 downto 0);pwm_pulse:out std_logic );end pwm;architecture two_seg_arch of pwm issignal r_reg:unsigned(3 downto 0);signal r_next:unsigned(3 downto 0);signal buf_reg:std_logic;signal buf_next:std_logic;begin -register&output bufferprocess(clk,reset)beginif(reset=1)then r_reg 0);buf_reg=0;elsif(clkevent and clk=1)then r_reg=r_next;buf_reg=buf_next;end if;end process;-next-state logic r_next=r_reg+1;-output logic buf_next=1 when(r_regunsigned(w)or(w=0000)else 0;-buffered to remove glitches pwm_pulse=buf_reg;end two_seg_arch;n寄存器由于体积太大而不能作为大存储空间。而寄存器由于体积太大而不能作为大存储空间。而RAM因为因为其体积较小,更适合用来作为较大的存储空间。其体积较小,更适合用来作为较大的存储空间。n寄存器在数字系统中,通常用来构建小而快速的临时存储空寄存器在数字系统中,通常用来构建小而快速的临时存储空间,例如:间,例如:寄存器文件寄存器文件寄存器充当快速临时存储寄存器充当快速临时存储n寄存器文件寄存器文件寄存器以一维排列寄存器以一维排列每个寄存器以地址作为标识每个寄存器以地址作为标识通常有一个写入端口(带有使能信号)和两个或者更多的读通常有一个写入端口(带有使能信号)和两个或者更多的读取端口取端口寄存器文件寄存器文件n作为例子,下图为一个带有作为例子,下图为一个带有1个写入端口,两个读取端口的个写入端口,两个读取端口的4字大小的寄存器文件字大小的寄存器文件寄存器文件寄存器文件n译码器译码器decoder用来分配使能信号,选择器用来分配使能信号,选择器Mux用来选择用来选择输出的数据。输出的数据。寄存器文件寄存器文件n译码器电路的工作方式如下:译码器电路的工作方式如下:当当wr_en=0时,输出时,输出“0000”当当wr_en=1时,根据时,根据w_addr的值使某一位有效的值使某一位有效library ieee;use ieee.std_logic_1164.all;entity reg_file isport(clk,reset:in std_logic;wr_en:in std_logic;w_addr:in std_logic_vector(1 downto 0);w_data:in std_logic_vector(15 downto 0);r_addr0,r_addr1:in std_logic_vector(1 downto 0);r_data0,r_data1:out std_logic_vector(15 downto 0);end reg_file;architecture no_loop_arch of reg_file isconstant W:natural:=2;-#of bits in addressconstant B:natural:=16;-#of bits in datatype reg_file_type is array(2*W-1 downto 0)of std_logic_vector(B-1 downto 0);signal array_reg:reg_file_type;signal array_next:reg_file_type;signal en:std_logic_vector(2*W-1 downto 0);寄存器文件(一)寄存器文件(一)begin -registerprocess(clk,reset)beginif(reset=1)then array_reg(3)0);array_reg(2)0);array_reg(1)0);array_reg(0)0);elsif(clkevent and clk=1)then array_reg(3)=array_next(3);array_reg(2)=array_next(2);array_reg(1)=array_next(1);array_reg(0)=array_next(0);end if;end process;-enable logic for registerprocess(array_reg,en,w_data)begin array_next(3)=array_reg(3);array_next(2)=array_reg(2);array_next(1)=array_reg(1);array_next(0)=array_reg(0);if(en(3)=1)then array_next(3)=w_data;end if;if(en(2)=1)then array_next(2)=w_data;end if;if(en(1)=1)then array_next(1)=w_data;end if;if(en(0)=1)then array_next(0)=w_data;end if;end process;寄存器文件寄存器文件(二二)-decoding for write addressprocess(wr_en,w_addr)beginif(wr_en=0)then en 0);elsecase w_addr iswhen 00=en en en en=1000;end case;end if;end process;-read multiplexingwith r_addr0 select r_data0=array_reg(0)when 00,array_reg(1)when 01,array_reg(2)when 10,array_reg(3)when others;with r_addr1 select r_data1=array_reg(0)when 00,array_reg(1)when 01,array_reg(2)when 10,array_reg(3)when others;end no_loop_arch;寄存器文件寄存器文件(三三)

    注意事项

    本文(数字系统设计教学资料-第四章时序逻辑电路.ppt)为本站会员(wuy****n92)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开