Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Стробирование с помощью ПЛИС
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Грендайзер
Всем добра rolleyes.gif Вопросик такой : имеется плис ссыклон4. С её ножки должен выходить строб частотой 100Гц(Т=10мс) и скважностью 100 (tимп = 100 мкс). При этом на плате установлен генератор 50МГц. Поделить 50МГц так что бы вышло 100Гц с помощю PLL не выйдет. Поэтому я решил сначала поделить до 1МГц, а потом используя ядро альтеровского счётчика насчитать до упора. При этом хочу управлять счётчиком с помощю мультиплексора. Т.е. сначала счётчик будит считать до 100 (т.е. насчитывать мне длительность импульса) а затем мультиплексор переключится и заставит счётчик досчитывать до конца периода, потом по новой. Тащем то богвесть какая стабильность строба не требуется, но тем неменее хочется сделать всё как можно лучше. Вот и решил, осведомится, может кто поделится опытом решения таких задач. Заранее спасибо.
P.S. Искал среди мегафункций какую нибудь преблуду, которая бы такое вытворяла, но не нашёл, возможно плохо искал.
Александр77
Сделайте счетчик на 100 значений и по его данным формируйте выходной импульс
Konst_777
Цитата(Грендайзер @ Nov 14 2013, 14:06) *
...P.S. Искал среди мегафункций какую нибудь преблуду, которая бы такое вытворяла, но не нашёл, возможно плохо искал.

Вам бы не мегафункцию искать, а вот эти книги Pong P. Chu:
"FPGA prototyping by VHDL examples (2008)"
"Embedded SoPC Design with Nios II Processor and VHDL Examples (2011)"
"RTL Hardware Design Using VHDL - Coding for Efficiency, Portability, and Scalability (2006)"
или
"Embedded SoPC Design with Nios II Processor and Verilog Examples"
"FPGA Prototyping by Verilog Examples_Xilinx Spartan-3 Version"
Грендайзер
Нууу по книжке этого паренька, с незатейливой русской фамилией Чу, я vhdl учил... правда вот не все книги скачать можно.... однако ж... вопрос открыт...
Maverick
Цитата(Грендайзер @ Nov 14 2013, 12:48) *
Нууу по книжке этого паренька, с незатейливой русской фамилией Чу, я vhdl учил... правда вот не все книги скачать можно.... однако ж... вопрос открыт...

если учили vhdl, то почему задаете такой элементарный вопрос?
Александр77
Может просто нет видения самого построения.
Maverick
Цитата(Александр77 @ Nov 14 2013, 14:04) *
Может просто нет видения самого построения.

тут видение самое элементарное ж
вот пример PWM

Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity PWM_device is
    Port ( clk : in std_logic;
         PWM_Value : std_logic_vector (13 downto 0);
           pwm : out std_logic);
end PWM_device;

architecture Behavioral of PWM_device is

signal st : std_logic_vector (13 downto 0) := "00000000000000";

begin

process (clk)
begin
if clk'event and clk = '1' then
  if CONV_INTEGER(st) /= 16384 then st <= st + 1;     
    else  st <= CONV_STD_LOGIC_VECTOR (0, 14);
    end if;  end if;
end process;
        pwm <= '1' when PWM_Value > st else '0';

end Behavioral;


к нему нужно добавить счетчик который поделит до нужной частоты

и все...

не вижу сложности...

или как-то так (состряпал на скорую руку- не пенать, если что не так)

Код
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;

ENTITY pwm IS
  GENERIC(
      sys_clk         : INTEGER := 50_000_000; --system clock frequency in Hz
      pwm_freq        : INTEGER := 100_000;    --PWM switching frequency in Hz
      bits_resolution : INTEGER := 8;          --bits of resolution setting the duty cycle
      phases          : INTEGER := 1);         --number of output pwms and phases
  PORT(
      clk       : IN  STD_LOGIC;                                    --system clock
      reset_n   : IN  STD_LOGIC;                                    --asynchronous reset
      ena       : IN  STD_LOGIC;                                    --latches in new duty cycle
      duty      : IN  STD_LOGIC_VECTOR(bits_resolution-1 DOWNTO 0); --duty cycle
      pwm_out   : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0);          --pwm outputs
      pwm_n_out : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0));         --pwm inverse outputs
END pwm;

ARCHITECTURE logic OF pwm IS
  CONSTANT period  : INTEGER := sys_clk/pwm_freq;                          --number of clocks in one pwm period
  TYPE counters IS ARRAY (0 TO phases-1) OF INTEGER RANGE 0 TO period - 1; --data type for array of period counters
  SIGNAL count     : counters := (OTHERS => 0);                            --array of period counters
  SIGNAL half_duty : INTEGER RANGE 0 TO period/2 := 0;                     --number of clocks in 1/2 duty cycle
BEGIN
  PROCESS(clk, reset_n)
  BEGIN
    IF(reset_n = '0') THEN                                             --asynchronous reset
      count <= (OTHERS => 0);                                            --clear counter
      pwm_out <= (OTHERS => '0');                                        --clear pwm outputs
      pwm_n_out <= (OTHERS => '0');                                      --clear pwm inverse outputs
    ELSIF(clk'EVENT AND clk = '1') THEN                                --rising system clock edge
      IF(ena = '1') THEN                                                 --latch in new duty cycle
        half_duty <= conv_integer(duty)*period/(2**bits_resolution)/2;     --determine clocks in 1/2 duty cycle
      END IF;
      FOR i IN 0 to phases-1 LOOP                                        --create a counter for each phase
        IF(count(0) = period - 1 - i*period/phases) THEN                   --end of period reached
          count(i) <= 0;                                                     --reset counter
        ELSE                                                               --end of period not reached
          count(i) <= count(i) + 1;                                          --increment counter
        END IF;
      END LOOP;
      FOR i IN 0 to phases-1 LOOP                                        --control outputs for each phase
        IF(count(i) = half_duty) THEN                                      --phase's falling edge reached
          pwm_out(i) <= '0';                                                 --deassert the pwm output
          pwm_n_out(i) <= '1';                                               --assert the pwm inverse output
        ELSIF(count(i) = period - half_duty) THEN                          --phase's rising edge reached
          pwm_out(i) <= '1';                                                 --assert the pwm output
          pwm_n_out(i) <= '0';                                               --deassert the pwm inverse output
        END IF;
      END LOOP;
    END IF;
  END PROCESS;
END logic;
Грендайзер
Я лишь хочу узнать, есть ли какие то более изящные пути для решения этой задачи? При чём тут уровень владения VHDLем то? Сконопатить счётчик на VHDL это любой может... ток вот стоит ли именно таким то путём идти? Может что поэлегантней есть?

Пфф... Ладно, спасибо... всё ясно.
Грендайзер
Maverick, спасибо))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.