Logic VHDL:计数器检查

Logic VHDL:计数器检查,logic,signals,vhdl,counter,Logic,Signals,Vhdl,Counter,我想检测到CPLD的外部信号连接(仅连接或未连接)。我的系统时钟为1MHz,外部信号为4KHz。我开发了一种逻辑,可以检测外部信号的上升沿并启动计数器。如果计数器正在计数,则连接外部信号;如果计数器未计数,则不连接外部信号。我写的代码,但它不工作,有什么问题吗?我是VHDL的初学者。请帮助,如何检查vhdl中运行的计数器 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all; use IEEE.STD_LOGIC_

我想检测到CPLD的外部信号连接(仅连接或未连接)。我的系统时钟为1MHz,外部信号为4KHz。我开发了一种逻辑,可以检测外部信号的上升沿并启动计数器。如果计数器正在计数,则连接外部信号;如果计数器未计数,则不连接外部信号。我写的代码,但它不工作,有什么问题吗?我是VHDL的初学者。请帮助,如何检查vhdl中运行的计数器

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity SYNC_detection1 is
Port (  SYNC        : in  STD_LOGIC;
            CLK     : in  STD_LOGIC;
            EDGE        : out  STD_LOGIC;
            OUTPUT  : out  STD_LOGIC;
            BITSOUT : out  STD_LOGIC_VECTOR (3 downto 0)
                );
end SYNC_detection1;

architecture workingarchi of SYNC_detection1 is

signal SYNC_reg : std_LOGIC := '0';
signal SYNC_edge : std_LOGIC := '0';
signal TEMP : std_LOGIC := '0';
signal counter : STD_LOGIC_VECTOR (3 downto 0);

begin

SYNC_edge_p : process(CLK) 
begin
    if (rising_edge(CLK)) then
        SYNC_reg <= SYNC;
    end if;
end process;

SYNC_edge <= not SYNC_reg and SYNC;

counter_p: process(CLK) 
begin
    if (rising_edge(CLK)) then
        if SYNC_edge = '1' then
            counter <= counter + 1; 
                if (counter = "0000") then
                TEMP <= '1';
                end if;
        end if;
    end if;
end process;

OUTPUT <= TEMP;
BITSOUT <= counter;
EDGE <= SYNC_edge;
end workingarchi;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用ieee.numeric_std.all;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体同步\u检测1为
端口(同步:在STD_逻辑中;
CLK:标准逻辑中;
边缘:输出标准逻辑;
输出:输出标准逻辑;
比特输出:输出标准逻辑向量(3到0)
);
结束同步检测1;
同步检测1的架构工作架构为
信号同步寄存器:标准逻辑:='0';
信号同步_边缘:标准_逻辑:='0';
信号温度:标准逻辑:='0';
信号计数器:标准逻辑向量(3到0);
开始
同步边缘:进程(CLK)
开始
如果(上升沿(CLK)),则

SYNC_reg如果您只想检查计数器是否正在运行,而不想编写测试台(顺便说一句,您应该这样做),您可以设置一个If条件,如果计数器等于1,则打开电路板上的led。大概是这样的:

if counter = "0001" then
  led <= '1';
end if;
如果计数器=“0001”,则

led首先,您正在管理一个外部时钟,并希望使用1MHz内部时钟处理它,对于此应用程序,您必须使用同步块

我将按以下程序进行。 将外部同步信号作为时钟进行管理,并使用它计算上升沿, 另一个技巧是避免使用std_logic_vector进行计数(使用integer进行计数以使代码更具可读性)

IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用ieee.numeric_std.all;
实体同步\u检测1为
端口(同步:在STD_逻辑中;
边缘:输出标准逻辑;
输出:输出标准逻辑;
比特输出:输出标准逻辑向量(3到0)
);
结束同步检测1;
同步检测1的架构工作架构为
信号同步_边缘:标准_逻辑:='0';
信号温度:标准逻辑:='0';
信号计数器:整数:=0;
开始
同步边缘:进程(同步)
开始

请澄清您到底想要什么作为输出。因为
如果SYNC\u edge='1',那么计数器您是否编写了测试台?它是否按照您的模拟预期工作?@Rakend计数器在SYNC_edge上计数,而不是SYNC,它检测到同步的上升沿signal@Rakend温度是输出的,我传递进程的输出。我陷入了逻辑实现。我如何检查计数器是否运行了一段时间。@Yes。这就是我写的
计数器
表示在
同步
上出现的上升沿数,只要
同步
较高,它就不计数。由于
SYNC
是脉动信号,因此可以使用
SYNC
作为要检测的信号。因此,当有更高的时钟可用时,使用该时钟。不建议使用“将外部同步信号作为时钟管理”。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

entity SYNC_detection1 is
Port (  SYNC        : in  STD_LOGIC;
            EDGE        : out  STD_LOGIC;
            OUTPUT  : out  STD_LOGIC;
            BITSOUT : out  STD_LOGIC_VECTOR (3 downto 0)
                );
end SYNC_detection1;

architecture workingarchi of SYNC_detection1 is


signal SYNC_edge : std_LOGIC := '0';
signal TEMP : std_LOGIC := '0';
signal counter : integer := 0;

begin

SYNC_edge_p : process(SYNC) 
begin
    SYNC_edge <= '0';
    if (rising_edge(SYNC)) then
        counter <= counter + 1; 
        SYNC_edge <= '1';
        if (counter = 0) then
            TEMP <= '1';
        end if;
    end if;
end process;

    OUTPUT <= TEMP;
    BITSOUT <= std_logic_vector(to_unsigned(counter, BITSOUT'length));
    EDGE <= SYNC_edge;

end workingarchi;
library ieee;
use ieee.std_logic_1164.all;

entity edge_sync is
    port(
         data    : in std_logic;
         clk_src : in std_logic;
         clk_dst : in std_logic;
         line_out: out std_logic
    );

end edge_sync;


architecture beha of edge_sync is

    component ff_D is
        port(   
                lineD : in std_logic;
                clk   : in std_logic;
                lineQ : out std_logic
        );
    end component ff_D;    

   signal input_s : std_logic := '0';
   signal meta  : std_logic:= '0';
   signal Q2_D3 : std_logic:= '0';
   signal Q3    : std_logic:= '0';

begin

   FFsrc  : ff_D port map (
                  lineD => input_s,
                  clk => clk_src,
                  lineQ => meta
              ); 

   FFdst1 : ff_D port map(
                  lineD => meta,
                  clk   => clk_dst  ,
                  lineQ => Q2_D3
              );

   FFdst2 : ff_D port map(
                  lineD => Q2_D3,
                  clk   => clk_dst  ,
                  lineQ => Q3
              );

   input_s <= data;

   line_out <=   (not Q3)  and Q2_D3;

end beha;