Проектирование последовательных КИХ-фильтров в САПР ПЛИС Quartus II

PDF версия
Цель статьи — продемонстрировать возможности САПР ПЛИС Quartus II для разработки цифровых фильтров. Проект последовательного КИХ-фильтра на четыре отвода представлен в САПР Quartus II Version 5.1 (Build 170 10/3/2005) и до настоящего времени включен в перечень демонстрационных примеров более современных версий САПР, например Quartus II Version 13.1 [1]. В САПР Quartus II ver 9.0 проект можно найти по адресу www.altera\90\qdesigns\fir_filter, а для версии 13.0 — www.altera\13.1\quartus\qdesigns\fir_filter.

Линия задержки, ПЗУ для хранения коэффициентов, управляющий автомат разработаны на языке Verilog, умножитель использует мегафункцию LPM_MULT, а аккумулятор представляет собой иерархическое описание на языке Verilog, нижний уровень которого — verilog-файл, cгенерированный мегафункцией LPM_ADD_SUB. Умножитель показан в виде символа, а линия задержки, коэффициенты и управляющий автомат — в виде блок-схем.

Адаптируем данный пример под задачу проектирования последовательного КИХ-фильтра на четыре отвода y = C0x0+C1x1+C2x2+C3x3 со следующими коэффициентами: C0 = –2, C1 = –1, C2 = 7 и C3 = 6.

КИХ-фильтры, использующие в своей основе блоки умножения и накопления, получили в зарубежной литературе название MAC FIR Filter (в нашем случае 1 MAC-фильтр). В статьях [2, 3] приведены примеры проектирования таких фильтров в системе Xilinx System Generator с применением библиотеки Reference BlockSet/DSP, а в работе [4] — с использованием пакета расширения Altera DSP Builder ver. 12.1 системы визуально-имитационного моделирования Matlab/Simulink (версия 8.0.0.783 (R2012b)). Примеры из работ [2, 3, 4] демонстрируют возможности методологии объектно-ориентированного проектирования [5].

На рис. 1 изображен иерархический проект последовательного КИХ-фильтра на четыре отвода в САПР Quartus II версии 13.0, на рис. 2 показана структурная схема проекта, представленная на уровне регистровых передач и полученная с помощью RTL-viewer. Входной сигнал и коэффициенты фильтра предусмотрены в дополнительном коде с 8‑ и 4‑битной точностью, поэтому умножитель и аккумулятор также настроены для выполнения операций над числами со знаком.

Иерархический проект последовательного КИХ-фильтра на четыре отвода

Рис. 1. Иерархический проект последовательного КИХ-фильтра на четыре отвода

Структурная схема проекта, полученная с помощью RTL-viewer

Рис. 2. Структурная схема проекта, полученная с помощью RTL-viewer

Проект использует два синхросигнала — clk и clkx2. Синхро-сигнал clk применен для тактирования линии задержки и внутреннего регистра аккумулятора фильтра, а clkx2 — для тактирования работы регистра результата. Период синхросигнала clk в два раза больше clkx2. Умножитель и сумматор аккумулятора настроены для работы в асинхронных режимах.

Пример 1 демонстрирует verilog-код линии задержки на четыре отвода. На рис. 3 дана структурная схема линии задержки на базе регистров. Пример 2 показывает verilog-код ПЗУ для хранения коэффициентов фильтра, на рис. 4 можно видеть структурную схему ПЗУ на базе дешифратора. Пример 3 представляет verilog-код управляющего автомата КИХ-фильтра. На рис. 5а изображена структурная схема управляющего автомата, а на рис. 5б — диаграмма состояний, на рис. 5в — таблица переходов и таблица кодирований состояний. Используется кодирование с одним активным или горячим состоянием (one hot encoding, OHE), то есть в каждый конкретный момент времени активным (hot) может быть только один триггер состояния. Метод ОНЕ применительно к ПЛИС FPGA дает возможность строить конечные автоматы, которые в общем случае требуют меньших ресурсов и отличаются более высокими скоростными показателями, чем аналогичные конечные автоматы с двоичным кодированием состояний.

module taps
(
  clk, reset, sel, newt, d, x
);
  input clk;
  input reset;
  input [1:0] sel;
  input newt;
  input [7:0] d;
  output [7:0] x;
  reg [7:0] x, xn, xn_1, xn_2, xn_3;
// Register element
always @(posedge clk or posedge reset)
begin
if (reset)
  begin
    xn = 8'b00000000;
    xn_1 = 8'b00000000;
    xn_2 = 8'b00000000;
    xn_3 = 8'b00000000;
  end
else if (newt)
  begin
    xn_3 = xn_2;
    xn_2 = xn_1;
    xn_1 = xn;
    xn = d;
  end
end

// Mux element

always @(sel or xn or xn_1 or xn_2 or xn_3)
case (sel)
2'b 00: x = xn;
2'b 01: x = xn_1;
2'b 10: x = xn_2;
2'b 11: x = xn_3;
default: x = 8'bXXXXXXXX;
endcase
endmodule

Пример 1. verilog-код линии задержки
module hvalues
(
  sel, h
);
  input [1:0] sel;
  output [3:0] h;
reg [3:0]h;
always @(sel)
case (sel)
 	2'b 00 : h = 4'b 1110;
 	2'b 01 : h = 4'b 1111;
 	2'b 10 : h = 4'b 0111;
 	2'b 11 : h = 4'b 0110;
endcase
endmodule

Пример 2. verilog-код ПЗУ для хранения коэффициентов фильтра 
module state_m
( 
  clk, reset, newt, sel, follow, first
);
  input clk, reset, newt;
  output follow, first;
  output [1:0]sel;
  reg follow, first;
  reg [1:0] sel;
  reg [2:0] filter;

parameter idle = 0, tap1 = 1, tap2 = 2, tap3 = 3, tap4 = 4;

always
begin
  case (filter)
    idle: begin
        sel = 2'b0;
        follow = 1'b0;
        first = 1'b0;
       end

    tap1: begin
        sel = 2'b0;
        follow = 1'b0;
        first = 1'b1;
       end

    tap2: begin
        sel = 2'b01;
        follow = 1'b0;
        first = 1'b0;
       end

    tap3: begin
        sel = 2'b10;
        follow = 1'b0;
        first = 1'b0;
       end

    tap4: begin
        sel = 2'b11;
        follow = 1'b1;
        first = 1'b0;
       end
      
    default : begin
          sel = 2'b00;
          follow = 1'b0;
          first = 1'b0;
          end
  endcase
end

always @(posedge clk or posedge reset)
begin
  if (reset)
    filter = idle;
  else
    case (filter)
      idle: begin
        if (newt)
          filter = tap1;
         end
        
      tap1: begin
          filter = tap2;
         end

      tap2: begin
          filter = tap3;
         end

      tap3: begin
          filter = tap4;
         end

      tap4: begin
          if (newt)
            filter = tap1;
          else
            filter = idle;
         end
    endcase	

end		
endmodule
Пример 3. verilog-код управляющего автомата КИХ-фильтра

Структурная схема линии задержки КИХ-фильтра

Рис. 3. Структурная схема линии задержки КИХ-фильтра

Структурная схема ПЗУ

Рис. 4. Структурная схема ПЗУ

Структурная схема управляющего автомата

Рис. 5.
а) Структурная схема управляющего автомата;
б) диаграмма состояний;
в) таблица переходов и таблица кодирований состояний

На рис. 6 показана структурная схема умножителя размерностью операндов 8×4, настроенная на асинхронный режим работы (clock=0). Умножитель проектируется на базе мегафункции LPM_MULT. Точность вычисления произведения — 12 разрядов. Для реализации умножителя будем использовать аппаратные умножители ПЛИС. Всего в ПЛИС EP3C5F256C6 предусмотрено 46 аппаратных умножителей с размерностью операндов 9×9.

Структурная схема умножителя размерностью операндов 8×4 на базе мегафункции LPM_MULT

Рис. 6. Структурная схема умножителя размерностью операндов 8×4 на базе мегафункции LPM_MULT

На рис. 7 представлен сумматор/вычитатель на базе мегафункции LPM_ADD_SUB. Сумматор/вычитатель способен работать как в асинхронном, так и в синхронном режиме. По умолчанию предполагается, что входные сигналы сумматора data[11..0] и datab[11..0] представлены в дополнительном коде.

Сумматор/вычитатель на базе мегафункции LPM_ADD_SUB

Рис. 7. Сумматор/вычитатель на базе мегафункции LPM_ADD_SUB

Пример 4 демонстрирует verilog-код аккумулятора КИХ-фильтра, а на рис. 8 видна структурная схема аккумулятора, соответствующая этому коду. Аккумулятор (функциональный блок acc) выполнен на основе асинхронного накапливающего сумматора, на базе мегафункции LPM_ADD_SUB, регистра и мультиплексора для принудительной установки входа сумматора datab[11..0] в ноль. Пример 5 демонстрирует фрагмент verilog-кода функции, используемой в примере 4.

module acc
(
  xh, clk, first, yn
);
  input [11:0] xh;
  input clk;
  input first;
  output [11:0] yn;

reg [11:0]yn;
reg [11:0] ynm, result, a_in;
wire [11:0] inter;
// Describe Multiplexer
always @(first or result)
begin
  case (first)
    1'b 0: ynm = result;
    1'b 1: ynm = 12'b00000000000;
  endcase
end
always @(posedge clk)
begin
  result = inter;
end
always @(xh)
begin
  a_in[11:0] = (xh);
  //a_in[12] = 0;
end
always @(result)
  begin 
    yn[11:0] = result[11:0];
  end
accum inst_13(.dataa(a_in), .datab(ynm), .result(inter));
endmodule

Пример 4. verilog-код аккумулятора КИХ-фильтра
module accum (
  dataa,
  datab,
  result);

  input	[11:0] dataa;
  input	[11:0] datab;
  output	[11:0] result;

  wire [11:0] sub_wire0;
  wire [11:0] result = sub_wire0[11:0];

  lpm_add_sub	lpm_add_sub_component (
        .dataa (dataa),
        .datab (datab),
        .result (sub_wire0)
        // synopsys translate_off
        ,
        .cout (),
        .cin (),
        .add_sub (),
        .overflow (),
        .clock (),
        .clken (),
        .aclr ()
        // synopsys translate_on
        );
  defparam
    lpm_add_sub_component.lpm_direction = "ADD",
    lpm_add_sub_component.lpm_hint = "ONE_INPUT_IS_CONSTANT=NO,CIN_USED=NO",
    lpm_add_sub_component.lpm_type = "LPM_ADD_SUB",
    lpm_add_sub_component.lpm_width = 12;
endmodule

Пример 5. Фрагмент verilog-кода функции accum (накапливающий сумматор) на базе мегафункции lpm_add_sub
Структурная схема аккумулятора на мегафункции LPM_ADD_SUB

Рис. 8. Структурная схема аккумулятора на мегафункции LPM_ADD_SUB

На рис. 9 и 10 дано функциональное моделирование импульсной характеристики КИХ-фильтра на четыре отвода и прохождение сигнала по структуре фильтра. На вход фильтра поступает сигнал –5, 3, 1, 0, 0, 0 и т. д. Правильные значения на выходе фильтра: 10, –1, –40, –10, 25, 6, 0 и т. д.

Функциональное моделирование импульсной характеристики КИХ-фильтра на четыре отвода

Рис. 9. Функциональное моделирование импульсной характеристики КИХ-фильтра на четыре отвода

Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода. На вход фильтра поступает сигнал –5, 3, 1, 0, 0, 0 и т. д. Правильные значения на выходе фильтра: 10, –1, –40, –10, 25, 6, 0 и т. д.

Рис. 10. Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода. На вход фильтра поступает сигнал –5, 3, 1, 0, 0, 0 и т. д. Правильные значения на выходе фильтра: 10, –1, –40, –10, 25, 6, 0 и т. д.

Переработаем проект (рис. 1), применяя несколько вариантов. Рассмотрим вариант, когда умножитель и аккумулятор синхронизуются общим синхросигналом clk, но реализуются с помощью мегафункции умножения LPM_MULT и накопления ALTACCUMULATE. В случае использования мегафункции ALTACCUMULATE отпадает необходимость в разработке вспомогательных узлов аккумулятора (рис. 8). Следует заметить, что мегафункция ALTACCUMULATE не входит в разработчик мегафункций (MegaWizard Plug-In Manager) для САПР Quartus II версии 13.1. Реализуется на базе логических элементов для ПЛИС серии Cyclone III и на базе адаптивных логических элементов для ПЛИС серии Stratix III.

Входной сигнал и коэффициенты фильтра представим с 8‑разрядной точностью. Все функциональные блоки проекта на верхнем уровне иерархии представим символами. Линия задержки, ПЗУ и управляющий автомат представлены verilog-кодом и корректировке не подлежат. На рис. 11 показан проект последовательного КИХ-фильтра на четыре отвода с использованием аккумулятора на мегафункции ALTACCUMULATE, а на рис. 12 демонстрируется функциональное моделирование прохождения сигнала по структуре КИХ-фильтра. Латентность умножителя и аккумулятора составляет 1 такт синхрочастоты. Для согласования работы управляющего автомата и аккумулятора необходимо выходной сигнал first автомата задержать на один такт синхрочастоты с помощью двухтактного триггера, выход которого нужно подключить ко входу сигнала синхронной загрузки аккумулятора sload. Результаты умножения и вычисления суммы произведений представляются с 16‑разрядной точностью. Для получения правильных значений профильтрованного сигнала на выходе yn_out[15..0] следует выходной сигнал follow задержать на три такта синхрочастоты и подключить его к входу разрешения тактирования ena регистра результата.

Проект последовательного КИХ-фильтра на четыре отвода с использованием аккумулятора на мегафункции ALTACCUMULATE

Рис. 11. Проект последовательного КИХ-фильтра на четыре отвода с использованием аккумулятора на мегафункции ALTACCUMULATE

Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода в случае использования аккумулятора на мегафункции ALTACCUMULATE

Рис. 12. Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода в случае использования аккумулятора на мегафункции ALTACCUMULATE

Рассмотрим вариант, когда умножитель и аккумулятор реализованы на мегафункции умножения и накопления ALTMULT_ACCUM (рис. 13 и 14). Данный вариант предпочтительнее для современных ПЛИС, так как предполагает использование встроенных ЦОС-блоков ПЛИС, позволяя экономить логические ресурсы. Выходной сигнал автомата first необходимо напрямую подключить к входу синхронной загрузки аккумулятора accum_sload.

Проект последовательного КИХ-фильтра на четыре отвода с использованием умножителя и аккумулятора на мегафункции ALTMULT_ACCUM

Рис. 13. Проект последовательного КИХ-фильтра на четыре отвода с использованием умножителя и аккумулятора на мегафункции ALTMULT_ACCUM

Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода в случае использования умножителя и аккумулятора на мегафункции ALTMULT_ACCUM

Рис. 14. Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода в случае использования умножителя и аккумулятора на мегафункции ALTMULT_ACCUM

Пример использования мегафункции ALTMULT_ACCUM для разработки параллельных КИХ-фильтров на четыре отвода можно найти в работе [6]. Входной сигнал и коэффициенты фильтра представлены с 4‑разрядной точностью, а результат фильтрации — с 8‑разрядной. Для разработки подобного фильтра требуется настроить мегафункцию ALTMULT_ACCUM таким образом, чтобы реализовались четыре умножителя, дерево сумматоров, аккумулятор. Линия задержки может быть построена на внутренних регистрах, находящихся на входах умножителей (рис. 15). Для сравнения: рабочая частота такого фильтра в наихудшем случае для ПЛИС серии Stratix III оценивается величиной в 400 МГц. Фильтр имеет латентность четыре такта синхрочастоты, и результат фильтрации обновляется с каждым тактом синхрочастоты (рис. 16). Последовательный КИХ-фильтр на мегафункции ALTMULT_ACCUM имеет латентность пять тактов синхрочастоты сигнала clk, и результат фильтрации обновляется через каждый четвертый такт синхрочастоты (на пятый, рис. 14).

Параллельная реализация КИХ-фильтра на четыре отвода с использованием мегафункции ALTMULT_ACCUM

Рис. 15. Параллельная реализация КИХ-фильтра на четыре отвода с использованием мегафункции ALTMULT_ACCUM

Функциональное моделирование прохождения сигнала по структуре параллельного КИХ-фильтра на четыре отвода в случае использования ALTMULT_ACCUM

Рис. 16. Функциональное моделирование прохождения сигнала по структуре параллельного КИХ-фильтра на четыре отвода в случае использования ALTMULT_ACCUM

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

