Перейти к содержанию

Выделение сигнала и счетчик

Всем привет. Прошу помощи с заданием по VHDL в Quartus
1. Есть clk и задается сигнал, по сигналу надо выделить момент фронта и спада сигнала, а затем на основе этих 2-х тактов построить сигнал
2. Опять же есть clk и нужно сделать счетчик тактов, а по окончанию работы счетчика выдать 1 такт
прикрепляю картинку с заданием, ибо из меня тот еще рассказчик
[attachment=110663:nGL_SS8WpdM.jpg]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(MAXHAX @ Jan 15 2018, 12:07) <{POST_SNAPBACK}>

1.1 Момент фронта импульса и спада находятся при помощи схем - "детектор фронта" Первая же ссылка в google по поиску "VHDL детекторы фронта"
1.2 Что значит на основе этих 2 тактов построить сигнал ? Каков принцип его построения ? Я вижу в простейшем случае это вообще входной сигнал задержанный на 2 такта....
2.1. Ну так у вас обычный счетчик с сигналом переноса
Изменено пользователем Flip-fl0p

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
здесь на verilog, есть схема, по ней можно написать код на vhdl. https://marsohod.org/verilog/157-verilogedges
Изменено пользователем Evgeny72

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(MAXHAX @ Jan 15 2018, 12:07) <{POST_SNAPBACK}>
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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
посмотрите это описание

Код
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 @ Jan 19 2018, 00:01) <{POST_SNAPBACK}>
Вот так помогай студентам
Ни спасибо ни пожалуйста...

Так этот хотя бы написал: "Прошу помощи"... А другие пишут проще: "нужно..."
И чего же Вы хотите? Лет через 5-6 придет к Вам новый начальник и даже не вспомнит, что у него были проблемы со счетчиком. Ему же уже показали, что такую работу за него всегда сделают...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Maverick @ Jan 19 2018, 00:01) <{POST_SNAPBACK}>
Вот так помогай студентам
Ни спасибо ни пожалуйста...

Безусловно спасибо, код отличный, немного с избытком, но вы и предупреждали об этом.
Только у меня возникла небольшая проблема с моделированием данного кода, а именно с редактированием test bench-а
Просто если его не редактировать, то не создаются никакие сигналы, что на входе, что на выходе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(MAXHAX @ Jan 22 2018, 09:26) <{POST_SNAPBACK}>
Только у меня возникла небольшая проблема с моделированием данного кода, а именно с редактированием test bench-а
Просто если его не редактировать, то не создаются никакие сигналы, что на входе, что на выходе.

Помогу на Verilog-е, если надо. Я так понимаю, это в универе требуют VHDL?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация