Hello world для ПЛИС на языке Verilog

Наконец-то пришла макетная плата с ПЛИС. Вот ссылка  на нее на ebay. Называется она EP4CE6E22 FPGA Dev Board + USB Blaster Programmer.

Это мой первый опыт с ПЛИС`ами так, что взял по совету именно эту макетку.

Что здесь есть

  • программатор
  • плата
    • 8 светодиодов
    • 2 кнопки
    • питание от USB
    • выведенные все ноги
    • 3 регулятора напряжения
    • резонатор на 25 МГц
  • 2 USB кабеля

Ниже показана обратная сторона платы.

С чего начать

Если подключить плату к USB, то запустится стартовая прошивка. Вы увидите как 1 светящийся СД продвигается вправо. При нажатии на кнопки будет происходить смена направления движения.

И все же хотелось бы сделать что-то свое.

Hello world.

Анализ мной интернетов привел к выводам, что все придумывают слишком сложный стартовый пример.

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

Я все делал по инструкции в последней ссылке за исключением некоторых моментов:

  • Шаг 9. Код программы я адаптировал под свою плату. Хочу чтобы один СД светился, когда нажимаешь хотя бы одну кнопку из двух (ИЛИ), а второй когда обе нажаты (И).
module test_wires(
     input wire key1,
     input wire key2,
     output wire led1,
     output wire led2
     );
assign led1 = key1 & key2;
assign led2 = key1 | key2;

endmodule

На деле все получилось наоборот. Они светились по умолчанию и когда нажимаешь соответствующее комбо гасли.

  • Шаг 22 – 24. Вместо непонятной таблички использовал красивую картинку Assignment/Pin Planner (Ctrl+Shift+N)

С ней намного проще. Просто нажимаешь на вывод который хочешь использовать и  в окне (справа) указываешь провод или регистр который хочешь подцепить.

После этого в табличке снизу заполняется соответствующая строка. Все. Можно закрывать.

  • Шаг 26-28. Вообще странно. Как-то все по другому. + Драйвера пришлось искать непонятно где.

Открываем этот Programmer делаем поиск оборудования, все норм, а вот потом надо найти нашу плату. Это делается нажатием на кнопку Auto Detect.

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

Это не все. После этого появится какая-то строка в табличке а столбец – файл будет пуст. Надо его заполнить. Я делаю это так:

В папке с проектом есть папка output_files. Именно в ней лежит нужный файл.

Ну и все. После того как все графы заполнены ставим галку Programm/… Нажимаем Start. Все!

Про прошивку в ОЗУ и в EEPROM

http://we.easyelectronics.ru/plis/osvoenie-plis-s-ispolzovaniem-yazyka-verilog.html

Должно работать.

Дальше будем разбираться с работой регистров, тем как обрабатывать тактирование от резонатора, как сделать делитель частоты и как сделать ШИМ.

Генерируем изображение на телеке с помощью Arduino

Недавно пришла мысль, сделать что-нибудь связанное с выводом на обычный телевизор. Поиски навели меня на вот эту статью:

http://www.instructables.com/id/TV-Out-with-Arduino/

и соответственно библиотеку которая там используется https://code.google.com/p/arduino-tvout/downloads/detail?name=TVout_R5.91.zip&can=2&q= .

Создатели библиотеки хорошо постарались над ее созданием и написали довольно таки подробный вики: https://code.google.com/p/arduino-tvout/wiki/Useage .

Предлагаю рассмотреть сначала функции библиотеки, а затем саму начинку библиотеки.

Библиоткеа

Рассмотрим работу библиотеки сразу на простом примере:

#include <TVout.h>
#include <fontALL.h>
TVout TV;
 
void setup ( )
{
  TV.begin(NTSC,120,96);
  TV.select_font(font6x8);
  TV.println("Sainquake");
  TV.delay ( 1000 );
}
int i=0;
void loop ( )
{
  TV.clear_screen ( );
  //TV.println("Sainquake");
  TV.draw_rect(0,0,119,95,WHITE);
  TV.print(10,40,"Happy new Year!!!");
  TV.draw_line(10,50,110,50,WHITE);
  TV.print(80,1,i);
  TV.delay ( 10 );
  i++;
}

 

В проекте подключены 2 библиотеки которые скачиваются по ссылке выше. Соответственно содержимое архива надо положить в папку Arduino/libraries/

Итак. В setup у нас стандартная конструкция инициализации: begin. В ней мы указываем стандарт телевидения NTSC или PAL. PAL вам нужен будет только, если вы захотите подключиться к старому ламповому телевизору. Далее задается количество строк и столбцов в будущем изображении. Может быть я что-то каряво сделал, но изменение этих параметров не дало никаких результатов. К сожалению разрешение изображение ограничивается тактовой частотой самой Arduino.

Ну и собственно сразу после инициализации мы можем подключить шрифт и писать текст на экране.

Далее в loop у меня есть несколько функций которые скорее всего понадобятся.

TV.clear_screen ( );

Очистка экрана.

TV.draw_rect(0,0,119,95,WHITE);

Рисуем квадрат. Соответственно аргументы: x0, y0, width, height, color (WHITE || BLACK || INVERT)

TV.draw_line(10,50,110,50,WHITE);

Рисуем линию. Аргументы такие же, только не ширина и высота, а координаты конечной точки.

По большому счету больше функций то и не понадобится.

Теперь о HW части.

По сути это все что вам нужно.

У контроллера выделяетя 2 вывода которые соединяются в один через резисторы. На схеме так же показаны диоды для защиты от обратного тока, но и без них работает.

Эти 2 вывода по распиновке Arduino UNO будут 7 – Video и 9 – Sync.

Теперь самое сложное, вам нужно найти у себя на телевизоре вход под названием тюльпан.

О том как работает библиотека

При инициализации работы (begin) в памяти занимается место под буфер экрана.

А дальше идет только работа с таймером. В функции render_setup запускается таймер1.

Во момент прерывания от переполнения таймера вызывается функция по ссылке line_handler();. В свою очередь эта ссылка меняется на разные функции. Вот тут то и начинается магия.

Далее последовательно по таймеру выполняются несколько функций:

  • vsync_line() – генерирует синхроимпульс
  • blank_line() – вызывает либо синхронизацию либо прорисовку строки.
  • active_line() – прорисовывает строку вызывая функцию render_line();

Содержимое render_line(); зависит от разрешения, в инициализации выбирается соответствующая функция выполняемая здесь. Эта функция отписана на асме, чтобы точно знать момент поднятия или опускания вывода. По сути в этой функции идет подсчет тактов и дергание ногой.

 Бонус

Сделал на основе этой библиотеки следующий проект. По сути создание 3D кубика взято из примера к той же библиотеке.

Описание: Ардуинка считывает с АЦП напряжение на потенциометре и вращает кубик со скоростью пропорционально считанному значению. + идет счет времени (левый верхний угол) + выводится откалиброванное считанное значение с АЦП (Правый верхний угол).