Делитель часов VHDL: счетчик — рабочий цикл

Я новичок в VHDL. Мне дали этот код о том, как генерировать тактовый сигнал 1 Гц (рабочий цикл 50%) из входного тактового сигнала 24 МГц. У меня есть несколько вопросов для уточнения.

  1. Как выбирается лимит счетчика? в приведенном ниже случае 12000000. Каким будет этот предел, если я хочу генерировать тактовый сигнал 8 Гц.
  2. Как следует настроить код, если я хочу изменить рабочий цикл на 80%?

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    entity clock is
       port ( CLKin: in std_logic;
              reset: in std_logic;
              CLKout: out std_logic);
    end clock;
    architecture arch of clock is
    
      signal counter: integer:=0;
      signal temp : std_logic := '1';
    begin
    process(CLKin,counter,reset)
    begin
       if(reset='0') then counter<=0; temp<='1';
        elsif(CLKin'event and CLKin='1') then counter <=counter+1;
         if (counter = 12000000) then temp <= NOT temp; counter<=0;
         end if;
        end if;
       CLKout <= temp;
    end process;
    end arch;
    

person Fatima    schedule 24.02.2013    source источник


Ответы (1)


Вы хотите разделить тактовую частоту 24 МГц, то есть 24000000 Гц, на 1 Гц. Таким образом, вы создаете счетчик, который будет подсчитывать каждый нарастающий фронт сигнала CLKin (24 МГц). После 24000000/2=12000000 счетов вы находитесь в середине. Здесь вы изменяете значение уровня выходного сигнала (temp <= not temp). Потому что вы говорите, что рабочий цикл должен быть 50%. При этом вы также начинаете считать снова с самого начала.

Для 8 МГц у вас есть счетчик (24000000/8)/2 = 1500000.

И небольшое замечание: лучше использовать библиотеку ieee.numeric_std, чем ieee_logic_arith и ieee.std_logic_unsigned

Примечание: сначала код присваивается сигналу signaltemp. А затем сигнал temp на выход clkout. Причина этого в том, что в VHDL не разрешено читать из выходного порта (clkout). И вы должны читать из него при выполнении output <= not output;. Из сигнала разрешено чтение.

И еще одно замечание: в списке чувствительности процесса нет необходимости иметь там сигнал counter.

process(CLKin, reset) -- no counter needed

И еще... Подсчет 12000000 циклов: 0 -> (12000000-1) = 11999999

person vermaete    schedule 24.02.2013