Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1049932
  • 博文数量: 178
  • 博客积分: 10222
  • 博客等级: 上将
  • 技术积分: 2215
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-03 11:27
个人简介

有所追求

文章分类

全部博文(178)

文章存档

2012年(1)

2011年(5)

2010年(3)

2009年(78)

2008年(91)

我的朋友

分类:

2009-03-14 21:54:38

很多朋友对下面这段的同步电路程序搞不明白,其实这跟VHDL进程的特性还有数电知识有关,请看代码及分析:

library ieee;

use ieee.std_logic_1164.all;

entity dou is

    port(din,clk:in std_logic;    

         dout:out std_logic);

end dou;

 

architecture beha of dou is

signal x,y:std_logic;

begin

    process(clk)

    begin  

        if clk'event and clk='1' then         

            x<=din;        

            y<=x;

        end if;

        dout<=x and (not y);

end process;

end beha;

    有必要声明一下:这里是对输入的单个脉冲(非多个)进行整形的!!!

    dout<=x and (not y);这一句放在进程内外都可以。

    这是一个同步整形电路,在进程中,信号不是在改变值之后立即变化的,其他语句使用的还是该信号的旧值(未执行进程时的值),所以假设y=0,那么在时钟的上升沿:

如果:

    din="1"小于一个时钟宽:则有x=1,y=0(虽然进程中改变了值,但不会立即被使用);

    则有dout=x and (not y)=1 and (not 0)=1;

如果:

    din="1"超过一个时钟宽:则有x=1,y=1(前次执行进程后,y的值已经改变为‘1’了);

    则有dout=x and (not y)=1 and (not 1)=0;

    如果din在时钟周期内出现抖动,则因为不执行进程,所以输出无影响,还是被整成一个时钟宽度。

    所以不管是长按还是短按你的键,有效高电平宽度等于时钟。

阅读(1153) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~