在昨天和今天之后,我设法解决了一些问题,但我又被卡住了。 在进行计数器时,我已经设置了一个循环,使其从1到53计数,然后再次重置为零。当检查它是否正常工作时会出现问题我启动测试台并且信号根本没有更新。
-- Process incorporated in vhdl
entity semaforo is
Port ( sensor : in STD_LOGIC;
clk : in STD_LOGIC;
rst_n : in STD_LOGIC;
light_highway : out STD_LOGIC_VECTOR (2 downto 0);
light_farm : out STD_LOGIC_VECTOR (2 downto 0));
end semaforo;
architecture Behavioral of semaforo is
signal cuenta: std_logic_vector(6 downto 0):="0000000";
begin
flip_flop: process (clk, rst_n)
begin
if (rst_n='0') then
light_highway <="001";
light_farm <="100";
elsif (clk'event and clk='1') then
if (sensor='1') then
light_highway<="010";
end if;
end if;
end process;
contador : process (clk, rst_n)
begin
if rst_n = '0' then
cuenta <= (others => '0');
elsif rising_edge(clk) then
if sensor = '1' then
if cuenta < 53 then
cuenta <= cuenta + 1;
else
cuenta <= (others => '0');
end if; -- count/wrap
end if; -- clock enable
end if; -- async reset/clock
end process;
end Behavioral;
如果您删除了for并直接更新了计数器,如果它可以工作但是我需要计数器从第一次传感器开始累加=&#39; 1&#39;并且一旦帐户启动它就不会停止(即使传感器发出信号),直到达到极限。 还附上了测试平台。
答案 0 :(得分:1)
此代码无法编译。但是,您的基本问题是进程如何工作以及循环。该过程继续执行直到它暂停(在这种情况下,在结束时)。当执行命中变量赋值时,变量立即更新。当执行命中信号时,分配计划在将来的某个时间点进行,在进程暂停之后。查找增量周期和调度模型。
因此,在这种情况下,整个循环在一个激活过程期间,在时钟上升沿执行。对account
的每个预定(&#39;非阻止&#39;)分配只是将之前的预定分配覆盖到account
。对account
的最后一次分配获胜,因此当我们到达流程结束时,调度程序只有一个预定的分配:它将{0}分配给account
。
修改强>
我认为您只是要求一个6位计数器,具有异步复位,计数启用和环绕。下面的通用代码。请注意,这需要VHDL 2008回读account
输出以增加它。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity E is
port(
clk : in std_logic;
rst_n : in std_logic;
sensor : in std_logic;
account : out unsigned(5 downto 0));
end entity E;
architecture A of E is
begin
counter : process (clk, rst_n)
begin
if rst_n = '0' then
account <= (others => '0');
elsif rising_edge(clk) then
if sensor = '1' then
if account < 53 then
account <= account + 1;
else
account <= (others => '0');
end if; -- count/wrap
end if; -- clock enable
end if; -- async reset/clock
end process;
end architecture A;
答案 1 :(得分:0)
VHDL没有像c ++这样的循环。删除循环语句。每次CLK上升沿发生时你的计数器都会计数。