Перейти к содержанию
    

линия задержки со сбросом

для имплементации такого вот выражения (и схемы минимизирующей число сложений):

post-27784-1179757920_thumb.jpg

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

 

вопрос #1: как выкрутиться из такой ситуации необходимости сброса ЛЗ ???

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

И потом - хотелось бы переложить на BlockRAM - а у нее сигнал сброса - это сброс регистра на data_out.

пока что придумалось: после сброса считать MxN тактов, после чего обнулять регистр обратной связи аккумулятора.

 

вопрос #2: не очень-то преуспели синтезаторописатели: как я ни старался директивами RAM_STYLE указать использование блочной памяти - категорически ничего не вышло (код ниже).

какие существуют общепринятые templates описания ЛЗ, чтобы синтезатор мог убирать ее в BlockRAM ?

 

  input wire signed [WI-1:0] din,     
  output signed [WO-1:0] dout);

  wire signed [WP-1:0] acc; 
  reg  signed [WP-1:0] acc_reg; 
  reg  signed [WI-1:0] delay [0:M*N-1];  // delay line 
  
  always @(posedge clk) begin: ff_block
    if (rst) begin
      acc_reg <= 0;
//      for (i=0; i<(M*N); i=i+1)  delay[i] <= 0;  // remove for pack intro SLR16E  
    end
    else if (ce) begin
      acc_reg <= acc;    
      delay[0] <= din;
      for (i=1; i<(M*N); i=i+1)  delay[i] <= delay[i-1];    
    end
  end

  assign acc  = acc_reg + {{8{din[WI-1]}},din} - {{8{delay[M*N-1][WI-1]}},delay[M*N-1]};
  assign dout = round(acc);

 

PS: синтезатор XST (хотя это не так принципиально) чип - Spartan-3E

Изменено пользователем ClockworkOrange

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендую заглянуть в книгу Сергиенко Проектирование вычислительных устройств -> там найдешь описание и пример конвеерных вычислителей. В блочную память ты ЛЗ не засунешь :( , ибо делается все на регистрах с помощью Конечных Автоматов. :)

Изменено пользователем ZMaverickZ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Вот вам принцип дла реализации переменной линии задержки на блочной памяти со сбросом.

 

 

parameter M=8'h8;

parameter N=8'h8;

parameter MN=M*N; //MN>=2 !!

parameter WHA=8; //=log2(MN-1);

 

wire [WHA-1:0] wMN; //может быть и входным портом

assign wMN=MN-2;

 

reg signed [WI-1:0] delay [0:MN-1]; // delay line

reg signed [WI-1:0] dDat; //output delay

reg [WHA-1:0] ptrW;

 

always @(posedge clk)

begin: delay_block

 

if (rst)

ptrRW<=0;

else if (ce)

begin

if (ptrRW==wMN)

ptrRW<=0;

else

ptrRW<=ptrRW+1;

end

 

 

if (ce)

delay[ptrRW]<=din;

 

//reset logic

if (rst)

qRst<=1;

else if (ce && ptrRW==wMN)

qRst<=0;

 

//output register

if (rst)

dDat<=0;

else if (ce)

begin

if (qRst)

dDat<=0;

else

dDat<=delay[ptrRW];

end

 

end

 

Успехов! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ZMaverickZ

>> В блочную память ты ЛЗ не засунешь

 

в обычную - может быть. в двупортовую - можно. учите МАТЧАСТЬ.

 

 

RobFPGA

>> Вот вам принцип дла реализации переменной линии задержки на блочной памяти со сбросом.

 

что-то не получается в blockRAM имплементировать. пробовал и глобальные опции на блоковую реализацию ОЗУ выставить и (* RAM_STYLE="BLOCK" *) прописывал. нивкакую. странно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ZMaverickZ

>> В блочную память ты ЛЗ не засунешь

 

в обычную - может быть. в двупортовую - можно. учите МАТЧАСТЬ. :a14:

 

Такой алгоритм проще и лучше делать на регистрах! На мой взгляд это оптимально и более эффективно! :( Двупортовая память согласен, можно, но стоит ли :07:

:)

Изменено пользователем ZMaverickZ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ZMaverickZ

>> Такой алгоритм проще и лучше делать на регистрах! На мой взгляд это оптимально и более эффективно!

 

т.е. это сейчас круто, когда линия задержки занимает чуть ли не треть полумиллионника (без применения SLR16E ) ???

а то говорите загадками.. в чём именно выражается оптимальность и эффективность реализации на distributed ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ZMaverickZ

>> Такой алгоритм проще и лучше делать на регистрах! На мой взгляд это оптимально и более эффективно!

 

т.е. это сейчас круто, когда линия задержки занимает чуть ли не треть полумиллионника (без применения SLR16E ) ???

а то говорите загадками.. в чём именно выражается оптимальность и эффективность реализации на distributed ???

 

Вопрос: входные данные какой размерности? ПОЧЕМУ линия задержки занимает чуть ли не треть полумиллионника (без применения SLR16E ) ??? Все вопросы по твоему первому вопросу реализации БИХ фильтра (или математического выражения). Ниже даю пример:

 

Сумматор-накопитель

 

Данный сумматор-накопитель работает согласно выражению ∑a•b, т.е. происходит накопление суммы произведений на регистре. Если не сложно дай пожалуйста программу на

 

Описание портов:

clk − вход тактовой частоты;

a – 16-разрядный вход для первого умножителя;

b – 16-разрядный вход для второго умножителя;

s – 32-разрядный выход сумматора-аккумулятора.

 

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

entity add_accumulat_mult is

Port ( clk : in std_logic;

a : in std_logic_vector(15 downto 0);

b : in std_logic_vector(15 downto 0);

s : out std_logic_vector(31 downto 0) );

end add_accumulat_mult;

 

architecture behavioral of add_accumulat_mult is

 

signal sum : std_logic_vector(31 downto 0):= (others => '0');

signal m : std_logic_vector(31 downto 0):= (others => '0');

 

begin

 

process (clk,m,sum)

begin

if (clk'event and clk = '1') then

sum <= m + sum;

end if;

s <= sum;

end process;

 

m <= a*b;

 

end behavioral;

 

В твоем случае надо вначале добавить регистр т.е. задержку на один такт, а также поменять произведение на + или - и все! Это мое мнение. Опиши пожалуйста если не сложно на VHDL SLR16E.

Изменено пользователем ZMaverickZ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам надо в у становленной документации ISE найти xst.pdf, там описаны HDL Coding Techniques, в том числе как на верилоге написать двухпортовую память чтобы XST имплементировал её в блочную память. Или можно сгенерить нужную память корегеном. Затем вручную надо написать адресацию этой памяти чтобы реализовывалась линия задержки. Затем вручную нужно написать автомат со счётчиком который будет занулять выходную шину памяти на N*M тактов после сброса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ZMaverickZ, в предложенном вами коде я бы все-таки увеличил разрядность регистра в аккамуляторе, а то при достаточно близких значениях а и b к 2^16-1 и суммировании хотя бы 3-4 отсчетов уже происходит ошибка в выходных данных, либо нужно ввести масштабирование при переполнении сумматора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

×
×
  • Создать...