Таблица 1. Общие сведения по числу задействованных ресурсов ПЛИС Altera Cyclone III Device EP3C5F256C6, временная модель TimeQuest анализа Slow-model (напряжение питания ядра 1200 мВ, температура 85 °C)

Проект

Общее число логических элементов (Total logic elements)

Триггеров логических элементов (Dedicated logic registers)

Аппаратных умножителей с размерностью операндов 9×9 (Embedded Multiplier 9-bit elements)

Рабочая частота в наихудшем случае Fmax, МГц

Умножитель на мегафункции LPM_MULT, аккумулятор на мегафункции LPM_ADD_SUB (рис. 1)

93

66

1

141,84

Умножитель на мегафункции LPM_MULT, аккумулятор на мегафункции ALTACCUMULATE (рис. 2)

112

91

1

179,66

Умножитель и аккумулятор на мегафункции ALTMULT_ACCUM (рис. 3)

89

70

1

128,07

Таблица 2. Оценка ресурсов ПЛИС Altera серии Cyclone III EP3C5F256C6, требуемых для реализации последовательного КИХ-фильтра на четыре отвода с применением пакета расширения Altera DSP Builder системы Matlab/Simulink [3]

Логических элементов (Total logic elements)

Триггеров логических элементов (Dedicated logic registers)

Аппаратных умножителей с размерностью операндов 9×9 (Embedded Multiplier 9-bit elements)

Рабочая частота в наихудшем случае Fmax, МГц

30

29

1

258

Таблица 3. Оценка ресурсов ПЛИС Xilinx серии Spartan‑6 xa6slx4-3tqg144, требуемых для реализации последовательных КИХ-фильтров на четыре отвода c применением пакета расширения Xilinx System Generator системы Matlab/Simulink [2]

Ресурсы ПЛИС

n-tap MAC FIR filter

Dual Port Memory MAC FIR Filter

Рабочая частота, МГц

233

279

Число ЦОС-блоков DSP-48A

1

1

Триггеров

52

57

Секций с LUT

39

38

 

Выводы

Показаны проекты последовательных КИХ-фильтров на четыре отвода с применением различных инструментов проектирования САПР Quartus II, таких как цифровые автоматы, мегафункции, verilog-коды из описаний мегафункций, символьное и блочное представление функциональных блоков в графическом редакторе.

Рассмотрен проект КИХ-фильтров на умножителе (мегафункция LPM_MULT) и аккумуляторе (накапливающий сумматор на мегафункции LPM_ADD_SUB), работающих в асинхронных режимах, а также два проекта, когда умножитель и аккумулятор работают в синхронных режимах. В первом варианте умножитель и аккумулятор реализованы на мегафункциях LPM_MULT и ALTACCUMULATE. Во втором — умножитель и аккумулятор реализованы на одной мегафункции умножения и накопления ALTMULT_ACCUM. Наиболее экономичным и простым в реализации оказался проект с использованием мегафункции ALTMULT_ACCUM.

Несмотря на более упрощенный вариант структурной схемы реализации проектов, они уступают по частоте аналогичным фильтрам, разработанным по имитационным моделям с использованием пакетов расширения Altera DSP Builder и Xilinx System Generator и блочной памяти ПЛИС.

Литература
  1. AN 307: Altera Design Flow for Xilinx Users. Altera Corporation. November 2009.
  2. Строгонов А., Цыбин С., Городков П. Разработка КИХ-фильтров в системе Xilinx System Generator САПР ISE Design Suite // Компоненты и технологии. 2015. № 5.
  3. Строгонов А., Цыбин С., Городков П. Проектирование последовательных КИХ-фильтров в системе Xilinx System Generator с применением библиотеки Reference BlockSet/DSP Suite // Компоненты и технологии. 2015. № 6.
  4. Строгонов А., Цыбин С., Городков П. Проектирование последовательных КИХ-фильтров в системе визуально-имитационного моделирования Matlab/Simulink с использованием Altera DSP Builder // Компоненты и технологии. 2015. № 11.
  5. Тарасов И. Проектирование для ПЛИС Xilinx: системные аспекты и уровень регистровых передач // Компоненты и технологии. 2015. № 2.
  6. Строгонов А., Быстрицкий С. Проектирование параллельных КИХ-фильтров в базисе ПЛИС // Компоненты и технологии. 2013. № 6.

Добавить комментарий

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