我遇到此代码的问题。理论上它应该把我的50MHz标志变成36KHz,但是当我运行模拟时,结果是ir_38khz没有得到任何未分配的值。
你可以帮助我滑倒吗?
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.all;
entity orajelKonverter is
Port ( clk50 : in STD_LOGIC;
rst : in STD_LOGIC;
ir_38khz : out STD_LOGIC);
end orajelKonverter;
architecture Behavioral of orajelKonverter is
signal hz38_ctr : STD_LOGIC_VECTOR(9 downto 0);
signal s38 : std_logic;
begin
clk_generator : process (clk50, rst)
begin
if rst = '1' then
s38 <= '0';
hz38_ctr <= (others => '0');
elsif clk50='1' then
if hz38_ctr = "1010010010" then
hz38_ctr <= (others => '0');
s38 <= not s38;
else
hz38_ctr <= hz38_ctr + "1";
end if;
end if;
end process clk_generator;
ir_38khz <= s38;
end Behavioral;
以下是模拟的图片: the problem itself http://i62.tinypic.com/ri6tn7.jpg
答案 0 :(得分:3)
您需要将信号初始化为某个值或声明复位以在模拟中初始化它们。我个人更喜欢#1,因为信号初始条件是可合成的,尽管相对常见的误解是它们不是。事实上,除非我绝对需要使用它们,否则我会避免设计中的重置。这实际上是recommended by Xilinx。例如,您可以这样做:
signal s38 : std_logic := '0';
这将保证在您的模拟开始时它知道如何处理该行:
s38 <= not s38;
以前,模拟器正在尝试not U
U
。
答案 1 :(得分:0)
我认为有3个问题:
您需要将重置从1移至0,以便重置计数器并初始化信号s38。不要在过程外初始化信号,而是使用复位信号创建复位条件。
您需要检测50 MHz的上升沿:
clk_generator: process (clk50, rst)
begin
if rst = '1' then
s38 <= '0';
hz38_ctr <= (others => '0');
elsif (clk50'event and (clk50='1')) then
if hz38_ctr = "1010010010" then
hz38_ctr <= (others => '0');
s38 <= not s38;
else
hz38_ctr <= hz38_ctr + "1";
end if;
end if;
end process clk_generator;
最好减少计数器的大小。