用于将50MHz转换为38KHz的VHDL代码

时间:2014-11-18 17:28:47

标签: 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;
           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

2 个答案:

答案 0 :(得分:3)

您需要将信号初始化为某个值或声明复位以在模拟中初始化它们。我个人更喜欢#1,因为信号初始条件可合成的,尽管相对常见的误解是它们不是。事实上,除非我绝对需要使用它们,否则我会避免设计中的重置。这实际上是recommended by Xilinx。例如,您可以这样做:

signal s38 : std_logic := '0';

这将保证在您的模拟开始时它知道如何处理该行:

s38 <= not s38;

以前,模拟器正在尝试not U U

答案 1 :(得分:0)

我认为有3个问题:

  1. 您需要将重置从1移至0,以便重置计数器并初始化信号s38。不要在过程外初始化信号,而是使用复位信号创建复位条件。

  2. 您需要检测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;
    
  3. 最好减少计数器的大小。