无法模拟我的VHDL代码

时间:2014-02-14 19:36:53

标签: vhdl simulation

我正在为我的问题寻找原因或答案: 我的VHDL代码正在工作,我正在尝试创建一个10分频器。 问题是模拟报告不断给我一个未定义的输出(没有值)。

这是我的VHDL代码,我非常感谢任何帮助!谢谢!

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity Frequency_divider is 
port(clk: in std_logic;
     Q:out std_logic);
end Frequency_divider;

architecture desc_freq_divider_10 of Frequency_divider is 


signal S: std_logic:='0';
begin

process(clk,S)
    variable cpt: integer:=0;
    begin

        if (rising_edge(clk)) then 
            cpt:=cpt+1;
        end if;

        if (cpt=5) then 
            S<=not(S);
            cpt:=0;
        end if;

    end process;    
    Q<=S;
end desc_freq_divider_10;       

2 个答案:

答案 0 :(得分:1)

我摆脱了无关的使用条款:

--use ieee.std_logic_arith.all;
--use ieee.std_logic_unsigned.all;

增加了一个测试平台:

library ieee;
use ieee.std_logic_1164.all;

entity freq_test is
end entity;

architecture tb of freq_test is
    signal CLK:     std_logic :='0';
    signal Q:       std_logic;
begin

CLOCK:
    process
    begin
        if Now < 300 ns then
            wait for 10 ns;
            clk <= not clk;
        else
            wait;
        end if;
    end process;
DUT:
    entity work.frequency_divider
        port map (clk,q);
end architecture;

分析了所有这些内容,详细阐述并模拟并使其发挥作用。

freq_test output divide by 10

它表示您的代码功能正常,并且您可能会发生工具链使用错误。

答案 1 :(得分:1)

仿真应该没问题,正如David Koontz所描述的那样,但对于可综合设计,该过程在灵敏度列表中应该只有clk,并且应该在if语句中包含所有更新,如:

process(clk)
  variable cpt : integer range 0 to 5 := 0;  -- Must be constrained for synthesis
begin
  if (rising_edge(clk)) then
    cpt := cpt+1;
    if (cpt = 5) then
      S   <= not(S);
      cpt := 0;
    end if;
  end if;
end process;

另一种设计可能会推断锁存和类似问题。

2014-02-17编辑:在cpt整数上添加了约束,因为合成无法计算出最小的大小,因此会产生太多的触发器。