ClockworkOrange 0 21 мая, 2007 Опубликовано 21 мая, 2007 (изменено) · Жалоба для имплементации такого вот выражения (и схемы минимизирующей число сложений): необходимо использование линии задержки с начальным обнулением значений памяти (для правильной работы модуля) вопрос #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 Изменено 21 мая, 2007 пользователем ClockworkOrange Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 22 мая, 2007 Опубликовано 22 мая, 2007 (изменено) · Жалоба Рекомендую заглянуть в книгу Сергиенко Проектирование вычислительных устройств -> там найдешь описание и пример конвеерных вычислителей. В блочную память ты ЛЗ не засунешь :( , ибо делается все на регистрах с помощью Конечных Автоматов. :) Изменено 22 мая, 2007 пользователем ZMaverickZ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 22 мая, 2007 Опубликовано 22 мая, 2007 · Жалоба Приветствую! Вот вам принцип дла реализации переменной линии задержки на блочной памяти со сбросом. 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ClockworkOrange 0 22 мая, 2007 Опубликовано 22 мая, 2007 · Жалоба ZMaverickZ >> В блочную память ты ЛЗ не засунешь в обычную - может быть. в двупортовую - можно. учите МАТЧАСТЬ. RobFPGA >> Вот вам принцип дла реализации переменной линии задержки на блочной памяти со сбросом. что-то не получается в blockRAM имплементировать. пробовал и глобальные опции на блоковую реализацию ОЗУ выставить и (* RAM_STYLE="BLOCK" *) прописывал. нивкакую. странно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 23 мая, 2007 Опубликовано 23 мая, 2007 (изменено) · Жалоба ZMaverickZ >> В блочную память ты ЛЗ не засунешь в обычную - может быть. в двупортовую - можно. учите МАТЧАСТЬ. :a14: Такой алгоритм проще и лучше делать на регистрах! На мой взгляд это оптимально и более эффективно! :( Двупортовая память согласен, можно, но стоит ли :07: :) Изменено 23 мая, 2007 пользователем ZMaverickZ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ClockworkOrange 0 23 мая, 2007 Опубликовано 23 мая, 2007 · Жалоба ZMaverickZ >> Такой алгоритм проще и лучше делать на регистрах! На мой взгляд это оптимально и более эффективно! т.е. это сейчас круто, когда линия задержки занимает чуть ли не треть полумиллионника (без применения SLR16E ) ??? а то говорите загадками.. в чём именно выражается оптимальность и эффективность реализации на distributed ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 24 мая, 2007 Опубликовано 24 мая, 2007 (изменено) · Жалоба 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. Изменено 24 мая, 2007 пользователем ZMaverickZ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 7 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба Вам надо в у становленной документации ISE найти xst.pdf, там описаны HDL Coding Techniques, в том числе как на верилоге написать двухпортовую память чтобы XST имплементировал её в блочную память. Или можно сгенерить нужную память корегеном. Затем вручную надо написать адресацию этой памяти чтобы реализовывалась линия задержки. Затем вручную нужно написать автомат со счётчиком который будет занулять выходную шину памяти на N*M тактов после сброса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Renom 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба ZMaverickZ, в предложенном вами коде я бы все-таки увеличил разрядность регистра в аккамуляторе, а то при достаточно близких значениях а и b к 2^16-1 и суммировании хотя бы 3-4 отсчетов уже происходит ошибка в выходных данных, либо нужно ввести масштабирование при переполнении сумматора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться