Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выделение сигнала и счетчик
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
MAXHAX
Всем привет. Прошу помощи с заданием по VHDL в Quartus
1. Есть clk и задается сигнал, по сигналу надо выделить момент фронта и спада сигнала, а затем на основе этих 2-х тактов построить сигнал
2. Опять же есть clk и нужно сделать счетчик тактов, а по окончанию работы счетчика выдать 1 такт
прикрепляю картинку с заданием, ибо из меня тот еще рассказчик
Нажмите для просмотра прикрепленного файла
Flip-fl0p
Цитата(MAXHAX @ Jan 15 2018, 12:07) *

1.1 Момент фронта импульса и спада находятся при помощи схем - "детектор фронта" Первая же ссылка в google по поиску "VHDL детекторы фронта"
1.2 Что значит на основе этих 2 тактов построить сигнал ? Каков принцип его построения ? Я вижу в простейшем случае это вообще входной сигнал задержанный на 2 такта....
2.1. Ну так у вас обычный счетчик с сигналом переноса
Evgeny72
здесь на verilog, есть схема, по ней можно написать код на vhdl. https://marsohod.org/verilog/157-verilogedges
Jackov
Цитата(MAXHAX @ Jan 15 2018, 12:07) *
1. Есть clk и задается сигнал, по сигналу надо выделить момент фронта и спада сигнала, а затем на основе этих 2-х тактов построить сигнал

Сигнал In пропускаем через D-триггер, получаем сигнал In0.
Сигнал In0 пропускаем через D-триггер, получаем сигнал In1.
Out_0 = In0 & ~In1;
Out_1 = ~In0 & In1;
Out_2 - это выход RS-триггера, на S-вход которого подано Out_0, на R-вход подано Out_1.
Maverick
посмотрите это описание

Код
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity pulse_len_measure is
generic (
  N                           : integer:=8);
port (
  i_clk                       : in  std_logic;
  i_rstb                      : in  std_logic;
  i_input                     : in  std_logic;
  o_pulse_len_hi              : out std_logic_vector(N-1 downto 0);
  o_pulse_len_lo              : out std_logic_vector(N-1 downto 0));
end pulse_len_measure;

architecture rtl of pulse_len_measure is
constant C_MAX_COUNT           : unsigned(N-1 downto 0):=(others=>'1');
signal r_count_hi_ena          : std_logic;
signal r_count_hi              : unsigned(N-1 downto 0);
signal r_count_lo              : unsigned(N-1 downto 0);
signal r_count_lo_ena          : std_logic;
signal r_rise                  : std_logic;
signal r_fall                  : std_logic;
signal p_input                 : std_logic_vector(0 to 2); -- input pipe

begin

p_edge_detector : process(i_clk,i_rstb)
begin
  if(i_rstb='0') then
    r_rise       <= '0';
    r_fall       <= '0';
    p_input      <= (others=>'0');
  elsif(rising_edge(i_clk)) then
    r_rise       <= not p_input(2) and p_input(1);
    r_fall       <= not p_input(1) and p_input(2);
    p_input      <= i_input&p_input(0 to p_input'length-2);
  end if;
end process p_edge_detector;

p_count_hi : process(i_clk,i_rstb)
begin
  if(i_rstb='0') then
    r_count_hi_ena  <= '0';
    r_count_hi      <= to_unsigned(1,N);
    o_pulse_len_hi  <= (others=>'0');
  elsif(rising_edge(i_clk)) then
    if(r_rise='1') then
      r_count_hi_ena  <= '1';
    elsif(r_fall='1') then
      r_count_hi_ena  <= '0';
      o_pulse_len_hi  <= std_logic_vector(r_count_hi);
    end if;

    if(r_count_hi_ena='1') then
      if(r_count_hi<C_MAX_COUNT)then
        r_count_hi      <= r_count_hi + 1;
      end if;
    else
      r_count_hi      <= to_unsigned(1,N);
    end if;
  end if;
end process p_count_hi;

p_count_lo : process(i_clk,i_rstb)
begin
  if(i_rstb='0') then
    r_count_lo_ena  <= '0';
    r_count_lo      <= to_unsigned(1,N);
    o_pulse_len_lo  <= (others=>'0');
  elsif(rising_edge(i_clk)) then
    if(r_fall='1') then
      r_count_lo_ena  <= '1';
    elsif(r_rise='1') then
      r_count_lo_ena  <= '0';
      o_pulse_len_lo  <= std_logic_vector(r_count_lo);
    end if;

    if(r_count_lo_ena='1') then
      if(r_count_lo<C_MAX_COUNT) then
        r_count_lo      <= r_count_lo + 1;
      end if;
    else
      r_count_lo      <= to_unsigned(1,N);
    end if;
  end if;
end process p_count_lo;

end rtl;


Строб готовности слелаете с помощью r_fall и/или r_rise пропустив через 1 битный сдвигающий регистр ...
PS В принципе это описание полностью подходит под Ваше задание, просто здесь сделано чуть-чуть больше...
Maverick
Вот так помогай студентам
Ни спасибо ни пожалуйста...
iosifk
Цитата(Maverick @ Jan 19 2018, 00:01) *
Вот так помогай студентам
Ни спасибо ни пожалуйста...

Так этот хотя бы написал: "Прошу помощи"... А другие пишут проще: "нужно..."
И чего же Вы хотите? Лет через 5-6 придет к Вам новый начальник и даже не вспомнит, что у него были проблемы со счетчиком. Ему же уже показали, что такую работу за него всегда сделают...
MAXHAX
Цитата(Maverick @ Jan 19 2018, 00:01) *
Вот так помогай студентам
Ни спасибо ни пожалуйста...

Безусловно спасибо, код отличный, немного с избытком, но вы и предупреждали об этом.
Только у меня возникла небольшая проблема с моделированием данного кода, а именно с редактированием test bench-а
Просто если его не редактировать, то не создаются никакие сигналы, что на входе, что на выходе.
AVR
Цитата(MAXHAX @ Jan 22 2018, 09:26) *
Только у меня возникла небольшая проблема с моделированием данного кода, а именно с редактированием test bench-а
Просто если его не редактировать, то не создаются никакие сигналы, что на входе, что на выходе.

Помогу на Verilog-е, если надо. Я так понимаю, это в универе требуют VHDL?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.