我正在为我的问题寻找原因或答案: 我的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;
答案 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;
分析了所有这些内容,详细阐述并模拟并使其发挥作用。
它表示您的代码功能正常,并且您可能会发生工具链使用错误。
答案 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
整数上添加了约束,因为合成无法计算出最小的大小,因此会产生太多的触发器。