Важная информация

User Tag List

Страница 1 из 41 12345 ... ПоследняяПоследняя
Показано с 1 по 10 из 404

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

  1. #1
    Banned
    Регистрация
    04.03.2010
    Адрес
    Россия. Пятигорск.
    Сообщений
    2,313
    Благодарностей: 3630
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Exclamation Изучение с "нуля" VHDL и ПЛИС Xilinx

    Как оказалось данная тема лишняя на форуме, а я в ней задаю быдло вопросы, пишу копипасту, никому не нужную, от которой толку 0. И использую форум как туалетную бумагу.
    Дабы не травмировать нежную психику подобных индивидуумов, я удалил все свои посты из данной темы, и в будущем тут писать ничего не буду. Изучение естественно продолжу, а всё что тут не нравится индивидуумам, будет на моём форуме RUЭВМ ссылка в подписи есть.
    Всем пока...
    Последний раз редактировалось Viktor2312; 04.10.2015 в 17:19.

  2. Эти 2 пользователя(ей) поблагодарили Viktor2312 за это полезное сообщение:
    palsw (06.10.2014)

  3. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  4. #2
    Guru Аватар для palsw
    Регистрация
    08.05.2011
    Адрес
    Измаил, Украина
    Сообщений
    3,209
    Благодарностей: 793
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Viktor2312, вот это правильно.готов поучаствовать.Так как самому тяжело вникнуть бывает.

    к теории нужна практика -светодиодом помигать или кнопку понажимать.Кто будет подопытный без влаживания в девборды?
    Радио-Губитель Канал на YouTube

  5. #3
    Super Moderator Аватар для Ewgeny7
    Регистрация
    03.07.2005
    Адрес
    Санкт-Петербург
    Сообщений
    9,448
    Благодарностей: 3793
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цирк уехал.... facepalm.

    Цифры - берем цифру 118 и мучаем ее в VHDL -
    118 - десятичная,
    if (cnt_one=118) then ........

    "01110110" - векторная раскладка по битам, 8 бит
    cnt_pre(7 downto 0) <= "01110110";

    x"76" - шестнадцатиричная.
    cnt_pre <= x"76";
    Больше пока не надо ничем на цифровое представление голову забивать.
    Scorpion ZS 1024 turbo+/ZXMC 2.6/SD-HDD/FDD/AT-Keyb/Mouse/SMUC 2.0/ProfROMse/VGA 3.0/NeoGS
    ZX-Evolution 4096 rev.B

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

  6. #4
    Super Moderator Аватар для Ewgeny7
    Регистрация
    03.07.2005
    Адрес
    Санкт-Петербург
    Сообщений
    9,448
    Благодарностей: 3793
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Туториал по VHDL на примере построения аж сразу Спектрум-48.

    ---------- Post added at 00:33 ---------- Previous post was at 00:32 ----------

    Цитата Сообщение от Viktor2312 Посмотреть сообщение
    Вот это не понял, почему так, а не так как в трёх источниках написано
    Мне это неведомо, наверное стандарты языка это поддерживают.
    Но "всё прогрессивное человечество" пишет как в моих примерах. залезь в любой код
    Scorpion ZS 1024 turbo+/ZXMC 2.6/SD-HDD/FDD/AT-Keyb/Mouse/SMUC 2.0/ProfROMse/VGA 3.0/NeoGS
    ZX-Evolution 4096 rev.B

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

  7. #5
    Super Moderator Аватар для Ewgeny7
    Регистрация
    03.07.2005
    Адрес
    Санкт-Петербург
    Сообщений
    9,448
    Благодарностей: 3793
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да не.... Просто ты пытаешься сразу нахрапом взять новый для себя язык сразу весь... Это нехорошо, забьешь себе голову мешаниной определений, графиков. рисунков... Получится одна головная боль в результате.
    Лучше начать с построения элементарного проекта, прямо в среде программирования.
    Пускай там даже будет один логический элемент. А дальше - изучать операторы и конструкции из них, постепенно наворачивая сложность, симулируя работу прямо в голове.
    Scorpion ZS 1024 turbo+/ZXMC 2.6/SD-HDD/FDD/AT-Keyb/Mouse/SMUC 2.0/ProfROMse/VGA 3.0/NeoGS
    ZX-Evolution 4096 rev.B

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

  8. #6
    Guru Аватар для AAA
    Регистрация
    06.04.2005
    Адрес
    Земля, Москва, Марьино
    Сообщений
    21,508
    Благодарностей: 5883
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Витянька, аккуратней устройство сделанное тобой точно может изменить судьбу человечества. Это минимум машина времени, максимум миелофон!

  9. Этот пользователь поблагодарил AAA за это полезное сообщение:
    TSL (09.10.2014)

  10. #7
    Super Moderator Аватар для Ewgeny7
    Регистрация
    03.07.2005
    Адрес
    Санкт-Петербург
    Сообщений
    9,448
    Благодарностей: 3793
    Mentioned
    0 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 в 08:01.
    Scorpion ZS 1024 turbo+/ZXMC 2.6/SD-HDD/FDD/AT-Keyb/Mouse/SMUC 2.0/ProfROMse/VGA 3.0/NeoGS
    ZX-Evolution 4096 rev.B

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

  11. Эти 3 пользователя(ей) поблагодарили Ewgeny7 за это полезное сообщение:
    Mikka_A (07.10.2014), solegstar (21.04.2015), Tronix (07.10.2014)

  12. #8
    Veteran Аватар для Tronix
    Регистрация
    16.09.2010
    Адрес
    г. Москва
    Сообщений
    1,434
    Благодарностей: 763
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Круто! Вроде все понятно пока. А сколько макроячеек занимает 8-битный регистр? Я так понимаю, в 3064 много не влезет?
    Работают:
    1) ПЭВМ Поиск-1 512Kb RAM, FDD controller + TEAC 5"25 800Kb, HDD MFM controller + ST-225, Joystick controller + Joystick
    2) XT Super Turbo V, Siemens 8088/NEC V20, 640Kb RAM, MFM Robotron K5504.20, FDD 5,25" MC-5311/MITSUMI D509V3, COM, LPT
    3) ПЭВМ "ДУЭТ" проц: КР1858ВМ1; память 48K РУ5 (клон Spectrum 48K)
    Пока не работают:
    1) ПЭВМ Поиск-1 128Kb RAM (не работает большая часть кнопок на клавиатуре).

  13. #9
    Super Moderator Аватар для Ewgeny7
    Регистрация
    03.07.2005
    Адрес
    Санкт-Петербург
    Сообщений
    9,448
    Благодарностей: 3793
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Последние бегущие огоньки заняли суммарно 8 макроячеек.
    Сейчас мы проект усложним, введем константы, типа ПЗУ. Размер вырастет.
    В 3064 вообще немало влезает, корпусов так около 7-10 "средней" логики.

    ---------- Post added at 13:08 ---------- Previous post was at 12:49 ----------

    А сейчас мы сделаем "Программируемые Огни"
    Смотрим код, разбираем его, всё достаточно просто.
    Здесь уже используется счетчик импульсов CNT, трехразрядный. Соответственно, он имеет восемь состояний. Сразу за счетчиком у нас стоИт дешифратор, который имеет также восемь "ячеек ПЗУ", содержимое которых определяет, что мы получим на выходных пинах.

    Код:
    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 CNT		: std_logic_vector(2 downto 0);
    signal Q_reg	: std_logic_vector(7 downto 0);
    
    begin
    
    process(CLK,CNT)
    begin
    	if (rising_edge(CLK)) then
    		CNT <= CNT+1;
    		case (CNT) is
    			when "000" => Q_reg <= "10000001";
    			when "001" => Q_reg <= "01000010";
    			when "010" => Q_reg <= "00100100";
    			when "011" => Q_reg <= "00011000";
    			when "100" => Q_reg <= "00000000";
    			when "101" => Q_reg <= "00011000";
    			when "110" => Q_reg <= "00100100";
    			when "111" => Q_reg <= "01000010";
    		end case;
    	end if;	
    end process;
    
    Q <= Q_reg;
    
    end led_arch;
    А вот и диаграмма работы из симулятора:



    Красиво? Можно изменять рисунок свечения по своему усмотрению.
    Обратите внимание, я здесь и счетчик, и дешифратор засунул в один процесс, тактируемый клоком. Так вполне можно, и даже - лучше. И код читабельней, и вся схема работает полностью синхронно. Если вынести дешифратор из процесса и не тактировать его, то всё будет работать тоже. Но... Возможны проскакивания "иголок" на выходе дешифратора, поскольку счетчик все же не мгновенно меняет состояние своих разрядов.

    Это проект занял всего 11 макроячеек.
    Scorpion ZS 1024 turbo+/ZXMC 2.6/SD-HDD/FDD/AT-Keyb/Mouse/SMUC 2.0/ProfROMse/VGA 3.0/NeoGS
    ZX-Evolution 4096 rev.B

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

  14. Этот пользователь поблагодарил Ewgeny7 за это полезное сообщение:

  15. #10
    Super Moderator Аватар для Ewgeny7
    Регистрация
    03.07.2005
    Адрес
    Санкт-Петербург
    Сообщений
    9,448
    Благодарностей: 3793
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Viktor2312 Посмотреть сообщение
    Теперь переносим код программы в редактор или набиваем ручками:
    И?
    Scorpion ZS 1024 turbo+/ZXMC 2.6/SD-HDD/FDD/AT-Keyb/Mouse/SMUC 2.0/ProfROMse/VGA 3.0/NeoGS
    ZX-Evolution 4096 rev.B

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

Страница 1 из 41 12345 ... ПоследняяПоследняя

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

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

Эту тему просматривают: 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, 20:29
  4. Ответов: 71
    Последнее: 31.07.2014, 17:42

Ваши права

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