VHDL脉冲丢失

2020-02-17 19:58发布

本帖最后由 cdcc0606 于 2015-1-26 21:19 编辑

我的输入是一个频率可变的方波。然后要求输出是固定脉冲宽度为660us的方波,不管输入频率是多少。我的程序总是会在一段时间过后丢失其中一个输出脉冲,请问这是为什么呢?我的程序如下。
  1. library ieee;
  2. use ieee.std_logic_1164.all;

  3. -------------------------------------------------------------------------------
  4. --! top_sensors entity declaration
  5. -------------------------------------------------------------------------------
  6. entity top_sensors is
  7.         port
  8.         (
  9.                 -- Input ports
  10.                 reset          : in std_logic;                                --! system clock
  11.                 clk          : in std_logic;          --! signal reset
  12.                 I1           : in std_logic;                                --! pulse sensor 1
  13.                 -- Output ports
  14.                 Top_Tour_T1 : out std_logic                --! Top round sensor 1 output is fixed for 660us
  15.         );
  16.        
  17.        
  18. end entity top_sensors;

  19. -------------------------------------------------------------------------------
  20. --! top_sensors architecture declaration
  21. -------------------------------------------------------------------------------
  22. architecture behavior of top_sensors is
  23. signal flag1: integer RANGE 0 TO 2:=0;                --! verify the end of the 660us top1
  24. signal cpt1: integer RANGE 0 TO 33000:=0;        --! 660us=> 660/0.02us=33000: counter clk FPGA=33000
  25.         begin
  26.         ----------------------------------------------------------------------------
  27.         --! [url=home.php?mod=space&uid=247401]@brief[/url]         generate top round for each sensor
  28.         --! @detail        each top is fixed for 660us
  29.         ----------------------------------------------------------------------------
  30.                 process(clk, reset)
  31.                 begin
  32.                 if reset='0' then
  33.                         Top_Tour_T1 <= '0';
  34.                         cpt1<=0;
  35.                 elsif rising_edge(clk)then
  36.                         --if I1=0=>I1=1
  37.                         if(I1='1')and (cpt1=0)then
  38.                                 Top_Tour_T1<='1';
  39.                                 cpt1<=1;
  40.                         end if;
  41.                         --begin the counter 330000 pour 660us
  42.                         if(cpt1>0)and (cpt1<33000)then
  43.                                 cpt1<=cpt1+1;
  44.                                 if(I1='0')then
  45.                                 elsif(I1='1')and (flag1=1)then
  46.                                         cpt1<=0;
  47.                                         Top_Tour_T1<='0';
  48.                                         flag1<=0;
  49.                                 end if;       
  50.                         --after 660us, top disappear
  51.                         end if;
  52.                         if(cpt1=33000)then
  53.                                 if(I1='0')then
  54.                                         cpt1<=0;
  55.                                 end if;
  56.                                 Top_Tour_T1<='0';
  57.                         end if;
  58.                 end if;
  59.                
  60.                 end process;
  61.                
  62.                
  63. end architecture behavior;
复制代码
  
0条回答

一周热门 更多>