Схемотехническое проектирование для ПЛИС

Чтобы заставить ПЛИС что-либо делать можно описать ее поведение с помощью языков описания аппаратуры (VHDL, Verilog) или нарисовать схему устройства на дискретных логических элементах. Про языки уже писали, но ПЛИС это набор логических ячеек, раньше это были элементы 2И-НЕ, сейчас они более сложные, которые изначально не соединены, а потом, в зависимости от программы, соединяются в определенной последовательности. Таким образов внутри микросхемы строится некий набор логики, т. е. код на языке программирования преобразовывается в набор логики. Так почему бы сразу не описать этот набор логики?

Ответ на этот вопрос будет в конце статьи, а сейчас про схемотехническое проектирование в среде Quartus II.

Чтобы было проще показать как все работает я переведу программу на VHDL из статьи UART приемник на VHDL на набор логики.

После создания проекта, создаем файл схематического описания
File->New->Block Diagram/Schematic File


Перед созданием схемы лучше все начеркать на бумажке.

Чтобы добавить логический элемент жмем на кнопочку с изображением элемента 2И (Symbol Tool), появляется окошко


Поклацайте, посмотрите что есть в библиотеках. Более интересным будет MegaWizard Plug-In Manager.


Запускаем, жмем Next. Перед вами множество «мегафункций» которые можно настраивать под себя, тоже поклацайте (если название мегафункии серое, значит она не поддерживается в вашей микросхеме). Показывать буду на примере счетчика.


Жмем Next


С настройками, думаю, все должно быть понятно, можно выбирать разрядность счетчика, направление счета. Все изменения сразу отображаются на картинки объекта. В левом правом углу видим количество использованных ресурсов (выделено на рисунке), это могут быть логические блоки, биты памяти, умножители, и т. д.

На следующих этапах также выбираем различные настройки в зависимости от задачи. В конце жмем Finish, соглашаемся. После этого наш счетчик появляется в папке Project.


Чтобы скопировать элемент который уже на схеме, выделяем его, зажимаем Ctrl и перетаскиваем.

У меня получилась такая схема

(кликайте)

Отличие от программы на VHDL в асинхронном обнаружении старта передачи

(здесь ловим спад от 1 до 0 при отсутствии работы счетчика)
Также в асинхронном сбросе при отсутствии старт-бита и окончания приема.

Найдем соответствие между VHDL кодом и схемой устройства.
(соединения с одинаков названиям являются одним проводом, чтобы присвоить имя соединению, на нем жмем правой кнопкой мыши->Properties, в поле Name вводим название. Это удобно когда на схеме много соединений. Для шины номер бита вписывается в квадратных скобках)


Это соответствует примерно этому коду
if (counter = 8) then
case (state) is
	when 0 =>
		if (rx = '0') then	-- проверяем старт-бит
			state := 1;	
		else state := 0;
			count <= '0';
		end if;
	when 1 => data(0) := rx;	-- запоминаем бит
		state := 2;
	when 2 => data(1) := rx;
		state := 3;
	when 3 => data(2) := rx;
		state := 4;
	when 4 => data(3) := rx;
		state := 5;
	when 5 => data(4) := rx;
		state := 6;
	when 6 => data(5) := rx;
		state := 7;
	when 7 => data(6) := rx;
		state := 8;
	when 8 => data(7) := rx;
		state := 9;
	when 9 => state := 0;
		count <= '0';
		if (rx = '1') then		-- проверяем стоп-бит
			data_out <= data;	-- выводим данные
		end if;
end case;


Переменная counter это счетчик counter_16, когда счетчик досчитает до 8, что соответствует 1000 в двоичной системе, счетчик counter_12 увеличит свое значение. counter_12 соответствует переменной state, вместе с 16 BIT DEMUX он составляет оператор case. При увеличении counter_12 переключаются выходы дешифратора 16 BIT DEMUX, во время переключения которых (по фронтам) защелкиваются D-триггеры, эти триггеры аналогичны переменной data.


Это проверка на стоп-бит, примерно соответствует этому коду
if (rx = '1') then		-- проверяем стоп-бит
	data_out <= data;	-- выводим данные
end if;


Выходной буфер


Соответствует этому присвоению
data_out <= data;


Чего нет в программе

это внутренний генератор MAX II и делитель частоты.

uart.rar

А теперь о вопросе.
Все это я решил проделать ради спортивного интереса после этого сообщения http://we.easyelectronics.ru/plis/osvoenie-plis-s-ispolzovaniem-yazyka-verilog.html#comment1938. Сначала я подумал что описание на логике будет более эффективное чем на VHDL (мало что там компилятор может напартачить), но оказалось что нет. Программа на VHDL занимает в кристалле 41 логический элемент, а схемотехническое описание – 39, я это связываю с асинхронным определением старта передачи.

Время написания кода и составления схемы примерно одинаково, поскольку перед написанием программы на языке описании аппаратуры вы продумываете устройство как набор блоков, которые в конечном счете превратятся в логические элементы внутри кристалла.

Файлы в топике: uart.zip

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

RSS свернуть / развернуть
Описание на VHDL занимает меньше лог. ресурсов, а триггеров сколько кушает? Там вроде при компиляции еще оптимизатор работает, так что код еще оптимизируется. А вообще неплохо бы статейку наоборот, каким образом различные синтаксические конструкции реализуются на ПЛИС, вот это была бы польза, так как когда пишешь ход, все хорошо понимать во что он превратится.
0
Логические элементы это и есть триггеры, только сложнее. Оптимизатор работает в любом случае, к примеру если поставить микросхему 74 логики и не использовать все ее возможность, то неиспользуемое просто не будет компилироваться.

По поводу конструкций надо сделать небольшое исследование (даже просто для себя), поскольку различный код может компилироваться в одинаковые структуры.
0
Тогда уточните, что именно в статье вы называете логическими элементами, а то не ясно, в составе ПЛИС есть таблицы истинности, а есть триггеры.
0
Таблицы истинности, даже не знаю. Я работал только с ПЛИС Alterы, больше всего с MAX II, там все строится из таких блоков http://radikal.ru/F/i082.radikal.ru/1103/f5/48e02011ad2f.png.html (синим выделено соединение внутри чипа, это из этого проекта)
0
Я с кристаллами Altera не разбирался, но у всех ПЛИС похожие элементы, просто называются по разному. На фото похоже изображены две таблицы истинности 3-х входовых таблицы истинности и один триггер — это я так понял ячейка, тогда вы имеете ввиду расход в ячейках?
0
Посмотрел подробней-это одна 4-х входовая таблица истинности, в предыдущем коменте неправильно написал.
0
Да, количество таких ячеек. Я понял что вы имели ввиду говоря о таблицах истинности.
0
Хорошая статья. У меня все руки до рисовалки не доходили, посмотреть что там и как. Да и вообще посмотрел на вкусности интерфейса — точно в ближайшее время качну Квартус. МахПлюс походу много чего не умеет…
0
Ув. hellraiser, можно как то рассказать, где этот Квартус брать, как и куда ставить?
Отдельной краткой статьёй.
0
уже написали до меня http://marsohod.org/index.php/software
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.