32bit_me: (Default)
При установке DS-5 и Quartus под Linux могут возникнуть некоторые проблемы.



Read more... )
32bit_me: (Default)
Здесь будут полезные ссылки по SoC Cyclone V и Linux.
Часть этих ссылок я уже приводил, но повторю их здесь, чтобы лишний раз не искать.

1. https://zhehaomao.com/blog/fpga/2013/12/22/sockit-1.html - Подробное введение в SoC на примере платы Arrow SoCKit.
2. https://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/arm-linux-gnueabihf/ - Компилятор Linaro 4.9 (на версии 5 и выше не собираются исходники GSRD Linux от rocketboards)
3. https://rocketboards.org/foswiki/view/Projects/WebHome#fq=field_Board_s%3AArrowSoCKitEvaluationBoard - проекты от RocketBoards
4. git://git.rocketboards.org/linux-socfpga.git - исходники от Rocketboards.org

Список будет пополняться.
32bit_me: (Default)
Поставил Quartus Prime Lite Edition (скачивается бесплатно с altera.com)




Всё работает, но не видит JTAG. При попытке запустить jtagd руками пишет: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory
Лечится так:
sudo locale -gen "en_US.UTF-8"
sudo dpkg - reconfigure locales


В появившемся "окне" выбираем локаль en_US.UTF-8, нажимаем OK, теперь всё работает.
32bit_me: (Default)
Прочитал книгу Daniel Nenni, Don Dingee "The Emergence of FPGA-based Prototyping for SoC Design", 122 стр., англ. язык.



К сожалению, ничего хорошего сказать не могу, 100% вода, ничего практического. Зато книга доступна для скачивания официально бесплатно.
32bit_me: (Default)
UG1165 - Zynq-7000 All Programmable SoC: Embedded Design Tutorial. A Hands-On Guide to Effective. Embedded System Design. 110 стр. англ. язык.
Ещё один материал по Xilinx Zynq, на этот раз по программированию под Linux.


Необходимо заметить, что Zynq не подразумевает обязательного использования Linux, можно использовать также ОСРВ или писать bare-metal приложения. Тем не менее данное руководство может оказаться полезным.
32bit_me: (Default)
Ещё два документа по SoC Zynq 7000:

1. UG821 - Zynq-7000 All Programmable SoC Software Developers Guide, 68 стр. англ. язык.
Подробно описан процесс загрузки и запуска ПО, начиная с BootROM, далее FSBL, далее UBoot и операционная система (если она используется).
2. ZedBoard Hardware User’s Guide - описание схемы платы ZedBoard, 38 стр. англ. язык.

32bit_me: (Default)
Прочитал несколько документов, описывающих Xilinx XADC.



XADC - это IP-блок в составе SoC Xilinx Zynq 7000, содержащий два АЦП разрядностью 12 бит и производительностью 1 MSPS каждый. Эти АЦП позволяют производить мониторинг температуры и питающих напряжений кристалла, а также оцифровывать внешние аналоговые сигналы.

XADC и работа с ним описаны в следующих документах:
1. UG480 - 7 Series FPGAs and Zynq-7000 All Programmable SoC XADC Dual 12-Bit 1 MSPS Analog-to-Digital Converter User Guide, 92 стр., англ. язык.
2. UG772 - LogiCORE IP XADC Wizard v2.2, 36 стр., англ. язык.
3. PG091 - XADC Wizard v3.0 LogiCORE IP Product Guide, 71 стр., англ. язык.
32bit_me: (Default)
Дочитал книгу "The Zynq Book Tutorials", 186 стр., англ. язык.
Книга является приложением к книге "The Zynq Book", про которую я уже писал здесь.



Книга является сборником лабораторных работ по системе на кристалле Xilinx Zynq 7000, и содержит практические занятия, которые можно выполнить с помощью плат ZedBoard или Zybo.
Я выполнил все занятия из этой книге на плате ZedBoard.
плата )
В книге описываются следующие темы: Vivado HLx (среда разработки для Zynq), Vivado HLS (High-Level Synthesis, генератор RTL-кода из кода на С/C++), генерация IP-ядра из Matlab Simulink, и Xilinx SDK, в котором разрабатывается непосредственно программа, выполняемая на ядрах ARM Cortex A9, встроенных в SoC.
32bit_me: (Default)
Прочитал книгу C  Maxfield   "FPGAs: Instant Access", 216 стр., англ. язык.
Хорошее введение в предмет, но только общие слова, без конкретики, без примеров кода, без описания конкретных FPGA.
Подойдёт для первого знакомства с предметом, однако лично мне хочется чего-то более основательного.

32bit_me: (Default)

Продолжение. Часть 2.

Структурная схема видеоадаптера приведена на рис. 1 (кликабельно)

Рис. 1. Структурная схема видеоадаптера.

Пояснения к схеме:

В первой версии видеоадаптер будет иметь только текстовый режим EGA, 80 * 25 символов 8 * 14 пикселов каждый символ. Таким образом, экранное разрешение составит 8 * 80 = 640 пикселов по горизонтали и 14 * 25 = 350 пикселов по вертикали. Частота пикселов в этом режиме составляет, по стандарту 25,175 МГц, фактическая частота будет 25 МГц, в связи с тем, что частота тактирования ПЛИС составляет 50 МГц. При этом на любом мониторе происходит нормальная синхронизация.

Read more... )

Я всячески приветствую всякие комментарии, пожелания, советы (если они дельные) и всё прочее, что мои уважаемые френды захотят сообщить мне в комментариях. Пишите, не стесняйтесь!

Эту запись вы также можете прочитать в моём блоге http://32bit.me/?p=2174

32bit_me: (Default)
Продолжение. Начало.

Проект видеоадаптера переделан под использование видео ЦАП ADV7123. Схема подключения приведена на рисунке:


(по клику откроется полный размер).

Код проекта приведён на гитхабе (ссылка). Это тестовый код, который выводит на монитор поле разноцветных квадратов.

По сравнению с предыдущей версией, в которой использовался резистивный ЦАП, увеличена разрядность с 2-х до 8-и бит на цвет, и существенно улучшилось качество изображения.

Фото тестовой картинки:

32bit_me: (Default)
Модуль расчёта хэша MD5 на Verilog, тест:

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Продолжаю эксперименты с Altera Cyclone V. На этот раз объектом эксперимента стал драйвер для той прошивки FPGA, про которую я писал ранее. Сама прошивка простейшая: она просто мигает светодиодами с частотой, которую можно задавать программно. В прошлом посте на эту тему я сделал управление частотой мигания из обычной (user-space) программы, которая получает доступ к физической памяти через функции open(«/dev/mem») и mmap().
Однако такой путь считается «hacky and unsafe». Поэтому следующим логичным шагом должно стать написание драйвера.

Tux-linux-and-ARM-multiplatform-support

Я воспользовался готовым исходником драйвера (ссылка) за авторством Howard Mao (он на самом деле не Howard, а Zhe Hao Mao). Конечно, для того, чтобы разобраться в работе кода, почитал отдельные главы книги Linux Device Drivers (есть русский перевод).

Для компиляции пришлось вытаскивать архив Arrow SocKit 13.1 GSRD Linux отсюда: http://releases.rocketboards.org/release/2013.11/gsrd/src, файл linux-socfpga-gsrd-13.1-src.bsx. Объем архива около 1.1 Гб, но сервер очень медленный, качается несколько часов. Честно говоря, я впервые увидел файл с расширением bsx, оказалось, что это самораспаковывающийся архив. Просто запускаем его и он разворачивается в указанную папку. В ней в папке sources находится файл linux-socfpga.tgz. Его тоже нужно распаковать, естественно. Это и есть как таковое ядро системы, которое нужно указывать при компиляции драйвера.

Однако всё не так просто. После компиляции записываем скомпилированный драйвер blinker.ko на SD-карту, после загрузки Linux пишем insmod blinker.ko и получаем следующее: «blinker: version magic ’3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8 ‘ should be ’3.9.0 SMP mod_unload ARMv7 p2v8′«. Не совпали волшебные номерки. Причем версия одна и та же, просто зачем-то к ней приделан какой-то добавочный номер.

Решений может быть три: 1. Скомпилировать Linux именно их этого скачанного исходника (очень неохота) или 2. Подправить номер в исходниках ядра Linux. 3. Использовать команду modprobe с ключом -f, который заставляет систему игнорировать «волшебные цифры».  Однако этот способ почему-то не заработал.
Итак, способ номер 2, подправить номер в исходнике ядра. Данный номер записан в файле /include/generated/utsrelease.h. Исправляем то, что там было, на «3.9.0″, и перекомпилируем драйвер. На всякий случай смотрим hex-редактором файл blinker.ko, чтобы убедиться, что волшебные циферки такие, как нужно. Снова записываем драйвер на SD-карту, запускаем insmod, всё прошло гладко. Теперь можно проверить работу драйвера, посылая ему числа от 1 до 15 для управления частотой миганий: echo 1 > blinker — мигает быстро, echo 15 > blinker — мигает медленно. Пока всё. Немного, но путь в тысячу ли начинается с одного шага.

Эксперименты продолжаются.

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Приведённый ниже код писал не я, он взят отсюда: https://zhehaomao.com/blog/fpga/2013/12/27/sockit-3.html, но я решил оставить его здесь, т.к. он пригодится для дальнейших экспериментов.

Напоминаю, что данная программа работает в ОС Linux GSRD на SoC Altera Cyclone V (ядро ARM Cortex A9). Компилятор Linaro GCC, берём здесь: http://releases.linaro.org/latest/components/toolchain/binaries/4.8/arm-linux-gnueabihf/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <sys/mman.h>;
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
 
#define PAGE_SIZE 4096
#define LWHPS2FPGA_BRIDGE_BASE 0xff200000
#define BLINK_OFFSET 0x0
 
volatile unsigned char *blink_mem;
void *bridge_map;
 
int main(int argc, char *argv[])
{
	int fd, ret = EXIT_FAILURE;
	unsigned char value;
	off_t blink_base = LWHPS2FPGA_BRIDGE_BASE;
 
	if (argc < 2) {
		fprintf(stderr, "Usage: %s number\n", argv[0]);
		exit(EXIT_FAILURE);
	}
 
	/* check the bounds of the value being set */
	value = atoi(argv[1]);
	if (value < 1 || value > 15) {
		fprintf(stderr, "Invalid delay setting."
				"Delay must be between 1 and 15, inclusive.\n");
		exit(EXIT_FAILURE);
	}
 
	/* open the memory device file */
	fd = open("/dev/mem", O_RDWR|O_SYNC);
	if (fd < 0) {
		perror("open");
		exit(EXIT_FAILURE);
	}
 
	/* map the LWHPS2FPGA bridge into process memory */
	bridge_map = mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_SHARED,
				fd, blink_base);
	if (bridge_map == MAP_FAILED) {
		perror("mmap");
		goto cleanup;
	}
 
	/* get the delay_ctrl peripheral's base address */
	blink_mem = (unsigned char *) (bridge_map + BLINK_OFFSET);
 
	/* write the value */
	*blink_mem = value;
 
	if (munmap(bridge_map, PAGE_SIZE) < 0) {
		perror("munmap");
		goto cleanup;
	}
 
	ret = 0;
 
cleanup:
	close(fd);
	return ret;
}

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

Read the rest of this entry »

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

В общем, ничего сложного.
Для того, чтобы заливать прошивку в FPGA из процессорного ядра, нужно сделать следующее:
1. Подготовить файл rbf, это и есть файл прошивки. Он делается из файла sof с помощью утилиты Quartus:

quartus_cpf -c output_files/sockit_test.sof output_files/sockit_test.rbf

Положить этот файл в основной раздел SD-карты, например, в корень.

2. После загрузки linux, отключить мосты между FPGA и HPS (HPS — это процессорное ядро):

echo 0 > /sys/class/fpga-bridge/fpga2hps/enable
echo 0 > /sys/class/fpga-bridge/hps2fpga/enable
echo 0 > /sys/class/fpga-bridge/lwhps2fpga/enable

И заливаем файл в FPGA:

dd if=/sockit_test.rbf of=/dev/fpga0 bs=1M

Собственно, всё. Мосты можно включить обратно, если нужно:

echo 1 > /sys/class/fpga-bridge/fpga2hps/enable
echo 1 > /sys/class/fpga-bridge/hps2fpga/enable
echo 1 > /sys/class/fpga-bridge/lwhps2fpga/enable

Разумеется, всё это можно делать скриптом.
Пишем файл gsrd_init.sh:

1
2
3
4
5
6
7
8
9
#!/bin/sh
 
echo 0 > /sys/class/fpga-bridge/fpga2hps/enable
echo 0 > /sys/class/fpga-bridge/hps2fpga/enable
echo 0 > /sys/class/fpga-bridge/lwhps2fpga/enable
dd if=/sockit_test.rbf of=/dev/fpga0 bs=1M
echo 1 > /sys/class/fpga-bridge/fpga2hps/enable
echo 1 > /sys/class/fpga-bridge/hps2fpga/enable
echo 1 > /sys/class/fpga-bridge/lwhps2fpga/enable

Кладём его в /etc/init.d. Теперь после загрузки Linux прошивка FPGA будет загружаться автоматически.

