Vga gain что это
Блок VGA масштабирует амплитуду входной формы волны на основе усиления, заданного пользователем.
Документация SerDes Toolbox
Recent Comments
MyDixieWrecked on Financial Times Story about Ukraine Radio Monitoring with WebSDRs : “ Why is it that the corporations, banks and their followers all favor Ukraine over Russia, despite a vast majority of… ” May 10, 19:38
Alberto on SATSAGEN Spectrum Analyzer Software Updated: Now Supports RTL-SDR : “ Hi Kevin, Thank you very much for your interest. Based on your availability, I hope to make a version to… ” May 6, 11:43
Kenny on Opening and Starting Honda Civic Vehicles with a HackRF Replay Attack : “ Thats a huge vulnerability that Honda should be patching, if i owned any model car with remote start i would… ” May 6, 00:28
Заключение
Полученным знаниям можно найти много применений, притом не обязательно в контексте FPGA. Те же микроконтроллеры STM32, к примеру, прекрасно справляются с задачей генерации VGA-сигнала 800 x 600. Можно писать свои игры, хотя бы простые, вроде змеек и тетрисов (хотя почему бы и не трехмерные). Тем более, что работать со звуком и джойстиком от Sega мы уже умеем. Можно использовать VGA-дисплей для вывода текстовой информации. Тут уже начинает попахивать и своей операционной системой. А еще можно выводить информацию поверх какого-то другого видео (OSD), сохранять скриншоты экрана (вспоминаем сериал Mr.Robot), писать какие-то красночные скринсейверы… В общем, простор для творчества здесь действительно безграничный.
В качестве источников дополнительной информации я бы рекомендовал следующие:
Исходники к заметке, как обычно, вы найдете на GitHub. Любые вопросы и дополнения категорически приветствуются!
Блок VGA масштабирует амплитуду входной формы волны на основе усиления, заданного пользователем.
Параметры
Follow Us
Поддержка
© 1994-2021 The MathWorks, Inc.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
Gain — Включайте параметр Усиления в модель IBIS-AMI
на (значении по умолчанию) | прочь
Выберите, чтобы включать Gain в качестве параметра в файл IBIS-AMI. Если вы отменяете выбор Gain, он удален из файлов AMI, эффективно жесткое кодирование Gain к его текущему значению.
Документация SerDes Toolbox
Порты
Типы данных: double
Вывод
Про железо
Полагаю, VGA-разъемы все видели. Но не все знают, какой из 15-и пинов для чего нужен. Ответить на этот вопрос поможет следующая иллюстрация (которая была позаимствована мной отсюда):
GND — это, понятно, земля. H-SYNC и V-SYNC представляют собой некие синхронизирующие сигналы, которые мы более подробно рассмотрим далее. Три пина используются для передачи цвета в RGB. Например, чем выше напряжение на пине 1, тем больше красной компоненты имеет текущий пиксель. Другими словами, сигнал передается не в цифровом виде, а в аналоговом. Как видите, большинство пинов в разъеме оказались не очень-то используемыми. Мой внутренний минималист негодует!
Из коробки FPGA не очень-то дружат с аналоговыми сигналами. К счастью, генерировать аналоговый сигнал из цифрового мы научились в заметке Генерация синусоидального сигнала, а следовательно и звука, на FPGA. То есть, все, что нам понадобится для решения проблемы — это VGA-разъем, немного резисторов, подходящий операционный усилитель, например, четырехканальный MCP6044 (даташит [PDF]), и свободный вечер. Владельцам платы Nandland Go Board так и вовсе ничего не придется паять, так как плата имеет все необходимое прямо на борту. Если же вы являетесь счастливым обладателем TinyFPGA B2, вас может заинтересовать соответствующая плата расширений, также имеющая VGA-разъем.
Впрочем, я пошел другим путем, и купил готовую плату PmodVGA производства Digilent. В России ее оказалось быстрее и дешевле всего купить в Чип-и-Дипе, хотя доставка и заняла пару недель. Схема платы доступна здесь [PDF].
Использованный в ней самодельный ЦАП работает на знакомом нам принципе — та же R-2R лестница, а вместо операционного усилителя использован неинвертирующий приемопередатчик 74ALVC245. Плата позволяет генерировать 12-и битный цвет, по 4 бита на красный, зеленый и синий. При этом удобно, что все входные пины подтянуты к земле на случай, если мы решим использовать только часть из них.
Плата iCEstick, соединенная с PmodVGA:
Это что касалось чисто железной части. Теперь же попробуем понять часть, написанную на SystemVerilog.
WaveOut — Масштабированный выходной сигнал
скаляр | вектор
Масштабированный выходной сигнал, возвращенный как скаляр или вектор, соответствующий входному сигналу.
Типы данных: double
Параметры
Mode — Рабочий режим VGA
On (значение по умолчанию) | Off
Рабочий режим VGA:
Off — VGA исключен, и входная форма волны остается неизменной.
On — VGA масштабирует входную форму волны согласно заданному Gain .
Программируемое использование
Использование get_param(gcb,'Mode') просмотреть текущий VGA Mode.
Использование set_param(gcb,'Mode',value) установить VGA на определенный Mode.
Основной код
Сколько тактов длятся H-SYNC, V-SYNC и каждое крыльцо, можно подсмотреть там же, где мы смотрели частоту сигнала (раз, два). Ниже приведены значения для выбранного мной режима 800 x 600@56Hz:
parameter horiz_sync_pulse = 128 ;
parameter horiz_back_porch = 128 ;
parameter horiz_active_pixels = 800 ;
parameter horiz_front_porch = 32 ;
parameter vert_sync_pulse = 4 ;
parameter vert_back_porch = 14 ;
parameter vert_active_pixels = 600 ;
parameter vert_front_porch = 1 ;
Собственно, теперь у нас есть абсолютно все необходимые знания. Осталось лишь самая малость — перевести эти знания в код на SystemVerilog:
parameter horiz_pixels = ( horiz_sync_pulse + horiz_back_porch +
horiz_active_pixels + horiz_front_porch ) ;
parameter horiz_vis_begin = ( horiz_sync_pulse + horiz_back_porch ) ;
parameter horiz_vis_end = ( horiz_pixels - horiz_front_porch ) ;
parameter vert_pixels = ( vert_sync_pulse + vert_back_porch +
vert_active_pixels + vert_front_porch ) ;
parameter vert_vis_begin = ( vert_sync_pulse + vert_back_porch ) ;
parameter vert_vis_end = ( vert_pixels - vert_front_porch ) ;
logic [ 11 : 0 ] hctr ; // 12 bits will be enough for logic [ 10 : 0 ] vctr ; // 10 bits will be enough for
always_ff @ ( hctr , vctr )
begin
if ( hctr >= horiz_vis_begin && hctr < horiz_vis_end &&
vctr >= vert_vis_begin && vctr < vert_vis_end )
begin
// vvv generated code begin, see gen.py vvv
// ^^^ generated code end, see gen.py ^^^
end
// currently no color will be displayed anyway
else
begin
r [ 0 : 2 ] g [ 0 : 2 ] b [ 0 : 1 ] end
end
Основной код довольно скучен, так как он просто выводит на разные участки экрана все доступные нам 256 цветов. Чтобы не писать его руками, был написан вот такой скрипт на Python:
def gen ( arg , begin , pixels , arr ) :
for i in range ( 0 , int ( 2 ** len ( arr ) ) ) :
if i > 0 :
print ( "else" ) ;
if i != int ( 2 ** len ( arr ) ) - 1 :
print ( "if(<> < (<>+ (<>/<>)*<>))" . format (
arg , begin , pixels , int ( 2 ** len ( arr ) ) , i+ 1 ) )
print ( "begin" )
for j in range ( 0 , len ( arr ) ) :
print ( ( " " * 4 ) + "<> ;" . format (
arr [ j ] , "1" if i & ( 1 print ( "end" )
gen ( "hctr" , "horiz_vis_begin" , "horiz_active_pixels" ,
[ "r[0]" , "r[1]" , "r[2]" , "g[0]" ] )
gen ( "vctr" , "vert_vis_begin" , "vert_active_pixels" ,
[ "g[1]" , "g[2]" , "b[0]" , "b[1]" ] )
А вот и получившаяся картинка:
К сожалению, встроенная в смартфон камера не очень хорошо передает цвета в условиях домашнего освещения. Но на глаз все цвета действительно выглядят разными.
Поддержка
© 1994-2021 The MathWorks, Inc.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
In the standard R820T driver one of the gain stages is locked to a pre-specified value and the the gain slider is a function of the other two gain values. Having full manual control over all three gain stages may help with optimizing signal SNR levels and reducing noise.
Modded Driver with Extra Gain Controls
Настройка PLL
Прежде всего стоит отметить, что цвета пикселей передаются с некоторой частотой, которая зависит от выбранного разрешения экрана и фреймов в секунду. Точные цифры можно посмотреть, к примеру, здесь и здесь. Я решил рисовать картинку 800 x 600, 56 фреймов в секунду («почти 60 FPS»). Для этого нужно, чтобы пиксели передавались с частотой 38.1 МГц. Но в плате iCEstick используется кварцевый резонатор всего лишь на 12 МГц. Проблемка.
К счастью, чипы серии ICE40 (как и многие другие FPGA и микроконтроллеры) имеют встроенное устройство под названием phase-locked loop или PLL. Это настраиваемое устройство, позволяющее получить из внешнего сигнала некой известной частоты сигнал какой-то другой частоты, больше или меньше частоты исходного. Параметры PLL называются DIVF, DIVQ и DIFR. Если REF — это частота входного сигнала, то частоту выходного можно определить по формуле:
Для быстрого подбора значений параметров в пакет IceStorm входит утилита icepll. Пример ее использования:
F_PLLIN: 12.000 MHz (given)
F_PLLOUT: 38.100 MHz (requested)
F_PLLOUT: 38.250 MHz (achieved)
FEEDBACK: SIMPLE
F_PFD: 12.000 MHz
F_VCO: 612.000 MHz
DIVR: 0 (4'b0000)
DIVF: 50 (7'b0110010)
DIVQ: 4 (3'b100)
FILTER_RANGE: 1 (3'b001)
Теперь достаточно указать эти параметры в нашем коде таким образом:
… и мы получаем сигнал clk с частотой 38.25 МГц, что достаточно близко к желаемой. Максимальная же частота, на которой могут работать FPGA серии ICE40, составляет 275 МГц. Стоит однако отметить, что на таких частотах начинает играть большую роль ограничение на скорость распространения сигнала (скорость света). Чтобы проверить, будет ли ваша конфигурация корректно работать на заданной частоте, можно воспользоваться утилитой icetime:
.
// Creating timing netlist..
// Timing estimate: 22.72 ns (44.02 MHz)
// Checking 26.14 ns (38.25 MHz) clock constraint: PASSED.
Post a comment Cancel reply
VGA-сигнал
Итак, мы все выяснили про частоту сигнала. Также мы выяснили, что цвета пикселей передаются аналогово в формате RGB. Но остается открытым вопрос о порядке передачи пикселей, а также о роли сигналов H-SYNC и V-SYNC.
Видео-сигнал передается построчно. Сначала последовательно слева направо передаются цвета всех пикселей первой строки, затем второй, и так далее. Но не все переданные пиксели отображаются на экране! Связано это с тем, что VGA активно использовался во времена кинескопических дисплеев. Особенность этих дисплеев заключалась в том, что после завершения рисования очередной строки электронный луч не мог моментально перейти к началу следующей строки. Поэтому в VGA заложены паузы в передаче сигнала, в течение которых электронный луч мог бы успеть переместиться.
Проще всего это объяснить на такой картинке:
Как по вертикали, так и по горизонтали, каждый фрейм окружен некоторым колличеством игнорируемых пикселей — так называемые заднее крыльцо (back porch) и переднее крыльцо (front porch). Плюс к этому дисплею передаются синхронизирующие сигналы, те самые H-SYNC и V-SYNC, говорящие о том, что началась следующая строка или следующий фрейм. Передавать пиксели вместе с сигналами, отвечающими за их синхронизацию, было бы весьма опрометчиво. Поэтому в передаче видео-сигнала возникают еще и паузы продолжительностью сигналов H-SYNC и V-SYNC.
Важно! Заметьте, что как H-SYNC, так и V-SYNC инвертированы, то есть низкое напряжение означает наличие сигнала, а высокое — его отсутствие.
Смотрите также
Gain — Мультипликативное усиление раньше масштабировало входную форму волны
1 (значение по умолчанию) | скаляр
Мультипликативное усиление раньше масштабировало входную форму волны в виде безразмерного скаляра.
Программируемое использование
Использование get_param(gcb,'Gain') просмотреть текущее значение Gain.
Использование set_param(gcb,'Gain',value) установить VGA Gain на определенное значение.
Типы данных: double
Mode — Включайте параметр Режима в модель IBIS-AMI
на (значении по умолчанию) | прочь
Выберите, чтобы включать Mode в качестве параметра в файл IBIS-AMI. Если вы отменяете выбор Mode, он удален из файлов AMI, эффективно жесткое кодирование Mode к его текущему значению.
Порты
Типы данных: double
Вывод
Mode — Включайте параметр Режима в модель IBIS-AMI
на (значении по умолчанию) | прочь
Выберите, чтобы включать Mode в качестве параметра в файл IBIS-AMI. Если вы отменяете выбор Mode, он удален из файлов AMI, эффективно жесткое кодирование Mode к его текущему значению.
Related posts:
What means “VGA” gain? When low, the spectrum is clear but the S/N bad, and vice versa.
Nevertheless with this driver it’s possible to improve the S/B by 5 dB and/or to reduce the unwanted signals in the spectrum (mainly thanks to the VGA gain). The LNA gain can be set near maximum.
Unfortunately this driver doesn’t work with the new RTL2832P key (for DVB-T2) while the old one still works. Each cursor “works” in that it normally acts onto the noise floor, but surprisingly, there is absolutely no useful signal.
I assume that “VGA” (“variable gain amplifier”?) refers to the amplifier at the output of the R820T tuner chip; see the R820T datasheet.
David, you have to play with the sliders until the signal suite your needs.
There is no default setting as everybody’s antenna gain is different.
Is there any information about how to set the three sliders properly?
Does anybody know if the New R820T Driver with LNA/Mixer/VGA Gain Settings work with the hdsdr software .
Смотрите также
Search
WaveOut — Масштабированный выходной сигнал
скаляр | вектор
Масштабированный выходной сигнал, возвращенный как скаляр или вектор, соответствующий входному сигналу.
Типы данных: double
Gain — Мультипликативное усиление раньше масштабировало входную форму волны
1 (значение по умолчанию) | скаляр
Мультипликативное усиление раньше масштабировало входную форму волны в виде безразмерного скаляра.
Программируемое использование
Использование get_param(gcb,'Gain') просмотреть текущее значение Gain.
Использование set_param(gcb,'Gain',value) установить VGA Gain на определенное значение.
Типы данных: double
Mode — Рабочий режим VGA
On (значение по умолчанию) | Off
Рабочий режим VGA:
Off — VGA исключен, и входная форма волны остается неизменной.
On — VGA масштабирует входную форму волны согласно заданному Gain .
Программируемое использование
Использование get_param(gcb,'Mode') просмотреть текущий VGA Mode.
Использование set_param(gcb,'Mode',value) установить VGA на определенный Mode.
Gain — Включайте параметр Усиления в модель IBIS-AMI
на (значении по умолчанию) | прочь
Выберите, чтобы включать Gain в качестве параметра в файл IBIS-AMI. Если вы отменяете выбор Gain, он удален из файлов AMI, эффективно жесткое кодирование Gain к его текущему значению.
Используем тюнер R820T2 от RTL-SDR в своих проектах
Примечание: Если вдруг вы пропустили вводную статью по Software Defined Radio, вот она — Начало работы с LimeSDR, Gqrx и GNU Radio.
Некоторые компоненты, используемых в модуле, не так-то просто достать. Тюнер R820T2 и генератор на 28.8 МГц проще всего выпаять из RTL-SDR v3. Устройство продается на eBay. Трансформаторы MABAES0060 (даташит [PDF]) были найдены на AliExpress. Прочие же компоненты доступны повсеместно. Плату для модуля я заказал на OSH Park. В итоге получилось следующее:
Спаять модуль оказалось достаточно просто. Процесс этот особо ничем не примечателен. Главное иметь хороший флюс, паяльную пасту, паяльную станцию с феном, лупу с хорошим увеличением, мультиметр, прямые руки и немного терпения.
Модуль питается от 5 В (на плате есть стабилизатор на 3.3 В), общение с ним происходит по протоколу I2C. Для проверки модуля сначала я взял осциллограф и проверил, что от генератора идет сигнал с частотой 28.8 МГц. Затем я использовал HydraBus чтобы убедиться, что модуль отвечает по I2C:
i2c1> scan
Device found at address 0x1a
i2c1> [ 0x34 0x00 ] [ 0x35 r:1 ]
I2C START
WRITE: 0x34 ACK 0x00 ACK
I2C STOP
I2C START
WRITE: 0x35 ACK
READ: 0x69 NACK
I2C STOP
Напомню, что 0 x 34 — это 7 бит адреса устройства и ноль в младшем бите, означающий запись. По аналогии 0 x 35 соответствует чтению с устройства. Согласно даташитам (основной даташит [PDF], описание регистров [PDF]), устройство имеет 32 регистра, каждый размером один байт. При этом в регистре с адресом 0 x 00 всегда хранится значение 0 x 96.
У устройства есть небольшая странность. При записи используется обычный порядок бит msb-first, однако при чтении данные возвращаются в lsb-first. Поэтому в HydraBus мы увидели 0 x 69 (01101001) вместо 0 x 96 (10010110). Есть и другая странность. Устройство позволяет писать данные по любому адресу, но чтение всегда происходит, начиная с адреса 0 x 00. Таким образом, если требуется прочитать данные из 15-го регистра, нужно прочитать 15 байт.
Манипулировать регистрами R820T2 напрямую — дело довольно нетривиальное, и с нуля научиться правильно их использовать займет далеко не один и не два вечера. К счастью, другие люди уже давно во всем разобрались. За основу я взял библиотеку для STM32 за авторством все того же Eric Brombaugh (он, в свою очередь, также опирался на чужие наработки — см исходники). Я портировал библиотеку на HAL, немного отрефакторил по своему вкусу, и в процессе починил баг в оригинале. Код библиотеки вы найдете в полной версии исходников к этому посту.
Интерфейс библиотеки следующий:
void R820T2_init ( void ) ;
int32_t R820T2_calibrate ( void ) ;
void R820T2_set_frequency ( uint32_t freq ) ;
void R820T2_set_bandwidth ( uint8_t bw ) ;
void R820T2_set_lna_gain ( uint8_t gain_index ) ;
void R820T2_set_mixer_gain ( uint8_t gain_index ) ;
void R820T2_set_vga_gain ( uint8_t gain_index ) ;
void R820T2_set_lna_agc ( uint8_t value ) ;
void R820T2_set_mixer_agc ( uint8_t value ) ;
Все довольно просто — инициализация разбита на две части, init и calibrate. Я хотел убедиться, что калибровка действительно необходима. Оказалось, что необходима, без нее вообще ничего не работает :) Дальше у нас ручки для выставления частоты и полосы пропускания, три ручки для управления gain’ом и две ручки для включения/выключения automatic gain control (по умолчанию оба выключены). Также есть процедуры для хождения напрямую в регистры, но вы скорее всего не должны этого хотеть.
Для удобства была написана прошивка, позволяющая использовать все это хозяйство по UART:
r820t2> help
help - show this message
scan - perform I2C scan
dump - read all registers
read - read given register value
(e.g `read 0A`)
write - write to register
(e.g. `write 0A E1`)
init - initialize R820T2
calibrate - calibrate R820T2
frequency - set frequency to
(e.g. `frequency 144000000`)
bandwidth - Set IF bandwidth 14
lna_gain - Set gain of LNA 3
vga_gain - Set gain of VGA 5
mixer_gain - Set gain Mixer 3
lna_agc - Enable/disable LNA AGC 1
mixer_agc - Enable/disable Mixer AGC 1
r820t2> dump
96 80 CA FF E0 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
r820t2> init
r820t2> calibrate
r820t2> frequency 432500000
r820t2> bandwidth 15
r820t2> lna_gain 12
r820t2> mixer_gain 12
r820t2> vga_gain 5
r820t2> dump
96 80 BC FF E7 9C 80 6C 80 40 B0 EF 45 63 75 F8
5C 83 80 00 1B 1C 87 30 48 CC 61 00 54 AE 0A C0
Как можно заметить, здесь значения регистров конвертируются в msb-first. Тюнер был настроен на частоту 432.5 МГц с широкой полосой пропускания (значение bandwidth задается от 0 до 15). Если воспользоваться подходящей антенной и подключить выход тюнера к осциллографу, можно увидеть радио-сигналы. Например, такие:
Узнали? Это же наш старый знакомый, пульт от гаража с OOK-модуляцией. Для полноты картины отмечу, что здесь модуль подключается к осциллографу без нагрузки. Нагрузку в 50 Ом R820T2 не тянет. Само собой разумеется, с тем же успехом можно ловить сигналы с другой несущей и другой модуляцией. Кажется, все работает!
Чисто теоретически, мы уже можем подключить модуль к входу для наушников компьютера, и назвать это SDR. Для этого нам понадобится буфер (например, операционный усилитель в режиме повторителя напряжения), а также фильтр нижних частот. Однако полоса пропускания такого решения составит не более 20 кГц, поскольку звуковая карта все-таки рассчитана на работу со звуком. К тому же, на входе для микрофона вполне могут резаться верхние частоты. В общем, курам на смех.
Полную версию исходников к посту вы найдете в этом репозитории на GitHub. А как бы вы предложили справится с потоком данных в 40 Mbps или выше?
Одно из традиционных развлечений с FPGA заключается в генерации видео-сигнала для VGA-мониторов. В этой заметке будет рассмотрено решение этой задачи на примере платы iCEstick и открытого стека разработки под нее в лице проекта IceStorm. Если у вас нет iCEstick, но есть другая плата на базе FPGA серии ICE40 от Lattice, например, TinyFPGA B2 или Nandland Go Board, они тоже подойдут и потребуют внесения минимальных изменений в коде проекта. Также сгодятся платы на базе других FPGA, однако они потребуют внесения более существенных изменений в код, особенно в части, касающейся PLL. Кроме того, потребуется установка соответствующего проприетарного ПО, например, Quartus для FPGA от Intel / Altera или Vivado для устройств производства Xilinx.
Recent Posts
Weekly Newsletter + Product Updates
Читайте также: