DocsTech
/
Проекты ПЛИС на VERILOG
/

~ cd интегратор: цифровой и аналоговый элемент схемы

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

Виды интеграторов:

  1. Интегратор на операционном усилителе: чаще всего применяется в аналоговых схемах для выполнения операции интегрирования непрерывного сигнала.
  2. Цифровой интегратор: используется в цифровых устройствах для интегрирования ряда дискретных значений сигнала.

Особенности построения

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

Важным элементом в построении аналогового интегратора является операционный усилитель. На рисунке 1 показан сумматор-интегратор, также представлена формула расчета выходного напряжения. Если поменять местами резистор и конденсатор, получим дифференциатор.

Интегратор-сумматор на ОУ
Рисунок 1. Аналоговый интегратор с формулой расчета

В цифровом интеграторе важным элементом является запаздывающий регистр z^(-1), который накапливает значение. Данный тип интегратора представляет собой рекурсивный фильтр первого порядка с коэффициентом 1(b) и коэф a.

RTL примера модуля интегратора и отчет о компиляции
Рисунок 2. RTL Цифрового интегратора

Различие аналогового от цифрового

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

Применение интегратора

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

Реализация Цифрового Интегратора на языке Verilog

В интегратор реализованы следующие параметры:

Точечная нотация фиксированной точки равна 1.15. На такой нотации работают большинство сигнальных процессоров. Код создавался и тестировался Quartus9.1, поэтому была необходимость прописывать умножение отдельным модулем. Однако, программа также можно использовать в своих проекта на Xilinx. Реализация параметров PERIOD не возможна на системных функциях в Quartus9.1, но проектах Vivado можно задействовать функции. Иным образом программа искажала generate RTL(см generate).
...
Копировать
module integr(data, clk, reset, out, cn);
    // 1 - включение коэф дискретизации, 0 - отключение
    parameter KOEF_ENA = 1;
    // мой пример... Частота дискретизации 500 КГц. 1/500 = 0.002
    // В данном случае точечная нотация с фиксированой точкой 1.15
    // следовательно. 0.002*(2**16) = 65.536 => PERIOD = 65
    parameter [15: 0] PERIOD = 82;
    parameter DATA_WIDTH = 16;

    input [(DATA_WIDTH - 1): 0] data;
    input reset, clk;
    output [(DATA_WIDTH - 1): 0] out;
    output [(DATA_WIDTH - 1): 0] cn; // переполнение

    wire [(DATA_WIDTH*2 - 1): 0] koef_after;
    wire [(DATA_WIDTH - 1): 0] add1;

    reg [(DATA_WIDTH - 1): 0] z1 = 0;

    generate
        if (KOEF_ENA) begin
            unsigned_multiply #(DATA_WIDTH - 1) mult1(PERIOD, data, koef_after);
        end else begin
            assign koef_after = {data, 15'h00};
        end
    endgenerate

    assign {cn, add1} = (koef_after >> 15) + z1;
    assign out = add1;

    always @(posedge clk, posedge reset) begin
        if (reset) begin
            z1 <= 0;
        end else begin
            z1 <= add1;
        end
    end

endmodule

module unsigned_multiply
#(parameter WIDTH=8)
(
    input [WIDTH-1:0] dataa,
    input [WIDTH-1:0] datab,
    output [2*WIDTH-1:0] dataout
);

    assign dataout = dataa * datab;

endmodule

Пример реализации интегратора на STM32

Для создания интегратора на микроконтроллере STM32F401, принимающего данные по SPI на частоте 1 МГц, вам потребуется настроить периферию SPI и реализовать алгоритм интегрирования данных. Ниже приведен пример кода на языке программирования C/C++ для STM32CubeIDE, который настраивает SPI на частоту 1 МГц и реализует простой интегратор для принятия данных по SPI:
...
Копировать
#include "stm32f4xx_hal.h"

SPI_HandleTypeDef hspi;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_SPI1_Init();

  uint8_t receivedData;
  uint32_t sum = 0;

  while (1)
  {
    HAL_SPI_Receive(&hspi, &receivedData, 1, HAL_MAX_DELAY);
    sum += receivedData; // Простой интегратор, складываем принятые данные
  }
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 16;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_SPI1_Init(void)
{
  hspi.Instance = SPI1;
  hspi.Init.Mode = SPI_MODE_SLAVE;
  hspi.Init.Direction = SPI_DIRECTION_2LINES;
  hspi.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi.Init.CRCPolynomial = 10;
  hspi.Init.NSS = SPI_NSS_SOFT;
  hspi.Init.FirstBit = SPI_FIRSTBIT_MSB;

  hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; // Настройка скорости передачи
  hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

  if (HAL_SPI_Init(&hspi) != HAL_OK)
  {
    Error_Handler();
  }
}

Данный код настраивает SPI1 в режиме SLAVE, принимает данные и суммирует их в переменной ‘sum’. Не забудьте дополнить код обработчиками прерываний, если они необходимы в вашем приложении.

Заключение

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

Главная
Курсы
Вебинары
Квадратный корень методом CORDIC на FPGA
Алгоритмы квадратного корня на FPGA
Делители частоты на Verilog: дробные и целые коэффициенты деления
Расчет фильтра Баттерворта MATLAB и Verilog
Интегратор: цифровой и аналоговый элемент схемы
Примеры Сдвиговых регистров в Verilog
5 Уникальных Примера Testbench на Verilog
Сдвиги в Verilog: логический, арифметический и циклический
Память RAM Verilog ПЛИС
Триггеры в Verilog: JK, RS, D и T
10 Лучших примеров кода Verilog
Закрыть