User Tag List

Показано с 1 по 10 из 404

Тема: Изучение с "нуля" VHDL и ПЛИС Xilinx

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #6

    Регистрация
    03.07.2005
    Адрес
    Санкт-Петербург
    Сообщений
    10,168
    Спасибо Благодарностей отдано 
    147
    Спасибо Благодарностей получено 
    84
    Поблагодарили
    55 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Viktor2312 Посмотреть сообщение
    Тогда продолжу, может правильно будет
    Правильно.
    Только в таком "голом виде" это нельзя вставлять в проект, нужно оформить как процесс:

    Код:
    process(cnt_one) -- заголовок, напоминает function в С. В скобках - сигнал, от которого
                                        зависит работа процесса (список чувствительности)
    begin
       if (cnt_one=118) then -- проверяем равен ли cnt_one 118-ти
          a <= x0; -- если условие верно (true)
       else
          a <= x1; -- если условие не верно (false)
       end if;
    end process;


    ---------- Post added at 08:23 ---------- Previous post was at 08:14 ----------

    А вот еще один вариант подобного рода, но уже без оператора if.
    Здесь ничего не буду пока комментить, просто смотри, что там написано и понимание придет само, это просто

    Код:
    process(cnt_one)
    begin
       case (cnt_one) is
          when (118) => a <= x0;
          when (65)   => a <= x2;
          when others => a <= x1; -- здесь others означает "любое другое значение, кроме указанных"
       end case;
    end process;


    ---------- Post added at 08:36 ---------- Previous post was at 08:23 ----------

    Ну и третий вариант до кучи.
    Эта конструкция уже не требует заключения ее в процесс, она является процессом сама по себе:

    Код:
    a <= x0 when (cnt_one=118) else x1;
    просто, как три рубля
    Эту конструкцию можно расширить, подобно предыдущему примеру:

    Код:
    a <= x0 when (cnt_one=118) else 
         x2 when (cnt_one=65) else 
         x1;


    ---------- Post added at 08:55 ---------- Previous post was at 08:36 ----------

    Ну и давай тогда напишем код для реального случая. Например, опишем знаменитый мультиплексор 555КП11. Он имеет два переключаемых канала по 4 разряда, вход переключения каналов, вход разрешения выдачи сигналов.
    Заголовок проекта пропускаю, начнем:
    Код:
    A      : in std_logic_vector(3 downto 0); --вход А, четырехразрядный
    B      : in std_logic_vector(3 downto 0); --вход В, четырехразрядный
    Q      : out std_logic_vector(3 downto 0); --выход Q, четырехразрядный
    S      : in std_logic; --вход управления переключением
    OE_N   : in std_logic; --вход управления выдачи информации
    
    Q <= "ZZZZ" when (OE_N='1') else    --если вход OE_N равен 1, то выходы в Z-состоянии
           A when (S='0') else B; --подключаем на выход канал А, если S равно нулю, иначе - канал В


    ---------- Post added at 08:59 ---------- Previous post was at 08:55 ----------

    Для тренировки напиши реальный проект и скомпилируй его.
    А потом замени эту конструкцию when...else на вариант с if....then.

    ---------- Post added at 09:09 ---------- Previous post was at 08:59 ----------

    Наверное, стОит добавить еще пару разъяснений.
    Если мы используем какой-то одноразрядный сигнал (типа S или OE_N в предыдущем примере), то его состояние определять просто цифрой типа 0 или 1 нельзя. Компилятор будет ругаться. Квартус, по крайней мере. Поэтому состояние сигнала описывается цифрами 0 или 1 в одинарных кавычках типа '0' или '1'.
    Если же сигнал не одноразрядный, то там уже допустимы привычные цифры, или те же нули и единицы, но уже в двойных кавычках ("1001", x"9", 9).
    Если же нам надо перевести сигнал в Z-состояние, то мы, собственно, эту букву и используем.

    ---------- Post added at 10:38 ---------- Previous post was at 09:09 ----------

    Пока мне на работе делать нефиг, напишу о триггерах и регистрах.
    Оба эти элемента выделяются тем, что они работают по фронту управляющего сигнала.
    В VHDL фронты сигналов определяются такими операторами -
    Для нарастающего фронта -
    (clock'event and clock='1') или
    (rising_edge(clock))

    Для спадающего фронта -
    (clock'event and clock='0') или
    (falling_edge(clock))

    Использовать эти операторы можно двумя путями.
    Самый простой (реализация регистра) -
    Q <= A when (rising_edge(clock));
    Тоесть, по нарастающему фронту сигнала clock данные сигнала А запишутся в регистр Q.
    Более "канонически" можно написать так:
    Код:
    process(clock)
    begin
       if (rising_edge(clock)) then
          Q <= A;
       end if;
    end process;
    Очень часто бывает нужно сбрасывать регистр по определенному сигналу.
    Это можно сделать например так:

    Код:
    process(clock,reset)
    begin
       if (reset='1') then
          Q <= 0;   
       elsif (rising_edge(clock)) then
          Q <= A;
       end if;
    end process;


    ---------- Post added at 10:49 ---------- Previous post was at 10:38 ----------

    Цитата Сообщение от palsw Посмотреть сообщение
    Кто будет подопытный без влаживания в девборды?
    Можешь попробовать для экпериментов купить мелкую CPLD в каком-нибудь местном ларьке. Я вот себе прикупил для "карманных расходов" кучку EPM3064АTC44 по 40 рублей (1$). Хоть это и Альтеры а не Ксилинксы, но общая суть у них одинакова.

    ---------- Post added at 12:37 ---------- Previous post was at 10:49 ----------

    Давайте, что ли, бегущий огонек сделаем?

    Код:
    library IEEE; 
    use IEEE.std_logic_1164.all; 
    use IEEE.std_logic_unsigned.all;  
    
    entity led is
    	port(
    	CLK		: in std_logic;     -- вход тактовой частоты.
    	Q		: out std_logic_vector(7 downto 0)     -- выход на светодиодики. Про резисторы не забываем.
    	);
    end led;
    
    architecture led_arch of led is 
    
    signal Q_reg	: std_logic_vector(7 downto 0);  -- объявляем сдвиговый регистр.
    
    begin
    
    process(CLK,Q_reg)
    begin
    	if (Q_reg=0) then                    -- это просто начальная инициализация регистра...
    		Q_reg <= "00000001";
    	elsif (rising_edge(CLK)) then
    		Q_reg(7 downto 0) <= Q_reg(6 downto 0) & Q_reg(7); -- и погнали его разряды по кругу.
    	end if;
    end process;
    
    Q <= Q_reg;
    
    end led_arch;
    А вот так выглядит работа чипа уже в симуляторе:

    Последний раз редактировалось Ewgeny7; 07.10.2014 в 09:01.
    ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
    Speccy-2007 128/AY/TR-DOS

    Сайт с документацией к "Scorpion ZS 256"

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 172
    Последнее: 28.11.2017, 13:28
  2. Микроконтроллеры STM32, "с нуля".
    от Viktor2312 в разделе Для начинающих
    Ответов: 279
    Последнее: 07.11.2016, 19:45
  3. Техническая литература: Языки описания аппаратуры "AHDL, VHDL и Verilog"
    от Viktor2312 в разделе Техническая литература
    Ответов: 1
    Последнее: 14.09.2014, 22:29
  4. Ответов: 71
    Последнее: 31.07.2014, 19:42

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •