用于将50MHz转换为38KHz的VHDL代码';行不通

用于将50MHz转换为38KHz的VHDL代码';行不通,vhdl,Vhdl,我对这个代码有问题。理论上,它应该将我的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;

我对这个代码有问题。理论上,它应该将我的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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
使用IEEE.NUMERIC_STD.all;
实体OraJetConverter是
端口(clk50:标准逻辑中;
rst:标准逻辑中;
ir_38khz:输出标准_逻辑);
末端或转位器;
orajelKonverter的架构是
hz38信号中心:标准逻辑向量(9到0);
信号s38:std_逻辑;
开始
clk_发生器:过程(clk50,rst)
开始
如果rst='1',则

s38您需要将信号初始化为某个值,或者在模拟中断言重置以初始化它们。我个人更喜欢#1,因为信号初始条件是可合成的,尽管相对普遍的误解是它们不是。事实上,我在设计中避免重置,除非我绝对需要使用它们。事实上,这是。例如,你可以做:

signal s38 : std_logic := '0';
这将保证当模拟开始时,它知道如何处理线:

s38 <= not s38;

s38使用
上升沿(clk50)
而不是检测其电平为“1”。。。我也会使用一个范围整数作为计数器…Brian我尝试使用上升沿(clk50),但结果与以前一样。如果在“实例和进程”窗口中打开DUT,您可以将其所有信号添加到sim卡(并重新启动/重新运行)。看到里面发生了什么可能会告诉你出了什么问题。否(初始值),但是重置。。。重置子句将正确地执行此操作。。。只要他真的在测试台上将重置驱动到“1”并返回到“0”。@BrianDrummond,我不同意使用重置。阅读我在回答中添加的Xilinx白皮书。我用这种哲学来处理我的设计。有趣的是,我没有看过那篇论文。重置仍然有它们的位置,您不必总是为了重置而重新配置。但是肯确实提出了很好的观点,并且很好地解决了重设大型设计的问题。