Текстовой редактор Atom

Часто случается, что программист пишет программу и то ли среда не предоставляет удобный редактор — как то бывает в случае с ModelSim при написании кода на Verilog и VHDL, то ли язык — язык гипертекстовой разметки (HTML, CSS). А может программиста прельщают функции редактора больше, нежели функции редактора в среде разработки. В любом текстовыми редакторами пользуются все.

Здесь я хочу рассказать об интересных плагинах в Atom, которые сильно упростили мою жизнь. Atom я использую параллельно с Notepad ++. Последний — старичок, который меня не подводил и функциям которого я очень сильно привык. Но у него есть один большой минус — нельзя открыть несколько окон Notepad++, а это важно когда ты работаешь с группой файлов разного назначения. Хочется чтобы разные проекты были в разных окнах.

Atom кроме того, что его можно запустить несколько раз и использовать разные окна, позволяет просматривать несколько документов в одном окне + просмотр файлов в директории в которой ты сейчас находишься + можно открывать в редакторе даже фотографии (Боооооже! 🙂 ).

Как это выглядит на деле:

screen-shot-2015-01-21-at-18-54-18
Работа в текстовом редакторе Atom

Функции редактора легко расширить плагинами. Устанавливаются и ищутся они через настройки редактора — Packages => Settings View => Install Packages / Themes. Ну, собственно там можно и тем понакачать.

Инструменты, на которые стоит обратить внимание это :

  1. highlight-selected 

    Подсветка выделяемых слов. Работает как с переменными в текстовом, так и в числовом виде. Также выделяет операторы, функции и прочее.

    select_many

  2. sublime-style-column-selection 

    Удобный инструмент для множественного выделения по вертикали. Такая же функция встроена в Notepad ++ и Visual Studio при нажатии Shift + Alt. В случае с Atom’ом работает при зажатии Alt и выделении левой кнопкой мыши (по умолчанию, можно поменять)

    select

  3. language-verilog

    Подсветка синтаксиса Verilog. Присутствует IntelliSense, который ускоряет написание кода. При нажатии Tab в некоторых случаях отслеживает параметры при вводе и добавляет вызов свойств. Удобный и интерактивный инструмент.

    main

  4. language-vhdl       

    Подсветка синтаксиса VHDL. Также как и с инструментом language-verilog позволяет интерактивно и быстро писать программы на VHDL. Есть большая недоработка, которую, хочется надеется, закроют — нет подсветки синтаксиса при использовании стандартных библиотек IEEE.

    main_vhdl

  5. minimap-highlight-selected

    Мини карта позволяет легко ориентироваться и перемещаться по большому файлу. Легко скрулить его. Но, собственно, и без этого плагина можно прожить… иногда он даже мешается

Космический спутник «Маяк». Частная космонавтика в России

Статья посвящена опыту участия в создании одного из модулей КА «Маяк», который создавался на протяжении полугода и в итоге, по организационным вопросам, наш модуль (бортовой компьютер + радио передатчик) не полетел… Чтобы работа большой команды не прошла бесследно — хочется отразить старания и результаты каждого из ее членов (на сколько это можно) в статье  🙂  .


О проекте

О «Маяке» можно подробнее прочитать тут, а красиво рассказывают о себе и собирают деньги на проект они тут. Главным руководителем и  идеологом проекта является Александр Шаенко. Интервью с ним по поводу проекта «Маяка» можно почитать на Geektime. Cам проект является студенческим, и его, якобы, реализуют студенты и энтузиасты.

До какого-то момента проект действительно поддерживался группой энтузиастов, которые свободное от работы время проводили с пользой для ума и российской космонавтики. Проект развивался неспешно, проводились промежуточные испытания. Но в ноябре-декабре 2015 года появилась информация о возможности запуска спутника уже в мае 2016 года. На тот момент у команды разработчиков был только пластиковый макет спутника, на котором не функционировала даже система раскрытия отражателя. Без этого функционально спутник представлял собой тот самый «кирпич», с которого началась идея создания и запуска спутника.

Идея проекта появилась почти случайно. Как-то после лекции Шаенко спросили, можно ли запустить в космос кирпич. «Кирпич? Можно, конечно. Только пользы от него никакой, его даже никто не увидит. Интереснее будет запустить что-то, что заметят с Земли», — ответил инженер. После нескольких дней размышлений и набросков были готовы первые чертежи.

openrussia.org

Понимая, что качественно и в срок сделать спутник до момента запуска не получается, Александру всё-таки пришлось сотрудничать с профессионалами. Проект является некоммерческим, поэтому средствами для оплаты труда инженеров команда не располагала. В отместку, они могли предложить возможность размещения другого оборудования на КА.

Нашей компании нужно было переделать их систему раскрытия отражателя. Также, в качестве отладки и проверки работы систем, которые были разработаны нами до этого — предлагалось дополнить систему «Маяка» нашим модулем. Именно о нем и пойдет повествование статье.

 


Предисловие

На момент участия в проекте я учился на последнем курсе университета и активно совмещал учебу с работой. Работал на тот момент в довольно перспективной (насколько может быть перспективна частная российская космонавтика) компании, поставившей себе в цель решение коммуникационных проблем на планете — покрытие малонаселенной и труднодоступной местности спутниковой телефонией и интернетом.

В компании была команда программистов, в которую я и входил и был, естественно, Junior’ом. Непосредственно моей сферой обязанностей было программирование FPGA, создание DSP модулей.


Команда

%d0%bc%d0%b5%d1%80%d0%ba%d1%83%d1%88%d0%b5%d0%b2

Федор Меркушев — система раскрытия паруса. Важной и, по-сути, главной технической частью проекта «Маяка» — был светоотражающий парус, который должен был раскрыться на низкой орбите и отражать солнечный свет. Именно с ней у «энтузиастов Космоса» возникли проблемы. Федор решил эту проблему, о чем и свидетельствуют выложенные ниже видео …

 

%d1%81%d0%b8%d0%b4%d0%be%d1%80%d0%be%d0%b2

Евгений Сидоров — наладка работы КРН (комплекс радионавигации). Процессорная часть обработки данных от GPS спутников. Работал в паре с Вячеславом Применко. Областью работы Славы была FPGA реализация детектирования сигнала от спутников, разбор пакетов и отправка данных для последующей обработки на процессор.

 

 

 

%d0%b2%d0%be%d1%80%d0%be%d0%b6%d1%86%d0%be%d0%b2Михаил Ворожцов — реализация компилятора для софт процессора ACME32/ACMA32 (написаны Алексеем Чернышовым). Работал в паре с Димой Прыгуновым и Мишей Балахно, т.к. именно компилятором собирались прошивки, написанные Мишей Б.

 

 

 

%d1%87%d0%b5%d1%80%d0%bd%d1%8b%d1%88%d0%b5%d0%b2Алексей Чернышов — разработка и отладка софт-процессора. Им была создана и, в паре с Михаилом Балахно, отлажена работа софт — процессора, написанного под ПЛИС от Microsemi.

 

 

 

 


Задача команды

Работа команды началась примерно в октябре — ноябре 2015 после объявления директора о том, что мы участвуем в проекте. Основными задачами команды были :

Команда «Маяк-ПО» :

  1. Дописать и отладить софт-процессор (к октябрю он был написан, но не был отлажен),
  2. В тестовом режиме запустить и отладить КРН — как часть обнаружения, так и часть обработки данных на софт-процессоре,
  3. Сбор телеметрии с платы — данные с датчиков: температуры, тока и напряжения,
  4. Запуск и наладка блока КТС (командно-телеметрической связи) для отправки телеметрии на Землю,
  5. Полная отладка функциональных звеньев и сдача всего модуля в сборе

Команда «Маяк-Железо» :

  1. Выбор и согласование элементной базы для платы ( элементная база — industrial, т.к. спутник — низкоорбитальный),
  2. Создание Э3 (схемы электрической принципиальной) и разводка ПП,
  3. Запуск и наладка,
  4. Отдельно — система раскрытия паруса и система отстыковки от ракетоносителя

Предполагалось что две упомянутые выше команды будут работать согласованно, т.к. конечным продуктом являлась «прошитая» плата.


Работа

TimeLapse недельного отчета по проделанной работе в команде «Маяк-ПО». Собственно, на этом видео присутствуют практически все, кроме Миши Ворожцова и Алексея Чернышева. Даже на первых минутах засветился директор 🙂

На видео ниже можно увидеть модуль, над которым работала команда «Маяк-ПО» и «Маяк-Железо». Собственно это «котлетка» из двух плат — на верхней должны были располагаться датчики (на видео сверху — отладочная плата), плата снизу была с FPGA, датчиками, ЦАП, АЦП, синтезаторами частот, МШУ и усилителями выходного тракта. На видео — первые этапы отладки : включение, первоначальная прошивка FPGA для проверки основных частей. Плата — Артем Малахов.

 Тестовыми прошивками — считывание данных с термодатчиков, ЦАП, АЦП, синтезатором частот, AHB шиной для FSM КРН и децимирующим фильтром — занимался я 🙂 . На видео — Отладка ЦАП и синтезатора частот (настроен на 2.2 ГГц).

Демонстрация успехов работы Федора Меркушева.


Трудности

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

Предполагалось сохранять и передавать на Землю следующие данные: уровень заряда аккумуляторов, скорость вращения КА, потребляемую мощность, показания температурных датчиков, координаты и скорость движения КА. Пакеты данных со штампами времени  от момента отстыковки должны были записываться во flash, затем передаться «вниз» в S диапазоне за один сеанс связи.

Единственным источником энергии спутника являются аккумуляторы, которые должны были по расчётам разрядиться в течение 2 суток. Учитывая это, а также мощность передатчика (несколько милливатт), спутник бы успешно разрядился и никому бы не помешал с точки зрения частотного диапазона.

В конечном счёте, за четыре месяца командой инженеров, было сделано всё не только для самой возможности запуска КА «Маяк», но и для того, чтобы эта миссия имела бОльший смысл и научный интерес. Ведь было бы установлено: с какой скоростью замедляется КА, с какой скоростью вращается после отделения, какие температурные воздействия испытывает.

В ходе выполнения работы пришлось отказаться от:

-приёмника на КА (изначально предполагалась полудуплексная связь),

-расчёта координат КА «на борту».  Вместо этого предлагалось собирать сырые данные с GPS спутников и отправлять их по КТС на Землю, где затем обрабатывать, и вычислять координаты (Low Energy GPS Positioning).

Основными трудностями с которыми, на мой взгляд, столкнулась наша команда ( «Маяк-ПО» ) была трудность отладки софт-процессора, так как из возможных инструментов был только Identify, который на небольшом промежутке времени потактово отображал работу софт-процессора. При этом невозможно было отследить работу процессора на большом промежутке времени.  Второй причиной стала отладка КРН в части FPGA. У Вячеслава целый месяц ушел на отладку коррелятора для поиска сигнала от спутников GPS. Организовать слежение за сигналом нескольких спутников оказалось сложнее, и решение задачи затянулось.

Также проблемы были с коммуникацией между двумя командами — Железа и ПО, с изготовлением антенны для КТС. В целом, на каждом участке workflow встречались некоторые «затыки».


О том, почему наш проект никуда не полетел

Как уже упоминалось выше — причиной стало изменение договоренностей между директором компании и руководителем проекта «Маяка». Собственно, на момент написания статьи до запуска спутника остается 58 дней — об этом гласит табличка на сайте проекта.

55days

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


Результаты работ

  1. Создана и полетит — система раскрытия паруса и система отстыковки,

  2. Создана и не полетит — отлаженная плата (имеется ввиду ее «железная часть», т.к. была проверена система работы датчиков тока и напряжения, температуры, ЦАПы и АЦП, синтезатор частот и выходной усилитель передающего тракта — имелась возможность на имеющемся оборудовании организовать сбор и передачу данных без использования софт-процессора),

  3. Создан, не до конца отлажен, не полетит — софт-процессор (хотя удачно заработал UART и FSM для КРН — последний отлаживался в симуляторе и не был отлажен в железе),

  4. Не доделан, не отлажен, не полетит — КРН (как вариант — предлагалось собирать сырые данные с GPS спутников и отправлять их по КТС на Землю, где затем обрабатывать),

  5. Не сделан — КТС (с ним повис вопрос, так как специалист, который должен был его делать, ушел из компании)


Итог

Исходя из всего написанного выше, было бы неправильно считать,  что проект КА «Маяк» является только студенческим или проектом энтузиастов.


Интересные факты

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

Из-за сжатых сроков разработки сотрудникам приходилось работать даже на больничном. Это было не обязательно, никто никого не заставлял. Общее воодушевление от причастности к такому интересному проекту, а также чувство ответственности перед другими сотрудниками затмевали личные планы.

FPGA UART Receiver — Приемник UART, реализованный на ПЛИС

Данная статья посвящена приемнику UART.  До этого две статьи были посвящены передатчику UART, и полной схеме, состоящей из приемника и передатчика[ F(clk) = 20 MHz, V(uart) = 115200 кБит/с ].

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

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


Как использовать модуль приемника

В модуле используются следующие порты:

clk — входной однобитный порт — подача тактового сигнала,
rx — входной однобитный вход — входные данные последовательного интерфейса,
data_o — выходные данные (8 бит),
data_rdy — выходной порт — сигнализирует о готовности и валидности данных,
have_prblm — выходной порт — сигнализирует что в блоке были найдены некоторые ошибки и возможны неточности


Код приемника … Verilog код

Здесь  сountOfStrobe — параметр, меняя который может регулировать информационную скорость нашего UART’а. В данном случае UART настроен на скорость 115200 кБит/с при тактовой частоте clk = 20 МГц.

сountOfStrobe = Fclk(Гц)/Vuart(бит/c) = 20*10^6 / 115200 = 173;

[php]
module uart_param_receiver #(
parameter countOfStrobe = 173, // Параметр, который высчитывается из соотношения Fclk[Гц] / V[бит/c]
// соответствует тому, сколько тактов приходится на прием одного
// бита данных при выбраной скорости UART(бит/с) и тактовой частоте CLK (Гц)
parameter firstCheckStrobe = 99, // Первый check bit
parameter secondCheckStrobe = 120, // Второй check bit
parameter thirdCheckStrobe = 150 // Третий check bit
)(
input clk, // Тактовая частота [20 МГц]
input rx, // Входные данные
output reg [7:0] data_o, // Выходные данные
output reg data_rdy = 0, // Строб, сигнализирующий что на шине data_o валидные данные и их можно "забирать"
output reg have_prblm = 0 // Строб, сигнализирующий о проблемах в определении входного бита. Если он == 0 -> все ок, иначе -> проблемы
);

reg [1:0] state = 2’b00; // Регистр статуса
reg [8:0] shift; // Сдвиговый регистр. В него побитово кладутся данные, приходящие с rx
reg [10:0] cntStrobe = 0; // Счетчик countOfStrobe
reg [2:0] checker; // Регистр проверки -> На один информационный бит приходится countOfStrobe тактов. Имеет смысл "разделить"
// данный бит и записать данные в регистр checker
reg [4:0] cntData = 0; // Счетчик данных [счетчик битов]

always @(posedge clk)
begin
case (state)
2’b00 : begin
if (rx == 0)
begin
state <= 2’b01;
data_rdy <= 0;
end
end
2’b01 : begin
if (cntStrobe < countOfStrobe)
begin
cntStrobe <= cntStrobe + 1;
if (cntStrobe == firstCheckStrobe | cntStrobe == secondCheckStrobe | cntStrobe == thirdCheckStrobe)
begin
checker[0] <= rx;
checker[2:1] <= checker[1:0];
end
end
else
begin
if (cntData < 9)
begin
// Проверяем все ли у нас хорошо
if (checker[0] != checker[1] | checker[0] != checker[2])
have_prblm <= 1;
else
have_prblm <= 0;
// Запись бита в регистр
shift[8] <= checker[1];
shift[7:0] <= shift[8:1];
cntData <= cntData + 1;
cntStrobe <= 0;
end
else
begin
have_prblm <= 0;
data_o <= shift[8:1];
cntData <= 0;
cntStrobe <= 0;
state <= 2’b10;
end
end
end
2’b10 : begin
data_rdy <= 1;
state <= 2’b00;
end

endcase
end

endmodule
[/php]


Testbench. Симуляция работы приемника

В тестбенче подадим на входы нашего блока управляющие сигналы. Для этого воспользуемся блоком UART передатчика — о нем можно прочитать в предыдущей статье -> вот здесь

При этом передатчик заведем на частоте 100 МГц, а наш приемник на 20 МГц, т.к. такой вариант событий наиболее вероятен — это два независимых устройство со своей тактовой частотой.

Код тестбенча :

[php]

`timescale 1ns / 100ps;
module receiver_tb();

parameter fr = 50;
reg clk = 0;

always
begin
#(fr/2) clk = 1;
#(fr/2) clk = 0;
end

// Абсолютно другой клок, чтобы отвязаться от клока проекта
// Имеется ввиду, что наш проект частота, на которой работает UART приемник — 20 МГц,
// А частота передатчика — то есть нашего testbench’a = 100 МГц

parameter frTR = 10;
reg sclk = 0;

always
begin
#(frTR/2) sclk = 1;
#(frTR/2) sclk = 0;
end

reg [7:0] data_shift = 8’b1100_0011;
reg [7:0] data;
reg data_rdy = 0;
wire tx_rx;
wire areTransRdy;
reg [2:0] state = 2’b00;

always @(posedge sclk)
begin
case (state)
2’b00 : if (areTransRdy)
begin
state <= 2’b01;
data_rdy <= 1;
data <= data_shift;
end
2’b01 : begin
data_rdy <= 0;
state <= 2’b00;
data_shift <= data_shift + 1;
end
endcase
end

uart_param_receiver receiver(
.clk(clk),
.rx(tx_rx),
.data_o(),
.data_rdy(),
.have_prblm()
);
uart_param_trans transmitter(
.clk(sclk),
.data(data),
.data_rdy(data_rdy),
.tx(tx_rx),
.transm_rdy(areTransRdy)
);

endmodule;

[/php]

Код передатчика UART, настроенного на частоту 100 МГц и скорость 115200 КБит/с.

[php]
module uart_param_trans #(
parameter countOfStrobe = 868 // Параметр, который высчитывается из соотношения Fclk[Гц] / V[бит/c]
// соответствует тому, сколько тактов приходится на передачу одного
// бита данных при выбраной скорости UART(бит/с) и тактовой частоте CLK (Гц)
)(
input clk, // Тактовая частота [20 МГц]
input [7:0] data, // Данные, которые собираемся передать по TX
input data_rdy, // Строб, который соответствует тому, что данные валидные и их нужно передать
output reg tx = 1, // Выходной порт, передает данные по последовательному интерфейсу
output reg transm_rdy = 1 // Строб, который сигнализирует о том, что данные переданы и блок готов к передаче новых данных
);

reg [1:0] state = 2’b00; // Регистр, который будет менять значение в зависимости от состояния нашего модуля
reg [10:0] cntStrobe = 0; // Регистр — счетчик, который будет накапливаться до необходимого числа стробов (до countOfStrobe)
reg [4:0] cntBit = 0; // Регистр — счетчик, указываюший на номер передаваемого бита из data
reg [7:0] shiftData; // Сдвиговый регистр, в который мы записываем входные данные (data), а затем последовательно, побитово
// передаем по TX

always @(posedge clk)
begin
case(state)
2’b00 : begin
if (data_rdy)
begin
state <= 2’b01;
shiftData <= data;
transm_rdy <= 0;
tx <= 0;
end
end
2’b01 : begin
if (cntBit == 0)
begin
if (cntStrobe < countOfStrobe)
cntStrobe <= cntStrobe + 1;
else
begin
cntStrobe <= 0;
cntBit <= 1;
tx <= shiftData[0];
shiftData[6:0] <= shiftData[7:1]; end end if (cntBit > 0 && cntBit < 9)
begin
if (cntStrobe < countOfStrobe)
cntStrobe <= cntStrobe + 1;
else
begin
cntStrobe <= 0;
cntBit <= cntBit + 1;
tx <= shiftData[0];
shiftData[6:0] <= shiftData[7:1];
end
end
if (cntBit == 9)
begin
if (cntStrobe < countOfStrobe)
begin
cntStrobe <= cntStrobe + 1;
tx <= 1;
end
else
begin
cntStrobe <= 0;
cntBit <= 0;
transm_rdy <= 1;
state <= 2’b00;
end
end
end

endcase
end
endmodule
[/php]


Результаты моделирования в ModelSim

Ниже представлен результат моделирования (кликнув на картинку вы сможете просмотреть ее в полном масштабе — она откроется в новой вкладке).

modelsim

Как видно из результатов данные data_o (выход приемника) и data (вход передатчика) совпадают…

Это свидетельствует о правильной работе блока как передатчика, так и приемника.


Возможные ошибки

  1. При увеличении параметра countOfStrobe необходимо увеличивать разрядность cntStrobe
  2. При изменении countOfStrobe необходимо также менять firstCheckStrobe, secondCheckStrobe и thirdCheckStrobe

Вопросыыыыы??? 

cropped-img_1479-1024x683
Ну че, типа это … пиши если что 🙂

 

FPGA UART Transmitter — Передатчик UART, реализованный на ПЛИС

В данной статье речь пойдет о передатчике UART, и она немного перекликается с предыдущей статьей [в ней Вы можете ознакомиться с теоретической частью работы UART и посмотреть код для приемопередатчика с тактовой частотой 20 Мгц и инф. скоростью 115200 кБит/с], за тем исключением, что здесь мы рассмотрим один из модулей Асинхронного Универсального Приемопередатчика (UART) — а именно передатчик.

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


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

В модуле используются следующие порты:

clk — входной однобитный порт. По данному порту подаются тактовые импульсы, по которым тактируется весь наш блок

data — входной 8-битный порт. На этом параллельном порту мы получаем данные, которые будем передавать по последовательному порту tx

data_rdy — входной однобитный порт. Лог. единица на данном порту сигнализирует о том, что данные (data) валидны и их необходимо передать по tx

tx — выходной однобитный порт. По нему мы передаем последовательный поток данных

transm_rdy — выходной однобитный порт. Данный порт сигнализирует остальным блокам о своем состоянии. Если на нем лог. 1, то блок — готов к передаче данных и ждет на вход data и data_rdy для передачи данных, если лог. 0 — то блок находится в процессе работы (занят)


Код передатчика — Verilog код

Здесь  сountOfStrobe — параметр, меняя который может регулировать информационную скорость нашего UART’а. В данном случае UART настроен на скорость 115200 кБит/с при тактовой частоте clk = 20 МГц.

сountOfStrobe = Fclk(Гц)/Vuart(бит/c) = 20*10^6 / 115200 = 173;

[php]
module uart_param_trans #(
                            parameter countOfStrobe = 173    // Параметр, который высчитывается из соотношения Fclk[Гц] / V[бит/c]
                                                            // соответствует тому, сколько тактов приходится на передачу одного
                                                            // бита данных при выбраной скорости UART(бит/с) и тактовой частоте CLK (Гц)
                            )(
                            input clk,                       // Тактовая частота
                            input [7:0] data,              // Данные, которые собираемся передать по TX
                            input data_rdy,                // Строб, который соответствует тому, что данные валидные и их нужно передать
                            output reg tx = 1,          // Выходной порт, передает данные по последовательному интерфейсу
                            output reg transm_rdy = 1   // Строб, который сигнализирует о том, что данные переданы и блок готов к передаче новых данных
                            );
    
    reg [1:0] state = 2’b00;     // Регистр, который будет менять значение в зависимости от состояния нашего модуля
    reg [7:0] cntStrobe = 0;     // Регистр — счетчик, который будет накапливаться до необходимого числа стробов (до countOfStrobe)
    reg [4:0] cntBit = 0;         // Регистр — счетчик, указываюший на номер передаваемого бита из data
    reg [7:0] shiftData;         // Сдвиговый регистр, в который мы записываем входные данные (data), а затем последовательно, побитово
                                // передаем по TX
    
    always @(posedge clk)
    begin
        case(state)
            2’b00 :    begin
                        if (data_rdy)
                        begin
                            state <= 2’b01;
                            shiftData <= data;
                            transm_rdy <= 0;         
                            tx <= 0;
                        end
                    end
            2’b01 :    begin
                        if (cntBit == 0)
                        begin
                            if (cntStrobe < countOfStrobe)
                                cntStrobe <= cntStrobe + 1;
                            else
                            begin
                                cntStrobe <= 0;
                                cntBit <= 1;
                                tx <= shiftData[0];
                                shiftData[6:0] <= shiftData[7:1];
                            end
                        end
                        if (cntBit > 0 && cntBit < 9)
                        begin
                            if (cntStrobe < countOfStrobe)
                                cntStrobe <= cntStrobe + 1;
                            else
                            begin
                                cntStrobe <= 0;
                                cntBit <= cntBit + 1;
                                tx <= shiftData[0];
                                shiftData[6:0] <= shiftData[7:1];
                            end
                        end
                        if (cntBit == 9)
                        begin
                            if (cntStrobe < countOfStrobe)
                            begin
                                cntStrobe <= cntStrobe + 1;                             
                                tx <= 1;
                            end
                            else
                            begin
                                cntStrobe <= 0;
                                cntBit <= 0;
                                transm_rdy <= 1;
                                state <= 2’b00;
                            end
                        end
                    end
            
        endcase
    end
endmodule
[/php]


Testbench проекта … Симуляция работы модуля в ModelSim

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

В нашем случае testbench подаст на наш блок — тактовый сигнал clk, данные data и строб data_rdy, при этом он будет следить за стробом transm_rdy и когда тот будет переходить в лог.1 (т.е. передатчик будет готов передавать новые данные по tx) testbench будет инкрементировать данные  (увеличивать значение на 1) и переводить data_rdy в лог. 1.

[php]
`timescale 1ns / 100 ps;
    module uart_param_tb();
    parameter fr = 50; // 20 MHz
    
    reg clk = 0;
    reg [7:0] data = 8’b0111_1110;
    reg data_rdy = 0;
    reg [1:0] state = 2’b00;
    
    wire tx, transm_rdy;
    
    always
    begin
        #(fr/2) clk = 1;
        #(fr/2) clk = 0;
    end
    
    always @(posedge clk)
    begin
    
    case (state)
        2’b00 :    begin
                    if (transm_rdy)
                    begin
                        state <= 2’b01;
                        data <= data + 1;
                    end
                end
        2’b01 : begin
                    data_rdy <= 1;
                    state <= 2’b10;
                end
        2’b10 : begin
                    data_rdy <= 0;
                    state <= 2’b00;
                end
    endcase
    end
    
    
    uart_param_trans tb(
                    .clk(clk),                       
                    .data(data),              
                    .data_rdy(data_rdy),                
                    .tx(tx),          
                    .transm_rdy(transm_rdy)   
                    );
    
