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