VHDL我的计时器不工作

VHDL我的计时器不工作,vhdl,Vhdl,我的FPGA中有一个25MHz时钟,我想制作一个计时器,当它计数60秒时返回“1”。但我有两个问题: 我不明白为什么我的输出信号“计数出击”在Vivado中模拟时没有定义 为了强制定义我的信号计数架次,我在测试台文件中添加“:=0”进行模拟,但“计数架次”在60秒延迟后保持等于“0” 以下是我的VHDL文件: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.all; use

我的FPGA中有一个25MHz时钟,我想制作一个计时器,当它计数60秒时返回“1”。但我有两个问题:

  • 我不明白为什么我的输出信号“计数出击”在Vivado中模拟时没有定义
  • 为了强制定义我的信号计数架次,我在测试台文件中添加“:=0”进行模拟,但“计数架次”在60秒延迟后保持等于“0”
以下是我的VHDL文件:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.all;
    use IEEE.STD_LOGIC_UNSIGNED.all;


    entity count is
        Port ( clk : in  STD_LOGIC;
               count_entree : in STD_LOGIC;
               count_sortie : out STD_LOGIC
              );
    end count;

    architecture Behavioral of count is

    signal q : integer range 0 to 30000000 :=0;

    begin

        process(clk)
        begin
        if (clk'event and clk='1')
        then 

              while ((count_entree = '1') and (q < 25000000)) loop

                 if (q < 25000000) then

                      q := q + 1;
                      count_sortie <= '0';  
                 else 

                    count_sortie <= '1';

                 end if;
              end loop;
        end if;
        end process;

    end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_ARITH.all;
使用IEEE.STD_LOGIC_UNSIGNED.all;
实体计数为
端口(时钟:在标准逻辑中;
计数中心:标准逻辑;
计数架次:超出标准逻辑
);
结束计数;
计数的结构是
信号q:整数范围0至30000000:=0;
开始
过程(clk)
开始
如果(clk'事件和clk='1')
然后
而((count_entre='1')和(q<25000000))循环
如果(q<25000000),则
q:=q+1;
计数出动次数计数主菜,
计数出动=>计数出动
);
--时钟进程定义
clk_流程:流程
开始

clk除了我对您的语法无效的评论之外,也就是说,
q
是一个信号还是一个变量存在混淆,下面的代码不会达到您预期的效果:

while ((count_entree = '1') and (q < 25000000)) loop
    if (q < 25000000) then
        q := q + 1;
        count_sortie <= '0';  
    else 
        count_sortie <= '1';
    end if;
end loop;
while((count_entre='1')和(q<25000000))循环
如果(q<25000000),则
q:=q+1;

计数出动次数没有人真正回答你的问题:

  • 我不明白为什么我的输出信号“计数出击”在Vivado中模拟时没有定义
  • 为了强制定义我的信号计数架次,我在测试台文件中添加“:=0”进行模拟,但“计数架次”在60秒延迟后保持等于“0”
使用变量赋值
:=
编写时,您的设计说明不是有效的VHDL

也许值得重新审视警告信息,那里发生的事情应该是显而易见的。实例化的
count
标记的
uut
在测试台
tbcount
中解除绑定,其输出信号未被驱动。就测试台而言,没有
计数的实例化

至于未问到的问题“如何让它工作”

正如Jonathan所指出的,您的代码在任何情况下都不能做您希望它做的事情。Jonathan对while循环所做的解释基本上是正确的,即使实例化了
uut
,您的进程也不会按预期工作

基本思想是计数,直到
q
达到25000000,并设置输出
count\u出动次数。请注意,评估25000000将实际为
count\u出动次数增加额外的时钟延迟

if clk'event and clk = '1' then
    if q /= 24999999 and count_entree = '1' then
        q <= q + 1;
    end if;
    if q = 24999999 then
        count_sortie <= '1';
    else 
        count_sortie <= '0';
    end if;
end if;
q
应在灵敏度列表中。还请注意,整数
q
的范围只需要从其最左边的赋值扩展到最右边的赋值

为了演示这一点,我将所有计数值除以100000(为了演示目的,可以在所有三个位置将数字文字250设置为25000000):

计数的架构是
信号q:整数范围0至250;
开始
计时器:
过程(时钟,q)
开始
如果clk'事件和clk='1',则
如果q/=250,计数主菜=1,则

请看这个非常相似的问题和答案:在count的行为体系结构中,行
q:=q+1
在语法上是错误的。如果
q
确实是一个信号,它需要一个信号分配(
你的答案非常有用。我解决了我的问题,但我不知道为什么我的计数器没有在我的测试台文件中实例化。我没有发现错误:(通常是分析顺序,或者是因为某些内容没有分析到同一个工作库中,并且该库不可用。但是根据您的说法,我的VHDL代码是有效的?谢谢您的帮助:)您的原始测试台tbcount有效。原始实例化组件计数有缺陷Jonathan和我解决了,流程有缺陷。好的,我想确认一下(我的英语不好)。我感谢您的支持Jonathan和您^^
if clk'event and clk = '1' then
    if q /= 24999999 and count_entree = '1' then
        q <= q + 1;
    end if;
    if q = 24999999 then
        count_sortie <= '1';
    else 
        count_sortie <= '0';
    end if;
end if;
if clk'event and clk = '1' then
    if q /= 25000000 and count_entree = '1' then
        q <= q + 1;
    end if;
end if;
if q = 25000000 then
    count_sortie <= '1';
else 
    count_sortie <= '0';
end if;
architecture behavioral of count is

    signal q: integer range 0 to 250 ;

begin

timer: 
    process (clk,q)
    begin
        if clk'event and clk = '1' then
            if q /= 250 and count_entree = '1' then
                q <= q + 1;
            end if;
        end if;
        if q = 250 then
            count_sortie <= '1';
        else 
            count_sortie <= '0';
        end if;
     end process;

end architecture;