32bit_me: (Default)
Прочитал руководство Altera AN709 "HPS SoC Boot Guide - Cyclone V SoC Development Kit", описывающее процесс загрузки ОС в память и инициализацию встроенного процессора ARM9.
30 стр., англ. язык.

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)

Продолжение. Часть 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)

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)

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)
Временная диаграмма, развёрнутая на трёх мониторах. Картика кликабельна.

32bit_me: (Default)

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

В задачах, связанных с арифметическими функциями, часто необходимо подсчитать количество нулей в старших разрядах числа. Эту функцию можно реализовать по-разному.

Итак, вариант 1:

1
2
3
4
5
6
7
8
9
10
11
12
function [ZERO_DATA_WIDTH - 1: 0] zero_cnt;
input [DATA_WIDTH - 1: 0] in;
integer i;
begin
  zero_cnt = DATA_WIDTH;
  for(i = DATA_WIDTH - 1; i >= 0; i = i - 1)
  begin
    if(in[i] && zero_cnt == DATA_WIDTH)
	   zero_cnt = DATA_WIDTH - i - 1;
  end
end
endfunction

Read the rest of this entry »

32bit_me: (Default)

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

Прочитал книгу »FPGA prototyping by Verilog examples», очень понравилось.
Обычно в таких книгах приводится синтаксис языка и какие-либо примеры проектов, часто далёкие от практики. В этой книге описываюься примеры взаимодействия с периферийными устройствами: клавиатурой, мышью, VGA-мониторм, памятью SRAM. Примеры приведены в расчёте на плату фирмы Digilent с FPGA семейства Spartan-3, но приведённые примеры практически не содержат чего-то специфического именно для данного семейства FPGA.

fpga_vlog_front

Во второй половине книги рассмотрен встраиваемый микроконтроллер PicoBlaze, его ассемблер, и приводятся примеры программ на нём.

В книге рассматривается метод синтеза RTL-кода из ASMD-диаграмм (представление алгоритма, сочетающее в себе графическую блок-схему алгоритма и граф конечного автомата).

Также в книге рассматривается проект простой видеоигры, которую можно сделать на плате Digilent (или на любой другой, если позволяют аппаратные возможности).

32bit_me: (Default)

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

Целью проекта является разработка видеоадаптера на FPGA. Выходом видеоадаптера является VGA, на данный момент поддерживается глубина цвета 6 бит (по 2 бита на цвет RGB).
Разъём VGA подключен к FPGA по следующей схеме:

schematics

 

Резисторы R1-R6 образуют простейший ЦАП, для начала хватит такого, если нужна большая глубина цвета, то лучше использовать специализированные микросхемы видеоЦАП, например ADV7123.

Read the rest of this entry »

32bit_me: (Default)

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

Предыдущая часть здесь.

pic

Продолжим разработку FPU. В предыдущих частях был рассмотрен делитель вещественных чисел Деление является самым сложным в реализации арифметическим действием. Следующим по сложности идёт сложение, а самой простой операцией является умножение. В этой части рассмотрен умножитель.

Read the rest of this entry »

32bit_me: (Default)

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

Прочитал руководство по разработке печатных плат для Zynq 7000.

На самом деле, конечно, информация, приведенная в руководстве, относится не только к Zynq 7000, а вообще ко всем быстродействующим цифровым схемам, просто приведена на примере Zynq 7000. Приведены сведения, касающиеся проектирования системы питания (номиналы и количество конденсаторов), сведения по согласованию импедансов линий, по интерфейсам (интерфейс с памятью DDR2, DDR3, LPDDR2, SD-card, Ethernet, IIC и др.).

В общем, очень полезное руководство.


32bit_me: (Default)

Дочитал книгу «The Zynq Book», руководство по системе на кристалле (SoC) Zynq-7000 фирмы Xilinx.

Напомню, что Zynq-7000 состоит из двух ядер ARM Cortex A9 и блока программируемой логики PL (по сути, встроенная в систему FPGA).

В книге подробно рассматривается структура системы, программный пакет Vivado, предназначенный для разработки под Zynq-7000, подробно рассматривается процесс преобразования кода на языке высокого уровня (например, С) в форму RTL, предназначенную для конфигурирования PL . Эта возможность обеспечивается программой Vivado HLS.
В последней части книги кратко описывается структура и процедура загрузки Linux в память.

ZynqPerspective
Интересная книга, интересный процессор.

32bit_me: (Default)

Итак, продолжим разработку FPU.

Первая часть статьи находится здесь: http://32bit.me/?p=1902. Напомню также, что все исходники, приведенные в статье, можно скачать на гитхабе.

waveform-1

Картинка для привлечения внимания (кликабельно)

Read more... )
В следующей статье мы нарисуем остальную сову напишем сам модуль div_float.

Комментарии, вопросы и пожелания приветствуются. Не стесняйтесь.
P.S. Если кто-либо знает, как в ЖЖ вставлять исходники с подсветкой синтаксиса, подобно тому, как это делается в Wordpress, напишите, пожалуйста.

Profile

32bit_me: (Default)
32bit_me

April 2017

S M T W T F S
      1
2 34 5678
9101112 1314 15
16171819202122
23242526272829
30      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 27th, 2017 04:38 pm
Powered by Dreamwidth Studios