32bit_me: (Default)
Существуют готовые образы SD-карты для Altera Cyclone V с разными сборками Linux, но мы же не ищем лёгких путей.
Собрал kernel из исходников, накатил на карту, записал bootloader. Процесс довольно сложный, надо сказать, потратил на него почти весь день. То есть не на сам процесс, а на разные разбирательства "что я сделал не так". В итоге ядро загрузилось, но голое ядро без всего, это довольно унылое зрелище, поэтому скриншотов приводить не буду.

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Прочитал и освоил на практике воркбенч SoCKit Lab, две части, Hardware и Software.

Данная программа лабораторных работ основана на системе на кристалле (SoC) Altera Cyclone V. SoC состоит из двух процессорных ядер ARM Cortex A9 и FPGA, которые соединены мостами и могут взаимодействовать друг с другом. Первое руководство, Hardware, выполняется в Quartus II, и описывает конфигурирование и подключение периферии к процессору, а также симуляцию системы в ModelSim.

Вторая часть, Software, описывает процесс загрузки Linux, компиляцию простейшей программы (мигание светодиодом), отладку программы в ARM DS-5 Embedded Development Suite, и основы работы с SignalTap II Logic Analyzer в режиме совместной отладки программного кода и FPGA-проекта.


pic1

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

PS: где скачать: http://rocketboards.org/foswiki/Documentation/ArrowSoCKitEvaluationBoard, здесь куча материалов по SoCKit, в том числе zip-ы

SoCKIT_Materials_13.1.zip, SoCKIT_Materials_14.0.zip, SoCKIT_Materials_14.1.zip. Скачиваем, распаковываем, там лежат pdf-ы с описанием лабораторных и с файлами проектов Quartus II, DS-5, Signal Tap II и пр. Они отличаются, в зависимости от версии Quartus II. Я делал для версии 14.0.
32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Пусть в проекте FPGA необходимо ПЗУ, в которое записана определённая информация, имеющаяся у нас в виде бинарного файла. ПЗУ, как правило, реализуются на блоках BRAM, в которые при инициализации FPGA записывается требуемое содержимое.
Файлы инициализации памяти BRAM для FPGA, могут иметь формат MIF (Memory Initialization File) или формат HEX.

DSC_0522_EDIT

Нужный модуль памяти можно сгенерировать в Quartus II с помощью MegaWizard, в ISE — с помощью Xilinx Core Generator. Кроме этого, в QuartusII возможно использование специальной директивы:

1
reg [7:0] mem[0:2047] /* synthesis ram_init_file = "test.mif" */;

Эта директива позволяет создать RAM, инициированную значениями из файла .MIF. Использование RAM с предустановленными значениями, это очень плохая идея, но в качестве ROM такую память использовать вполне можно. Проблема в том, что эту директиву понимает только Quartus II, никакой кроссплатформенности.

Quartus II предоставляет редактор файлов памяти, и возможность загрузки файлов .mif и .hex, Xilinx Core Generator требует загрузки файла .coe, имеющего другой формат, нежели MIF. Однако хочется иметь кроссплатформенное решение, которое не зависело бы от платформы. Таким вариантом является генерация ROM в виде case-конструкции:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
always@(posedge clk)
begin
  case(in)
  ...
  11'h00d: out = 8'h99;
  11'h00e: out = 8'h81;
  11'h00f: out = 8'h7e;
  11'h010: out = 8'h7e;
  11'h011: out = 8'hff;
  11'h012: out = 8'hdb;
  11'h013: out = 8'hff;
  11'h014: out = 8'hc3;
  11'h015: out = 8'he7;
  11'h016: out = 8'hff;
  ...
  endcase
end

Полезная ссылка: различные конструкции для генерации разных типов RAM, ROM и других модулей можно найти в руководстве Altera «Recommended HDL Coding Styles»: https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/qts/qts_qii51007.pdf
Я написал две простые утилиты, которая преобразует бинарный файл в MIF и в тело конструкции case.

Read the rest of this entry »

32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Итак, сумматор чисел в формате IEEE 754 с разрядностью 32 или 64 бита.

Исходники можно скачать на Github: https://github.com/arktur04/FPU.

КДПВ (кликабельно, та же картинка, что и в предыдущем посте):

Read the rest of this entry »

32bit_me: (Default)
Временная диаграмма, развёрнутая на трёх мониторах. Картика кликабельна.

Profile

32bit_me: (Default)
32bit_me

July 2017

S M T W T F S
      1
2345678
9101112131415
16171819202122
232425262728 29
3031     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 21st, 2017 01:33 am
Powered by Dreamwidth Studios