endmodule
[/php]


Результаты моделирования в ModelSim

Ниже представлены рисунки симуляции при скорости UART 115200 и 230400 Кбит/c. Причем для изменения скорости, как говорилось выше, был поменян только один параметр.

87

Работа модуля на скорости 230400 Кбит/с

173

Работа модуля на скорости 115200 Кбит/с

Из рисунков видно, что передатчик работает правильно.


Файлы для скачивания

Вы можете скачать файлы ( uart_trans ). В архиве прикреплен файл script.do, в котором указаны все параметры для запуска симуляции в ModelSim. Для его запуска необходимо разархивировать архив, в ModelSim с помощью команды

[php]

cd вашаДиректорияГдеЛежатФайлы (Например C:/Users/Me/Decktop/thisPrj/)

do script.do

[/php]

Если есть вопросы, замечания, предложения — пиши в комментариях

Работа FPGA с SPI периферией

В данной статье рассмотрен вопрос работы ПЛИС с периферийными устройствами, например с 8-канальным 12-битным АЦП ADC128S102 ( datasheet ). Использование этого устройства в любых проектах обусловленно простотой ( АЦП опрашивается по SPI интерфейсу и по нему же АЦП выдает данные с каждого из каналов) и малыми затратами программистов на работу с данным устройством.

В чем же заключается простота работы с SPI переферией?

Дело в том, что достаточно просто подать клок (тактовую частоту), изменить чипселект (CS), тем самым дать переферийному устройству понять, что с ним сейчас работают и подать данные.

На примере нашего ADC128S102 процесс работы происходит следующим образом…

adc128s102-time

В самом начале ПЛИС выставляет выходную ножку чипселекта (CS) в логическую 1, клок (SCLK) не подается [на самом деле не имеет значения — подается тактовая частота или нет — АЦП не реагирует на нее, т.к. CS свидетельствует о том, что с устройством сейчас не работают], данные по DOUT  не идут.

В нашей программе идет циклический опрос каналов АЦП с записью данных в память и последующей отправкой полученных данных по UART на ПК [об этом — в следующей статье].

[php]
module adc(
            input fab_clk_8MHz,      // Тактовая частота 8 МГц
            output reg SENSE_CS = 1, // Два ЦАП
            input SENSE_DIN,          // Данные, приходящие с АЦП
            output reg SENSE_DOUT,      // Данные с ПЛИС на АЦП (выбор канала)
            output sclk              // Тактовая частота для управления АЦП
            );

assign sclk = fab_clk_8MHz;

// Переменные
reg [1:0] state = 2’b00;
reg [7:0] data_2adc [8:0];
reg [3:0] cnt_frame= 0;
reg [9:0] cnt = 0;
reg [11:0] data_from_adc [8:0];
reg [11:0] data_adc_save [8:0];

// Начальная инициализация данных для отправки данных на АЦП (по документации — важны лишь
// 6,5,4 биты.
initial
begin
    data_2adc[0] = 8’b00_000_000; // none
    data_2adc[1] = 8’b11_000_111; // IN0
    data_2adc[2] = 8’b11_001_111; // IN1
    data_2adc[3] = 8’b11_010_111; // IN2
    data_2adc[4] = 8’b11_011_111; // IN3
    data_2adc[5] = 8’b11_100_111; // IN4
    data_2adc[6] = 8’b11_101_111; // IN5
    data_2adc[7] = 8’b11_110_111; // IN6
    data_2adc[8] = 8’b11_111_111; // IN7
end

always @ (negedge fab_clk_8MHz)
  begin
   case (state)
    2’b00 : begin
                state <= 2’b01;
                cnt_frame <= 0;
            end
    2’b01 : begin
             if (cnt_frame < 8)
                begin
                  cnt_frame <= cnt_frame + 1;
                  state <= 2’b10;
                  cnt <= 0;
                end
             else
                state <= 2’b00;
            end
     2’b10 : begin
            if (cnt <=50)
            begin
                cnt <= cnt + 1;
             if (cnt <= 15 )
                    SENSE_CS <= 0;
             if (cnt >15 && cnt <= 50)
                    SENSE_CS <= 1;
             end
             else
                 begin
                    state <= 2’b01;
                    cnt <= 0;
                  end
              end
     endcase
  end

// Отправка данных на АЦП
always @ (negedge fab_clk_8MHz)
begin
     if (cnt > 0 && cnt <= 7)
            SENSE_DOUT <= data_2adc[cnt_frame][7-cnt];
end

// Чтение и запись данных с АЦП
always @ (posedge fab_clk_8MHz)
begin
    if (cnt >= 5 && cnt <= 16)
            data_from_adc [cnt_frame][16-cnt] <= SENSE_DIN;
else
    begin
        if (cnt == 18)
                data_adc_save[cnt_frame] <= data_from_adc[cnt_frame];
    end
end            
endmodule
[/php]

Промоделировав код в ModelSim получим результат:
1_%d0%ba%d0%b0%d0%bd%d0%b0%d0%bb
Как видно из рисунка данные SENSE_DOUT отправляются согласно datasheet’у… На данном фрагменте
ПЛИС запрашивает данные канала IN0 (первый канал)…
В более развернутом масштабе получим следующую картинку:
%d0%b2%d1%81%d0%b5_%d0%ba%d0%b0%d0%bd%d0%b0%d0%bb%d1%8b
Между опросами я ввел некоторую задержку, ее можно отрегулировать в коде, меняя cnt (сейчас оно равно 50)
Файл с кодом можно скачать(.rar) -> adc

Стикеры Telegram (Part 3)

Существует большое множество стикеров для мэсэнджера Telegram. Данная статья является некоторым дайджестом по самым, на мой взгляд, интересным и популярным стикерам.

Для того, чтобы скачать себе стикеры необходимо лишь кликнуть на ссылку вида @Название_Стикера под картинкой, либо на саму картинку с понравившимися стикерами

8

Стикеры «Бесконечное Лето» @EverlastingSummerGirls

Boyarsk

Стикеры с Михаилом Боярским («Тысяча чертей!», «Каналья» и пр. ) — @kanalja

carrey

Стикеры с Джимом Керри — @Jim_Carrey_ByOsmer

Chelsea

Стикеры с ФК «Челси» — @TheBlues

Dota

Стикеры с героями «Доты 2» — @lindasdota2

gr_2

Стикеры с Гриффинами — @Family_Guy

Gravity_fals

Стикеры Гравити Фолз — @see_you_next_summer

Griffins

Стикеры с Гриффинами (продожение) — @Griffin2

Nazarbaev

Стикеры с президентом Казахтана — Нурсултаном Назарбаевым @Elbasy

Pigs

Стикеры со свинками Винки — @pet_pigs_vinki

snappy

Стикеры со Снаппи из ВК — @snappy_vk

zaika

Стикеры с зайкой Банни из ВК — @Banny_By_Osmer

Больше стикеров —>

Стикеры для Telegram ( part 2)

Существует большое множество стикеров для мэсэнджера Telegram. Данная статья является некоторым дайджестом по самым, на мой взгляд, интересным и популярным стикерам.

Для того, чтобы скачать себе стикеры необходимо лишь кликнуть на ссылку вида @Название_Стикера под картинкой, либо на саму картинку с понравившимися стикерами

Аркти

@Arkti — котенок Аркти

Зеленый слоник

@Green_Elephant — стикеры из к.ф. «Зеленый слоник»

Карина

@Karina_Sharishaxd — стикеры со стримершей Кариной

Маликов

@Malikov — Стикеры «Ничего», «Тяжеловато» и сам Маликов 

 

Медведев

@Medvedev — стикеры с председателем правительства РФ Дмитрием Медведевым

Обнимашки

@Obnimashki — стикеры Обнимашки с приведением и снеговиком

 

Оксимирон

 

@OxxxyRound — стикеры с репером Оксимироном и его рэп-батлом 

Расти

@RustCohle — стикеры с Расти Коулом из «Настоящего детектива»

Шайла

@SHIA_LABEOUF — стикеры с Шайа Лабаф

Больше стикеров —->

Тропосферные и ионосферные задержки

В виду того, что группировки спутников располагаются на высотах выше 400 км возможны задержки на пути распространения КА (космический аппарат) — АТ (абонентский терминал) и АТ (абонентский терминал) — КА (космический аппарат), вносимые средой распространения. Средой распространения на данной высоте является тропо – и ионо- сферы Земли. Именно они могут ввести задержки и изменить угол распространения сигнала.

На высотах до 100 км находится атмосфера. Она имеет такой же состав как и у поверхности Земли и состоит из молекулярного азота, молекулярного кислорода и других примесей.

Коэффициент преломления  радиоволн в тропосфере и ионосфере мало отличается от единицы, и для упрощения и удобства лучше использовать приведенный коэффициент преломления N:

5

В тропосфере Земли N зависит от температуры, давления и влажности. Необходимо обратить внимание, что N не зависит от частоты для длин волн более 1 см. Для миллиметровых волн существенно сказываются потери, которые можно учесть путем введения комплексной диэлектрической проницаемости.  В тропосфере давление и влажность изменяются по экспоненциальному закону, поэтому высотный профиль приведенного коэффициента преломления можно аппроксимировать экспонентой:

1

N0 – меняется в пределах ,  – в пределах . Приведенный коэффициент преломления на высоте 9 км всегда равен N =  в любое время года на всем земном шаре.

Зависимость коэффициента преломления радиоволн от частоты и высоты в ионосфере:

2

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

3

,где — электронная концентрация в главном ионосферном максимуме, — высота главного максимума электронной концентрации, — параметр, характеризующий скорость убывания электронной концентрации при увеличении высоты. GRAM – Global Reference atmospheric model (GRAM-99) – инженерная модель атмосферы Земли. US76 – U.S. Standard Atmosphere.

4

Рисунок 1 – Путь прохождения сигнала от абонентского терминала до космического аппарата

6

Рисунок 2 – Зависимости давления, температуры и коэффициента преломления от высоты в километрах

 η- угол направления на спутник от зенита, β – относительная широта размещения абонента.

Данные, представленные на рисунке 2 приведены для 21 марта 1980 года в 12:00, на 28° северной широты, 80° западной долготы.

Как видно на рисунке 2 и на рисунке 3 температура убывает с увеличением высоты, т.к.в этой области нагревание воздуха происходит за счет нагретой солнцем земли. Прекращением падения температуры характеризуется верхняя граница тропосферы, которая находится на высоте 10-15 км от уровня моря. Вплоть до высоты порядка 25 км температура остается постоянной (около 220К  или -53°С). Затем температура вновь повышается, т.к. на высоте 50-60 км присутствует озон, который интенсивно поглощает ультрафиолетовое излучение Солнца. На высоте порядка 500-600 км температура составляет 2000 – 3000 К (из-за излучения Солнца).

7

Рисунок 3 – Зависимость плотности частиц, давления, скорости звука и температуры от высоты в атмосфере

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

Слой D появляется только в дневное время, а ночью ионизация на этих высотах почти полностью исчезает. Критическая частота слоя – 0.1 – 0.7 МГц.

Слой Е – является первым слоем, обнаруженным радиозондированием. Высота слоя мало меняется в зависимости от времени суток и времени года. Критическая частота меняется от 3-4МГц днем до 0.6 МГц ночью. Полутолщина слоя – 15-20 км. Основным ионизирующим фактором является ультрафиолетовое излучение Солнца.

            Слой F – электронная плотность изменяется синхронно с высотой Солнца и максимум ионизации наблюдается ровно в полдень. В летние месяцы в дневные часы слой F расщепляется в два слоя. Критическая частота слоя F2 составляет 6 – 8.5 МГц, а критическая частота слоя F1 – 4 -6 МГц.

8

Рисунок 4 – Зависимость электронной плотности и группового коэффициента преломления от высоты в ионосфере

Причины высокой точности ГНСС GPS:

Ввиду задержек в ионосфере и тропосфере на диапазонах частот L1 и L2 ошибка расчета координат может составлять порядка 100-200 метров. Поэтому система учитывает данные задержки используя модели ионо- и тропо – сфер Земли. Причем коэффициенты данных моделей содержатся в  составе навигационного сообщения.

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

  1. Биквадратная модель Хопфилда,
  2. Модифицированная модель Хопфилда,
  3. Модель Саастамойнена.

Для ионосферных задержек используется модель:

  1. Глобальная модель ионосферы Клобушара.
  2. Глобальные карты ТЕС
  3. Двухчастотный метод коррекции при использовании диапазонов L1 и L2

Список используемых источников:

  1. Грудинская Г.П. Распространение радиоволн
  2. Rachel Neville Thessin. Atmospheric Signal Delay Affecting GPS Measurements Made by Space Vehicles During Launch, Orbit and Reentry.Massachusetts Institute of Technology. June 2015
  1. О.И. Яковлев, В.П. Якубов, В.П. Урядов, А.Г. Павельев. Распространение радиоволн. М.: Ленанд, 2009
  2. Д.Г. Дымнов Разработка аппаратурных методов учета влияния тропосферы при спутниковых измерениях в геодезии, Московский государственный университет геодезии и картографии (МИИГАиК), Москва 2009.

Технологии связи LTE. OFDM — сигналы. Снижение пик-фактора (PAPR) OFDM — сигналов. Часть 2.

PAPR – Peak-to-average power ratio.

Большое значение пик-фактора в OFDM-сигналах (отношение пиковой мощности к его средней мощности), является проблемой так как требует производства выходного усилителя мощности с достаточной большим динамическим диапазоном усиления, что приводит к снижению КПД передатчика. В свою очередь снижение КПД в конечном итоге ведет к уменьшению числа абонентов, использующих спутниковую связь.  Также большой PAPR потребует большей разрядности ЦАП и АЦП.

Существуют различные методы уменьшения пик-фактора OFDM сигнала. Методы, основанные на блочном кодировании (коды, построенные на основе последовательностей Голея, кодов Рида-Мюллера, методы добавления поднесущих), методы, основанные на амплитудном ограничении сигналов (клиппирование, компандирование, фильтрация). Многие из рассмотренных методов потребуют реализации сложных итерационных алгоритмов и осуществления когерентного приема, что значительно усложнит работы [2].

Для выбора оптимального метода путем моделирования использовался пакет прикладных программ Matlab.

Для получения разных значений OFDM сигналов на каждой итерации (моделирование максимально приближено к реальности ситуации, когда необходимо генерировать абсолютно разные данные абонентам) использовали randomize.   Для того, чтобы наиболее точно промоделировать систему использовали следующую логику. Так как на каждую из несущих может приходиться разное количество абонентов, то соответственно разным несущим требуется разное количество информации. Соответственно, генерируя спектр сигнала следует генерировать шум, который описывает разный уровень информации в поднесущих. Моделируемый спектр сигнала представлен на рисунке 1.

1

Рисунок 1 — Пример моделируемого спектра с 480 поднесущими и блоком обработки БПФ на 1024 точки

         Сгенерировав по количеству используемых поднесущих (всего их 480) спектр сигнала, перейдем во временную область, используя ОБПФ.

Затем, уже во временной области для нахождения PAPR воспользуемся формулой 1:

2

,где  3— квадрат максимальной амплитуды,  4— квадрат среднего значения амплитуды сигнала.

Распределение PAPR исходного сигнала для выборки в 105 значений представлено на рисунке 2.

5

Рисунок 2 — Гистограмма распределения пик-фактора исходного сигнала

Среднее значение пик-фактора составляет 8.63 дБ.

2. Используемые методы снижения PAPR
2.1 Ограничение ( clipping ) сигнала по уровню.
Данный метод плох тем, что при ограничении сигнала возможно внутриполосное и внеполосное излучение (шум) [3].  Под шумом понимается обрезанный по порогу сигнал. В дальнейшем рассмотрении мы будем называть его «шум ошибки» или «шум клиппирования».

Уровень шума ошибки вычисляется по формуле:

6

, где  7– ограниченный по порогу сигнал,  8— исходный сигнал. Оператор * — комплексное сопряжение, mean – среднее значение.

На рисунке 3 представлен исходный OFDM – сигнал с 480 поднесущими.

9

Рисунок 3 – Исходный (8) OFDM-сигнал во временной области

На рисунке 4 представлен сигнал, клиппированный по порогу.

10

Рисунок 4 – Обрезанный ( 7)сигнал («шум ошибка»)

На рисунке 5 изображен сигнал после ограничения исходного сигнала по порогу.

11

Рисунок 5 – Ограниченный  сигнал

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

         Зависимости шума ошибки от пик-фактора для двух этих методов представлены на рисунке 6. Выборка для построения этих зависимостей составляет 100 значений к каждому из 15 пороговых коэффициентов.   Пороговый коэффициент – значение, которое характеризует уровень ограничения максимального сигнала. Пределы его изменения – [0.43:6.35] дБ.

12

Рисунок 6 — График зависимостей шума от пик-фактора для метода обычного клиппирования и клиппирования оконной функцией Чебышева

На рисунке 7 представлены спектры сигналов после обычного клиппирования и клиппирования оконной функцией.

13

Рисунок 7 — Спектры двух клиппированных сигналов

Из рисунков видно, что внеполосные излучения при использовании ОФЧ (оконной функции Чебышева) ниже, но при одном и том же значении пик-фактора мы получаем большее значение шума, т. к. мы вырезаем не одно значение, а несколько (в нашем случае — 13). АЧХ ОФЧ на 13 точек представлена на рисунке 8. На графике приводится также АЧХ белого шума, подающийся на вход фильтра.

14

Рисунок 8 — Амплитудно-частотная характеристика оконной функции Чебышева

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

Для того, чтобы понять до какого уровня можно снизить пик-фактор OFDM – сигнала и не исказить форму ДН цифрового нужно провести моделирование системы.

В данной статье мы не будем рассматривать данную проблему, так как объем материала потребует отдельной статьи. Если реально интересна проблема — пишите мне на электронную почту или в комментариях к статье.

2.2 SLM, PTS- методы

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

Различие SLM от PTS метода заключается в том, что в SLM методе подбирается фаза с наименьшим возможным PAPR для всего сигнала. В PTS методе подбирается фаза для куска сигнала. При PTS методе весь сигнал во временной зоне разбивается на определенные куски (4, 8, 16, 32, …) и уже к ним подбирается оптимальная фаза.

При моделировании снижения PAPR’а методом SLM наблюдается уменьшение пик-фактора на 1.42 дБ.

При моделировании методом PTS —  для 8 блоков снижение пик –фактора – 1.33 дБ. При этом среднее значение составило 7.44 дБ. В таблице 3 приведены значения изменения исследуемого параметра при различных количествах блоков разбиения.

Кол-во блоков, шт 4 8 16 32
∆PAPR 1.29 1.33 1.40 1.38

Где  ∆PAPR – разница между первоначальным и измененным пик-фактором.

Проблемой использования SLM и PTS методов является существенное ограничение информационного канала связи, так как требуется отдельный канал связи, который сообщал АТ об изменении фазы сигнала. При неправильном приеме сообщения об изменении фазы данные теряются.

2.3 Методы добавления гармоник (поднесущих)

Вычисляя и используя оптимальные параметры гармоники (амплитуда и фаза) вне используемого диапазона возможно снизить пик-фактор сигнала. Необходимо провести расчет амплитуды и фазы гармоники таким образом, чтобы максимально подавить максимальные выбросы амплитуд сигналов. Используя несколько поднесущих, порядка 10 единиц, необходимо решить матричные уравнения вида, представленные формулами 3-9:

15

,где  SΔ- массив пиков, обрезанных по порогу. При отстутствии пиков значения массива равны нулю,

X — искомый массив значений амплитуды и фазы,

M – матрица опорных гармоник вне используемого диапазона частот.

Например,

На рисунке 14 визуально представлены значения массива SΔ, используемые в формулах 3 – 9. На рисунке приведены значения пиков при выборе порога, обеспечивающем пик-фактор равным 6 дБ:

16

Рисунок 14 – Массив обрезанных по порогу пиков (SΔ)

На рисунке 15 приведены графики действительной и мнимой части первой строки матрицы опорных сигналов.

17

Рисунок 15 –Первая строка матрицы опорных сигналов ( М(1,:) )

Для нахождения искомого массива значений амплитуд и фазы при помощи формулы 2 придем к уравнению, представленной в формуле 3:

Методика выполнения расчета:

  1. Обрезка сигнала по выбранному порогу Scutt,
  2. Выбор количества гармоник Ngarm,
  3. Решение уравнения (формула 9) по поиску амплитуды и фазы гармоник,
  4. Вычитание полученных опорных сигналов из исходного сигнала Sopor.end,
  5. Расчет PAPRnew

Для того, чтобы максимально снизить пик-фактор необходимо найти оптимальные значения порога среза (пункт 3) и количества гармоник (пункт 1).

 

Технологии связи LTE. OFDM — сигналы. Снижение пик-фактора (PAPR) OFDM — сигналов. Часть 1.

В данной статье рассматривается вопрос уменьшения пик — фактора OFDM — сигналов. В заграничной литературе пик-фактор встречается под термином Peak-to-Average Power Ratio (PAPR). Как можно понять из перевода оценивается пиковая и средняя мощности сигнала.

 

Зачем вообще использовать OFDM- сигналы? Для этого нам нужно будет представить канал связи в физическом плане реализованный на нескольких, допустим, на ста проводах от источника сигнала к потребителю. При этом каждый такой «провод» переносит 10 кбит/с данных абоненту. Тем самым обеспечивая 1000 кбит/с данных. Данную схему можно заменить одним, более емким по информации «проводом» в 1000 кбит/с. Все бы хорошо, но давайте оторвемся от понятий «провод» и передем к рассмотрению когда необходимо передать информацию в застроенном городе от сотовой вышке — абоненту.

 

Под «проводами» теперь будем понимать частоты. То есть одна частота — это один «провод». Но свойства этого «провода» таковы, что при приеме сигнала на мобильном терминале абонента сигнал, который распространяется за счет многолучевости (эффект, который возникает из-за многократных переотражений, особенно характерных для застроенных мегаполисов) может произойти наложение символов. Данный эффект называется межсимвольной интерференцией (ISI, Intersymbol Interfeence). ISI, а точнее многолучевое распространение, которое стало его причиной, приводит к проблемам с приемом сигнала на одной частоте.

image049

Намного проще и эффективнее использовать несколько частот, на меньшей скорости (бит/c) , на большей длительности (убьем ISI ). Именно в этом и заключается смысл и плюсы использования OFDM — сигналов.

На следующем рисунке довольно доступно обозначен смысл использования частотного ресурса абонентами. Есть канал — то есть та полоса частот, которая отведена определенному абоненту (будь то секретарь Глаша или гольфист) в этом канале есть поднесущие ( subcarrier), то есть наши «провода».

ofdm

Казалось бы все супер, но … За все приходится платить. И именно здесь мы платим большим пик-фактором.

Собственно ему и посвящена наша вторая статья.

 

Стикеры для Telegram (Телеграм)

Существует большое множество стикеров для мэсэнджера Telegram. Данная статья является некоторым дайджестом по самым, на мой взгляд, интересным и популярным стикерам.

Для того, чтобы скачать себе стикеры необходимо лишь кликнуть на ссылку вида @Название_Стикера под картинкой.

admem

@Admem — стикеры с мемами «Чувак, это репчик», «Совпадение? Не думаю», «Это Россия, детка» и многие другие мемы;

Back_to_future

@MartyMcFly — стикеры «Назад в Будущее» ;

Bear

@Bearinbushes — стикеры с медведем «Шлюха»;

buthead

@beavis_and_butthead — стикеры Бивис и Баттхед;

CHIP

@losifel3 — стикеры «Чип и Дейл» с Гаечкой;

 

Clark

@vimpaler — стикеры Эмилия Кларк ( «Игра Престолов» );

friends

@Friends_barscorpio — стикеры сериала «Друзья» («Friends»);

Godzila

@Modzilla — стикеры с милым Тиранозавром;

Homyak

@arseniythehomyak — стикеры с Хомяком Арсением;

HZ

@By1slmmm — стикеры с Фродо, Робертом Дауни-младшим и Плактоном;

Jolie

@angelinajolie — стикеры с Анджелиной Джоли;

mario

@supermariobros — стикеры Марио;

peppas

@peppochka — стикеры Свинка Пеппа;

Phrase

@bloodandconcrete — стикеры с фразами часть 1;

Phrase1

@za5hkvareno — стикеры с фразами часть 2;

Rus_Politics

@RussianElite — стикеры с Путиным, Песковым, Васильевой, Рамзаном Кадыровым и патриархом Кириллом (РПЦ — Российская православная церковь);

Sex_position

@SexPositionsColor — стикеры Камасутра, часть 1;

theory

@TBBT1 — стикера Теория Большого Взрыва;

UEFA

@uclteams — стикеры команд, участвующих в UEFA 2015-2016;

wos

@stickerswos — стикеры WOS;

Камасутра

@HotKama — стикеры Камасутра, часть 2;

Пушин

@PusheenJJ — стикеры с котом Pusheen;

Теребоньки

@terebonk — стикеры «Теребонькай».

 

Больше стикеров —->

Telegram Channels (Телеграм Каналы)

m6BFtJQW_400x400Недавно стал доступен сервис «Channels»(«Каналы») для Telegram, который является неким подобием «отрытых чатов» в Viber. Также можно провести некоторую аналогию с группами во Вконтакте.  Достаточно подписаться на интересующий Вас «Канал» и можно читать новости, которые постят администраторы «Канала».

Здесь мы привели некоторый список Channels (Каналов) для Telegram:

@SlonMag — подборка важных новостей за день/неделю по версии Slon.ru,

@SlonNews — подборка экстренных новостей Slon.ru,

@tvrain — новости телеканала Дождь,

@meduzaprobot — новостной бот Meduza,

@sports_ru — новости спорта —  Sport.ru,

@weacomru — новости Weacom,

@miuisu  — новости фан-сайта Xiaomi,

@foqusstore — новости фото, -фототехники,

@teleblog — блог Telegram