VHDL. Пример проектирования.

Доброго времени суток!
Меня весьма порадовало, что у глубокоуважаемого народа проснулся интерес к такой занимательной теме, как ПЛИС. Начали появляться статьи о программировании ПЛИСок.
Хочу внести и свои скромные пять копеек.
Описанный здесь проект влезет в любую мелкую ПЛИС (CPLD), и очень легко модифицируется под ваши запросы.
Суть проекта стара как мир — моргалка светодиодами. Причем, светодиодов мы возьмем 8 штук. На ПЛИСу подадим тактовый сигнал от внешнего генератора, частотой где-то около герца. Это уже дело вкуса. Просто с каждым тактом генератора состояние светодиодов будет меняться. А как оно будет меняться — определим мы сами, внося изменения в простейший код на VHDL.
Я не буду рассказывать как создать проект в Квартусе и перенести туда код, как скомпилировать и прошить чип. Про эти вещи написаны тонны талмудов. Я просто кратко опишу как работает приведенный здесь код:


library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.ALL;  

entity led is                    
	port (
		CLK     : in std_logic;
		LED   	: out std_logic_vector(7 downto 0)
		);
end led;

architecture led_arch of led is

signal count    : std_logic_vector(3 downto 0);

begin

process(CLK)
begin
    if (CLK'event and CLK = '1') then
        count <= count + 1;
    end if;
end process;

process(count)
begin
    case count is
        when 0  => LED <= "10000001";
        when 1  => LED <= "01000010";
        when 2  => LED <= "00100100";
        when 3  => LED <= "00011000";
        when 4  => LED <= "00100100";
        when 5  => LED <= "01000010";
        when 6  => LED <= "10000001";
        when 7  => LED <= "00000000";
        when 8  => LED <= "00000001";
        when 9  => LED <= "00000010";
        when 10 => LED <= "00000100";
        when 11 => LED <= "00001000";
        when 12 => LED <= "00010000";
        when 13 => LED <= "00100000";
        when 14 => LED <= "01000000";
        when 15 => LED <= "10000000";
    end case;
end process;

end led_arch;        


В начале проекта мы подключаем стандартные для VHDL библиотеки. Даже не вдумываясь особо что там в них прописано. Это тема для отдельной статьи.
Далее описываются входной сигнал CLK и выходной восьмиразрядный (7 downto 0) сигнал LЕD. Который, как нетрудно догадаться выводится на 8 светодиодов. На вход CLK можно подавать тактовый сигнал от любого генератора, хоть на 155ЛА3 :)

Далее, в разделе architecture следует описание сигнала count. Как видно из описания, он четырехразрядный. И в первом же блоке (процессе) мы на доступном для понимания языке сообщаем компилятору что этот сигнал не шина, не регистр, а самый обыкновенный счетчик. Просто конструкция
if (CLK'event and CLK = '1') then
        count <= count + 1;
    end if;

не оставит компилятору возможности понять нас превратно :)

В следующем процессе мы уже реализуем дешифратор.
Конструкция CASE..WHEN..END CASE весьма удобная и наглядная вещь для создания разнообразных мультиплексоров, шифраторов, дешифраторов…
В нашем случае на вход этой конструкции мы подаем сигналы со счетчика (четыре разряда, 16 возможных комбинаций), и в зависимости от состояния этого счетчика CASE выбирает соответствующую строчку. В этой строке уже делается присвоение выходному сигналу LED (на все восемь его разрядов). А что на эти LED отсылается — наглядно видно справа. Я специально «развернул» эти числа в битовый вид, чтобы наглядно представить как у нас будет меняться состояние LED на каждом такте.
Меняя нули/единички, можно запрограммировать любое поведение светодиодов.
Увеличив разрядность счетчика count и дешифратора, можно легко увеличить количество тактов, лишь бы емкости ПЛИСы хватило на хранение «таблички сигналов».
Вот, собственно и всё.
  • +4
  • 10 марта 2011, 09:37
  • ewgeny7

Комментарии (25)

RSS свернуть / развернуть
Движок блога почему-то посчитал нужным символ апострофа принять за комментарии в коде, в результате пол-кода стали зелеными… Косяк, однако…
0
а чем сказочная конструкция
if (CLK'event and CLK = '1')

отличается от не менее сказочной
if (rising_edge(CLK) 

?
0
Блин, скобку забыл
if (rising_edge(CLK)) 
0
Ничем. Только привычкой писать так или иначе.
0
rising_edge появился в более позднем стандарте и, на мой взгляд, гораздо читаемее. А по смыслу ничем.
0
я это и имел в виду :) А российские/снг учебники в своей большинстве, к сожалению, пихают вариант автора топика :(
0
Перенес в коллективный блог ПЛИС. Если будете редактировать, то сначала вступите сюда:
we.easyelectronics.ru/blog/plis/
А то оно обратно статью перебросит в персональный.
0
А с подстветкой мы что нибудь попробуем сделать. Она расчитана на всякие Си-Паскали, а на синтаксис вхдл явно нет.
0
Спасибо! Я первый раз в жизни влез в блогостроительство, поэтому для меня тут всё незнакомо.

Для ворчунов специально — чем бухтеть, написали бы сами что-нить полезное.
Я вот мануал по проектированию простого компьютера на ПЛИС полчаса назад выложил на дружественный форум ретрокомпьютерщиков:
www.zx.pk.ru/showpost.php?p=364990&postcount=704
Там же и файлы самого проекта.
-1
От тут:
we.easyelectronics.ru/page/about/
небольшой мануальчик в картинках по сообществу. Как тут что устроено.
0
А вот скажите ewgeny7, конфигурация ПЛИС задается один раз через программатор, или существует возможность переконфигурирования ПЛИС на лету?
0
Для самых навороченных ПЛИС типа Стратиксов — не знаю, но вообще — самостоятельно нет. Для этого применяют внешние контроллеры, которые заливают конфиги с ПЗУ, SD, UART, и прочего.
0
Просто я посмотрел выложенный вами проект спектрума на ПЛИС, и подумал, ведь возможно создать мульти-эмулятор старых компьютеров, который на лету перестраивается под эмуляцию какой то системы. Выигрыш должен быть в скорости эмуляции, она должна быть гораздо выше софтовой эмуляции существующей сейчас. Не существует таких готовых проектов?
0
Нет, из самоделок таких проектов нету. Но вариант такой возможен. Например, в конфПЗУ ПЛИСы залит простой конфиг бутлоадера, который общается с МК, к которой прицепляется SD-интерфейс. Выбрали на флешке модель компьютера, МК перегоняет конфиг с SD в ПЛИС. Аллес.
0
Я правильно понимаю, что вместе с эмуляцией ЦП, современная ПЛИС может эмулировать и всю периферию, в том числе графический и звуковой интерфейсы?
0
насчет эмуляции — вопрос религиозный. скорее, симуляция. Ведь ПЛИС не исполняет программу, а в ее логике работают реальные транзисторы, как и в «оригинале», просто другая схема их взаимного подключения :)
А вообще — да, есть куча готовых процессорных ядер, есть парочка АВР-ядер, есть музыкальники типа AY/YM, есть 82С55, 82С53, 82С54, модули работы с PS/2, UART, SPI, I2C… Всякого добра навалом. Граф.интерфейс можно и самому наваять, как в том мануале. Можно всё сделать, только труд приложить.
0
Цифровую периферию — любую.
А с аналоговой частью — фиг знает. Большинство ПЛИС вообще исключительно цифровые. У некоторых аналоговая часть есть, но у тех что мне попадались — не очень развесистая. Хотя, врать не буду, сильно аналоговыми не интересовался.
0
ПЛИС засасывает прошивку самостоятельно при включении или по переднему фронту на пине Load. Прошивка может лежать в ПЗУ или транслироваться из микроконтролллера, или из Xilinx-чипа (System ACE), читающего ее из CF карточки (c файловой системой FAT)

Virtex от Xilinx (и, наверно, не только они) позволяют делать даже частичную реконфигурацию на лету. Т.е. в процессе работы, по желанию ПЛИС, логические элемены с координатами от ХУ=аб до ХУ=вг получают нужную прошивку. Но это, как прило, очень морочно и такую возможность стараются не исползовать.
0
На самом деле, там всё довольно просто — можно делать «частичные» прошивки под целые области ПЛИС. Посмотрите видик :)
www.xilinx.com/partial-reconfiguration
В нижнем правом углу ссылка.

У Xilinx — только Virtex =(
Про Спартаны написано, что «в будущих семействах». А поскольку в седьмой серии спатранов нет вообще — фиг знает, будет ли что-то %)

У Альтеры, по слухам, тоже такое есть, но подробно я не в курсе, ибо тоже из лагеря Xilinx )
0
Спасибо. Стало немного понятнее.
Как подвернется проект на Virtex попробую на практике.
0
Ewgeny7, а не могли бы Вы написать простенькие статьи по FPGA. Или по микросхемам конфигураторам. Например, как зашить прошивку в конфигуратор, какой файл, как это сделать с помощью микроконтроллера… Хотябы в общих чертах для чайников… Думаю что былобы очень полезно начинающим.
0
Скорее всего начну писать статейки. Я, честно говоря, немножко офигел от местных произведений «для чайников», зачем там лезут в такие дебри? Только народ от ПЛИСок отпугивать. Начать с тупого создания проекта под Кактус, описать обычный шаблон (я именно так начинаю проекты), привести примеры применения операторов и процессов для создания желаемых «элементов» схем — с этого надо начинать, а не с высокоумных теорий и подключений модулей. Попробую нацарапать что-нить несложное и доходчивое для понимания.
0
Доброго времени суток. Спасибо за статью. А есть ли статья типа «Пример моделирования »? Если нет, то напишите пожалуйста в помощь начинающим… желательно в ISim Simulatore =) (простите за наглость).
0
А скажите, как можно реализовать «бегущий огонек» с использованием сдвига что-ли? Ну.т.е. то же самое, только без таблицы, а с «переменной», которую шифтить каждый такт.
0
На vhdl не знаю, а на верилоге так будет:
reg [7:0] LEDS = 8'b00000001;
always @(posedge clock)
LEDS <= {LEDS[6:0],LEDS[7]};
Где LEDS — та наша переменная, а clock — сигнал, по переднему фронту которого сдвигаем.
Можно еще вместо LEDS <= {LEDS[6:0],LEDS[7]}; сделать LEDS <= LEDS <<< 1;
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.