Вызов модуля в Verilog и VHDL

Здесь я не пытаюсь убедить всех о лаконичности использования Verilog в HDL-разработке, на мой взгляд, VHDL довольно хорош, но иногда его использовать довольно геморно, особенно если нужно быстро накидать какую-то простую логику.

В качестве примера рассмотрим ситуацию, когда у нас один модуль (bench) использует второй (top), у которого 2 выходных порта.

Один из портов (С) — клок, второй — 12-битная шина данных (h). Внутри модуля объявлены параметры, которые являются условиями для присваивания значения выходному порту.

Читать далее «Вызов модуля в Verilog и VHDL»

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

Технологии связи 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

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

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

 

Знакомство с ПЛИС. UART на Verilog

UPD: По просьбе пользователя andrey добавлены статьи по каждому из частей — приемнику и передатчику.


Данная статья посвящена вопросу создания универсального асинхронного приемопередатчика (УАПП) — в дальнейшем, ввиду распространенности его английского названия мы будем называть его UART. Статья содержит основные понятия о принципах работы UART, приводится исходный код и результаты работы непосредственно «прошитой» ПЛИС.

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

Структура передачи данных представлена на рисунке 1.

2015-06-19 13-59-40 Скриншот экрана
Рисунок 1 — Метод передачи данных

 

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

Как видно, структура довольно проста.

Приступим к непосредственному описанию блока UART для ПЛИС. Для этого будет использовать язык Verilog. Но перед этим нужно примерно понять структуру приемопередатчика.

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

После приема и обработки осуществим передачу данных. Структура приемопередатчика приведена на рисунке 2.

2015-06-19 13-51-24 Скриншот экрана
Рисунок 2- Схема приемапередатчика UART

На схема блок CLK_smth — передает тактовые сигналы от генератора тактовых импульсов к блокам receive и transmit по витой паре. Данный блок генерируется CoreGen’ом (об этом позже).  RX и TX — соответственно входной и выходной порты. Блок receive принимает последовательные биты, преобразует в байт данных и по готовности байта выставляется флаг rdy и передает данные data[7:0]. Блок transmit принимает данные data[7:0]  по флагу rdy и обратно преобразует их в последовательный вид для выдачи на выход (TX_out).

Данный блок, как видно из схемы, состоит из трех подблоков — CLK_smth, receive и transmit.

Для того,чтобы они функционировали вместе и для их объединения создается специальный файл (top.v), который объединяет нужные порты.

Содержимое top.v (объединения блоков) 

[php]
//—————top.v
`timescale 1ns / 100ps
module UART_top(
input clk_p, // LVDS clocks… отсюда сигнал 200 МГц попадает на PLL
input clk_n, // LVDS clocks… отсюда сигнал 200 МГц попадает на PLL
input RX_in, // UART вход
output TX_out // UART выход
);
wire rdy;
wire [7:0] data;
wire TX_out;
wire clk_out;
clk_wiz_v3_6 CLK_smth(
// Clock in ports
.CLK_IN1_P(clk_p),
.CLK_IN1_N(clk_n),
// Clock out ports
.CLK_OUT1(clk_out)
);
// Core UART приемника
UART_receiver receive(
.RX(RX_in),
.CLK(clk_out),
.Rdy(rdy),
.DATA(data)
);
// Core UART передатчика
UART_transmitter transmit (
.DATA(data),
.CLK(clk_out),
.Rdy(rdy),
.TX(TX_out)
);
endmodule
[/php]

Содержимое receiver.v (приемника UART)

[php]
//———-receiver.v
module UART_receiver (
input RX,
input CLK,
output reg Rdy = 0,
output reg [7:0] DATA
);

reg starter =1’d0;
reg [7:0] count = 8’d0;
reg [2:0] want_to_know;
reg true_RX;
reg [7:0] shifter;
reg [7:0] start = 8’d0;
reg smth =1’d0;

always @( posedge CLK )
begin
if (RX==0)
begin
starter<=1’d1;
end

if (starter)
begin
count<=count+1;
if (count==57||count==114||count==171) // Три выборки от результата деления частоты CLK на скорость UART в бодах (CLK/Vuart) (в начале, середине и конце)
begin // В данном случае CLK — 20 МГц, Vuart = 115200 бод ( значения также необходимо заменить в файле transmitter.v )
want_to_know[2:1]<=want_to_know[1:0];
want_to_know[0]<=RX;
end

if (count==172)
begin
if (want_to_know[2]&&want_to_know[0]||want_to_know[1])
begin
true_RX<=1;
end
else
begin
true_RX<=0;
end
end

if (count==173) // результат от деления частоты CLK на скорость UART в бодах (CLK/Vuart)
begin
count<=0;
start<=start+1; if (start>0&&start<9)
begin
shifter[7:1]<=shifter[6:0];
shifter[0]<=true_RX;
end
else
if (start==9)
begin
DATA<=shifter;
starter<=0;
smth<=1’d1;
start<=0;
end
end
end

if (smth)
begin
Rdy<=1;
smth<=0;
shifter<=8’d0;
end
else
begin
Rdy<=0;
end
end
endmodule
[/php]

Содержимое transmitter.v (передатчика UART)

[php]
module UART_transmitter(
input [7:0] DATA,
input CLK,
input Rdy,
output reg TX =1
);
reg start_trans=1’d0;
reg [7:0] count = 8’d0;
reg [7:0] tr_count = 8’d0;
reg [7:0] shifter;
always @ (posedge CLK)
begin
if (Rdy)
begin
start_trans<=1’d1;
shifter<=DATA;
end
if (start_trans)
begin
tr_count<=tr_count+1;

if (count==0)
begin
if (tr_count<173) // результат от деления частоты CLK на скорость UART в бодах (CLK/Vuart)
begin
TX<=0;
end
else
begin
count<=1;
tr_count<=0;
end
end
else
begin
if (tr_count<173) // результат от деления частоты CLK на скорость UART в бодах (CLK/Vuart)
begin
TX<=shifter[7];
end

else
begin
shifter[7:1]<=shifter[6:0];
tr_count<=0;
count<=count+1;
end
end

if (count==9) // если нужен бит четности, то добавлять if (count==10) begin …. end
begin
TX<=1;
start_trans<=1’d0;
count<=0;
shifter<=8’d0;
end
end
end
endmodule

[/php]

Как уже говорилось CLK_smth — сгенерирована CoreGen’ом и ее код здесь приводить не имеет смысла.
Для тестирования воспользовались Putty, соединили ПК и прошитый ПЛИС через UART.

2015-04-30 18-04-49 Скриншот экрана (2)
Рисунок 3 — Параметры соединения ПК с ПЛИС по UART (номер виртуального COM порта и скорость UART)
2015-04-30 18-04-33 Скриншот экрана (2)
Рисунок 4 — Результаты приема и передачи данных с ПЛИС

 

Схемы испытания полевых транзисторов

После того, как Вы создали модель полевого транзистора, то бишь SPICE модель, необходимо проверить ее вольт-амперные (ВАХ) и пр. характеристики. Для этого используем следующие ГОСТы:
1. ГОСТ 20398.7-74
Метод измерения порогового напряжения и напряжения отсечки.
Field-effect transistors. Threshold and cut-off voltage measurement technique

  1. АППАРАТУРА

1.1. Измерительные установки, предназначенные для измерения порогового напряжения и напряжения отсечки , должны обеспечивать основную погрешность измерения в пределах ±5%, а при токах менее 0,1 мкА в пределах ±15% от конечного значения рабочей части шкалы.

  1. ПОДГОТОВКА К ИЗМЕРЕНИЮ

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

Снимок

2.2. Основные элементы, входящие в схему, должны удовлетворять следующим требованиям, указанным ниже.

2.2.1. Падение напряжения на внутреннем сопротивлении измерителя не должно превышать ±5% от показаний прибора V .

Если это условие не выполняется, необходимо увеличивать напряжение источника в цепи стока на значение, равное падению напряжения на внутреннем сопротивлении измерителя A ;
-V измеритель напряжения;
-ИП измеритель напряжения, обеспечивающий заданную погрешность измерения порогового напряжения либо напряжения отсечки Uзи.отс.
2.3. Точность установки тока стока не должна превышать ±10% от конечного значения рабочей части шкалы прибора, если это значение не менее 0,1 мкА и не более ±15% от конечного значения рабочей части шкалы, если это значение менее 0,1 мкА.
        3. ПРОВЕДЕНИЕ ИЗМЕРЕНИЯ
3.1. Измерения производят в следующем порядке.
Транзистор включают в схему и устанавливают режим по постоянному току.

Значения напряжения Uзи.пор. или Uзи.отс. , представляющее собой напряжение затвор-исток, при котором достигается требуемый ток стока, отсчитывают по шкале измерителя .

 

2.   ГОСТ 20398.8-74

 Метод измерения начального тока стока 

 Field-effect transistors. Drain current for Vgs=0 0 measurement technique

 

  1. АППАРАТУРА

1.1. Измерительные установки, предназначенные для измерения начального тока стока , должны обеспечивать основную погрешность измерения в пределах ±5%, а при токах менее 0,1 мкА в пределах ±15% от конечного значения рабочей части шкалы.

 

  1. ПОДГОТОВКА К ИЗМЕРЕНИЮ

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

Снимок
2.2. Основные элементы, входящие в схему, должны соответствовать следующим требованиям, указанным ниже.

2.2.1. Падение напряжения на внутреннем сопротивлении ИП не должно превышать 5% от показания прибора при токах до 10 мкА и 1,5% от показания прибора V при больших токах. Если это условие не выполняется, то необходимо увеличить напряжение источника постоянного тока на значение, равное падению напряжения на внутреннем сопротивлении ИП.

Измеритель тока должен обеспечивать заданную точность измерения тока Iс.нач. 

  1. ПРОВЕДЕНИЕ ИЗМЕРЕНИЯ

3.1. Измерения проводят в следующем порядке.

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

 

Значение Iс.нач. отсчитывают на шкале ИП.

 ГОСТ 20398.13-80

Метод измерения сопротивления сток-исток 

 Field-effect transistors. Drain source resistance measurement technique

  1. ПРИНЦИП И УСЛОВИЯ ИЗМЕРЕНИЯ

1.1. Измерение заключается в определении сопротивления между стоком и истоком в открытом состоянии транзистора при заданном напряжении сток-исток, меньшем напряжения насыщения, и заданном напряжении на затворе.

1.2. Электрический режим транзистора (напряжение на стоке, напряжение на затворе) и условия измерения указывают в стандартах или технических условиях на транзисторы конкретных типов.

2. АППАРАТУРА

2.1. Сопротивление сток-исток в открытом состоянии транзистора следует измерять на установке, электрическая структурная схема которой приведена на черт.1 или 2.

Снимок

Снимок

2.2. Сопротивление резистора R (черт.1) должно не менее чем в 100 раз превосходить сопротивление сток-исток измеряемого транзистора.

2.3. Допускаемое отклонение сопротивления резисторов магазина сопротивлений R1 (черт.2) должно находиться в пределах ±1%.

2.4. Допускаемое отклонение сопротивления резисторов R2 и R3 (черт.2) должно находиться в пределах ±1%.

2.5. Напряжение источника стока G2 при отключенном транзисторе не должно превышать максимально допустимое, указанное в стандартах или технических условиях на транзисторы конкретных типов.

Напряжение на стоке включенного транзистора не должно превышать 1 В.

  1. ПОДГОТОВКА И ПРОВЕДЕНИЕ ИЗМЕРЕНИЙ

3.1. Измерение сопротивления Rси.отк. в схеме черт.1 производят в следующем порядке.

3.1.1. Измеряемый транзистор включают в схему черт.1 и задают режим по постоянному току.

3.1.2. Значение напряжения U определяют по прибору  PV2, значение тока Ia по прибору PA .

3.2. Измерение сопротивления Rси.отк. в схеме черт.2 производят в следующем порядке.

3.2.1. Измеряемый транзистор включают в схему и в положении 1 переключателя S задают режим по постоянному току.

3.2.2. Переключатель ставят в положение 2 и подбором резисторов R1 устанавливают нуль на приборе P .

  1. ОБРАБОТКА РЕЗУЛЬТАТОВ

4.1. Сопротивление в схеме черт.1 рассчитывают по формуле

 Rси.отк.=U/Ia

Если значение Ia фиксировано, то значение Rси.отк. пропорционально U и вольтметр PV2 может быть проградуирован в единицах сопротивления.

4.2. В схеме черт.2 сопротивление Rси.отк. определяют из соотношения

Rси.отк.=R1,0*(R3/R2) 

 где — R1,0 значение резистора R1  при нулевом положении индикатора P.      

 

  1. ПОКАЗАТЕЛИ ТОЧНОСТИ ИЗМЕРЕНИЯ

5.1. Основная погрешность измерительных установок со стрелочными приборами должна быть в пределах ±5% для сопротивлений Rси.отк≥ 10 Ом и ±10% для сопротивлений Rси.отк≤ 10 Ом.

5.2. Основная погрешность измерительных установок с цифровым отсчетом должна быть в пределах±(4+0.9*(Rпред/Rx)) % для сопротивлений Rси.отк≥10 Ом и ±(8+1.7*(Rпред/Rx)) % для сопротивлений Rси.отк≤ 10 Ом,

 

где Rx- измеряемое сопротивление;

Rпред- конечное значение установленного предела измерения.

Детекторы

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

По характеристикам детектирования легко определить многие параметры детектора: коэффициент передачи Kd как производную характеристики детектирования в рабочей точке, динамический диапазон как интервал изменений аргумента, в котором характеристика детектирования линейна, нелинейные искажения (коэффициент гармоник) за счет нелинейности характеристики детектирования.

Детектор как нагрузка высокочастотных каскадов приемника характеризуется
входным сопротивлением R вх=U(w)/I(w)
где U (w) и I (w) соответственно амплитуды входного
напряжения и тока с частотой несущей w.

Cхемы амплитудных детекторов

Схемы АД могут быть разделены на два класса: нелинейные и перемножительные. Они реализуют нелинейный и параметрических принципы детектирования. Детекторы на нелинейном элементе (диоде, транзисторе и др.) повсеместно применяют с начала развития радиотехники. Перемножительные детекторы получили широкое применение на умеренно высоких частотах с появлением микросхем аналоговых и цифровых умножителей и других функциональных преобразователей. Распространенные схемы нелинейных диодных АД показаны на рис.6.2.

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

Для того, чтобы высокочастотное напряжение U (w) , присутствующее на диоде и его нагрузке R, не проникало на выход детектора, необходим RС — или LC — фильтр нижних частот. Поэтому детектор параллельного типа содержит больше схемных элементов, что является его недостатком. Входное сопротивление этого детектора меньше, т.к. параллельно входному сопротивлению собственно детектора, как следует из схемы, подключено входное сопротивление ФНЧ. Остальные характеристики этого детектора такие же, как у детектора последовательного типа.

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

Схема «идеального диодного детектора» (рис.6,2, д [21]) реализуется на базе
операционного усилителя (ОУ) с глубокой отрицательной обратно связью через детекторные диоды. За счет этого влияние падения напряжения на нелинейности реального диода уменьшаются в К/К ос раз, а отношение коэффициентов усиления без обратной связи (К) и с обратной связью (К ос ) обычно более 1000.

Схемы нелинейных транзисторных АД применяются относительно редко, главным образом для повышения коэффициента передачи и уменьшения выходного сопротивления детектора. В зависимости от места включения RC-нагрузки, на которой выделяется продетектированное напряжение, меняется механизм детектирования. Если нагрузка детектора включена в цепь тока базы (рис.6.3, а), то основным механизмом детектирования является базовый: высокочастотный сигнал, поданный на базу, при выборе рабочей точки на начальном участке входной ВАХ i б = f (u бэ ) вызывает рост постоянной составляющей тока базы и увеличение запирающего транзистор напряжения на нагрузке RC. Последнее, усиливается транзистором как усилителем постоянного тока с нагрузкой R к C к . В результате напряжение на коллекторе детектора растет. Базовый переход в этом типе детектора может рассматриваться как диодный детектор с нагрузкой RC. Входное сопротивление его низкое, коэффициент передачи k d >>1. Характеристика детектирования обладает большой нелинейностью.

 

Аналого-цифровые преобразователи

Аналого-цифровые преобразователи (АЦП) – функциональные устройства, выходной цифровой код которых пропорционален амплитуде входного сигнала.
Т.к. большинство физических сигналов, амплитуда которых преобразуется в цифровой код, представляют непрерывные функции времени, а цифровые устройства – устройства дискретного действия, то входные аналоговые сигналы предварительно дискретизируют. Процесс дискретизации заключается в фиксации (запоминании) мгновенного значения входного сигнала в определенные моменты времени и сохранение зафиксированного значения до следующей выборки из входного сигнала. Интервал дискретизации или частота дискретизации fд (временного квантования) должны удовлетворять теореме Котельникова:

— высшая частота в спектре преобразуемого сигнала. При невыполнении условия теоремы однозначное восстановление исходного сигнала из дискретизированного (обратная операция) невозможно. Практически fд превышает 2fв в 1,5..3 раза, т.е.fд ~ 3..6 fв, что значительно упрощает последующее восстановление аналогового сигнала после цифровой обработки.
Основными параметрами АЦП являются:

  • относительная разрешающая способность ;δ=1/(2^n)-1

  • абсолютная разрешающая способность h =Umax*δ , где Umax — максимальное входное напряжение;

  • относительная нелинейность преобразования ;Снимок экрана от 2013-11-17 13:51:17

где входное напряжение, соответствующее коду k ;

  • время преобразования — интервал времени от подачи аналогового напряжения на вход АЦП до получения цифрового кода на выходе;

  • максимальная частота преобразования — наибольшая частота запуска, при которой параметры АЦП соответствуют заданным значениям.

Максимальная частота и время установления определяют быстродействие АЦП.

Существует множество способов аналого-цифрового преобразования. Наиболее распространенные из них:

  • АЦП последовательного действия;

  • АЦП поразрядного приближения;

  • АЦП параллельного действия;

  • Сигма-дельта АЦП.

Мультивибратор на логических элементах

Автоколебательная схема мультивибратора строится на основе двух инвертирующих логических элементов, соединенных перекрестной цепью положительной обратной связи через дифференцирующие цепи (рисунок 3.15).

При высоком уровне напряжения на выходе элемента DD1.1 через его выходное сопротивление и резисторы R1 и R1’ происходит заряд конденсатора С1. Ток заряда создает экспоненциально спадающее напряжение на резисторах R1 + R1’, т.е. на входе DD1.2. Пока это напряжение выше порога отпирания DD1.2, на его выходе будет низкий логический уровень. В это же время конденсатор C2 разряжается через низкое выходное сопротивление DD1.2 и резистор R2, создавая на входе DD1.1 отрицательный экспоненциальный импульс (рисунок 3.16).

 10

Рисунок 3.15                                                                 Рисунок 3.16

Регенеративное опрокидывание схемы происходит, когда напряжение на входе DD1.2 достигает порога срабатывания. После этого роли элементов схемы меняются местами. Длительность рассматриваемого полупериода определяется следующим образом:

t1  τ1  ln(U1/UП) = C1(R1+R1’)  ln(U1/UП) , (3.16)

где U1 – максимальное напряжение на выходе логического элемента. Его величина зависит от технологии изготовления и серии микросхем, использованных для построения мультивибратора. Обычно для микросхем, изготовленных по технологии ТТЛШ U1составляет от 2,4 до 4,2 В, а величина порога срабатывания UП – 1,2…1,4 В.

.

Мультивибраторы

Мультивибратором называется электронное импульсное устройство, имеющее два устойчивых или квазиустойчивых состояния и предназначенное для формирования импульсных сигналов. В цифровой технике высокому и низкому уровню приписывается смысл логических состояний ВКЛ и ВЫКЛ или цифр двоичной арифметики 1 и 0. Возможность генерирования логических сигналов позволяет применять мультивибраторы в цифровых устройствах в качестве источников синхроимпульсов, формирователей временных интервалов заданной длительности и т.п. Работа мультивибратора может быть описана с помощью временных диаграмм, логических формул, таблиц истинности или графов. Для построения мультивибраторов используются элементы, способные инвертировать логический сигнал такие как транзисторные ключи, логические элементы и другие. Различают ждущие мультивибраторы или формирователи, генерирующие импульсы заданной длительности синхронно с внешними сигналами, и автоколебательные, генерирующие последовательность импульсов с заданными частотой и длительностью.

.