реклама на сайте
подробности

 
 
> Обращение матриц на ПЛИС
jojo
сообщение Feb 3 2006, 18:29
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 574
Регистрация: 9-10-04
Из: FPGA-city
Пользователь №: 827



Обращение матриц на ПЛИС

Тут надо комплексную матрицу 16x16 обратить (эрмитову). Формат исходных данных int32, результат - не хуже float, лучше - double. Есть ли готовые мегафункции, не обязательно нелицензионные?

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

В нынешней реализации обращения на DSP используются квадратный корень и деление (вещественные), сложение, вычитание и умножение (комплексные).

Хочу уменьшить нагрузку на DSP и разместить обращение матрицы в относитильно защищенной от взлома ПЛИС.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
psL
сообщение Feb 11 2006, 13:36
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



Код
------------------------------------------------------------
-- Square Root Calculator   (FLEX10k)
-- < fpsqrt2.vhd >
-- 1998/11/11 (Wed)
-- yamaoka@tube.ee.uec.ac.jp
------------------------------------------------------------

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

library metamor;
use metamor.attributes.all;

entity fpsqrt2 is
  port ( CLK  : in std_logic;                    
         A    : inout std_logic_vector(15 downto 0);
         BL   : in std_logic_vector(7 downto 0);  
         BH   : out std_logic_vector(7 downto 0);    
         OBF  : in std_logic_vector(1 downto 0);
         ACK  : out std_logic_vector(1 downto 0);
         STB  : out std_logic_vector(1 downto 0);
         IBF  : in std_logic_vector(1 downto 0);
         CL   : in std_logic_vector(5 downto 0)
      );

attribute pinnum of A   : signal is  "BC23,BB24,BC25,BB26,BC27,BB28,BC29,BB30,BC31,BB32,BC33,BB34,BC35,BB36,BC37,B
B38";
attribute pinnum of BL  : signal is  "BC13,BB14,BC15,BB16,BC17,BB18,BC19,BB20";
attribute pinnum of BH  : signal is  "BC5,BB6,BC7,BB8,BC9,BB10,BC11,BB12";
attribute pinnum of CLK : signal is  "D22";
attribute pinnum of OBF : signal is  "AV18,AV28";
attribute pinnum of ACK : signal is  "AU19,AU29";
attribute pinnum of STB : signal is  "AU21,AU31";
attribute pinnum of IBF : signal is  "AV20,AV30";
attribute pinnum of CL  : signal is  "AU23,AV24,AU25,AU33,AV34,AU35";

end fpsqrt2;

architecture RTL of fpsqrt2 is

signal A_REG : std_logic_vector(15 downto 0);    
signal ACK_BUF : std_logic_vector(1 downto 0);        
signal IN_CNT : std_logic;    
signal OUT_CNT : std_logic;                   

signal FA, FB : std_logic_vector(31 downto 0);        
signal SQ : std_logic;
signal EQ : std_logic_vector(7 downto 0);        
signal MQ : std_logic_vector(22 downto 0);        
signal QL, QH : std_logic_vector(15 downto 0);

begin

ACK_BUF <= OBF;
ACK <= ACK_BUF;

A <= "ZZZZZZZZZZZZZZZZ" when ACK_BUF = "00" else A_REG;

------------< Input Data from PC >--------------
process ( BL(0), OBF ) begin
if BL(0) = '1' then
    FA <= "00000000000000000000000000000000";
    IN_CNT <= '0';
elsif OBF'event and OBF = "11" then
    if IN_CNT = '0' then
        FA(15 downto 0) <= A;
        IN_CNT <= '1';
    else
        FA(31 downto 16) <= A;
        IN_CNT <= '0';        
    end if;
end if;
end process;

------------< Output Data to PC >--------
process ( BL(0), BL(1), IBF ) begin
if BL(0) = '1' then
    OUT_CNT <= '0';
    A_REG <= "0000000000000000";
    STB <= "11";
elsif rising_edge( BL(1) ) then    
    STB <= "00";
    if OUT_CNT = '0' then
        A_REG <= QL;
        OUT_CNT <= '1';
    else
        A_REG <= QH;
        OUT_CNT <= '0';        
    end if;
end if;
if IBF = "11" then
    STB <= "11";
end if;
end process;

process
    variable MA : std_logic_vector(25 downto 0);
    variable TEQ : std_logic_vector(7 downto 0);
    variable TMQ : std_logic_vector(24 downto 0);
    variable TMP1, TMP2, REMAIN : std_logic_vector(27 downto 0);
begin
wait until rising_edge( CLK );

TEQ := FA(30 downto 23) - "01111111";
EQ <= ( TEQ(7) & TEQ(7 downto 1) ) + "01111111";

if FA(23) = '1' then
    MA := "01" & FA(22 downto 0) & '0';
else
    MA := '1' & FA(22 downto 0) & "00";
end if;

TMP1 := "00000000000000000000000000" & MA( 25 downto 24 );
TMP2 := "0000000000000000000000000001";

for I in 0 to 24 loop
    REMAIN := TMP1 - TMP2;
    if REMAIN(27) = '0' then
        TMQ(24-I) := '1';
        if I <= 11 then
            TMP1( (I+3) downto 0 ) := REMAIN( (I+1) downto 0 ) & MA( (23-(2*I)) downto (22-(2*I)));
        else
            TMP1( (I+3) downto 0 ) := REMAIN( (I+1) downto 0 ) & "00";
        end if;
        TMP2( (I+3) downto 0 ) := TMP2( (I+2) downto 1 ) & "01";
        TMP2(2) := '1';
    else
        TMQ(24-I) := '0';
        if I <= 11 then
            TMP1( (I+3) downto 0 ) := TMP1( (I+1) downto 0 ) & MA( (23-(2*I)) downto (22-(2*I)));
        else
            TMP1( (I+3) downto 0 ) := TMP1( (I+1) downto 0 ) & "00";
        end if;    
        TMP2( (I+3) downto 0 ) := TMP2( ( I+2 ) downto 1) & "01";
    end if;
end loop;
SQ <= '0';

TMQ := TMQ + "0000000000000000000000001";
MQ <= TMQ(23 downto 1);

end process;

QL <= MQ(15 downto 0);
QH <= SQ & EQ & MQ(22 downto 16);

end RTL;


может поможет?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- jojo   Обращение матриц на ПЛИС   Feb 3 2006, 18:29
- - cdg   ИМХО если не за 1 такт надо, то с ПЛИС и не стоит ...   Feb 7 2006, 08:58
- - jojo   Да, я все больше убеждаюсь, что ПЛИС "дороже ...   Feb 7 2006, 10:46
- - cdg   В пору аспирантской юности, помнится сталкивался с...   Feb 7 2006, 15:26
- - Harbour   На плис проект будет работать все равно быстрее че...   Feb 8 2006, 07:35
|- - des00   Цитата(Harbour @ Feb 8 2006, 02:35) На пл...   Feb 8 2006, 08:52
- - Harbour   Это правда если сравнивать современные DSP с доист...   Feb 9 2006, 09:34
|- - dxp   Цитата(Harbour @ Feb 9 2006, 15:34) Это п...   Feb 9 2006, 10:57
- - jojo   Думаю, по меньшей мере последние этапы обращения м...   Feb 9 2006, 11:17
- - Harbour   Цитата(dxp @ Feb 9 2006, 12:57) Цитата(Ha...   Feb 9 2006, 14:48
|- - dxp   Цитата(Harbour @ Feb 9 2006, 20:48) Ну-ну...   Feb 10 2006, 05:25
|- - des00   Цитата(dxp @ Feb 10 2006, 00:25) И если у...   Feb 10 2006, 06:07
- - des00   Ну в качестве примера, RLE кодирование большого ма...   Feb 9 2006, 15:33
- - Harbour   Как по мне так RLE параллелится, это сильно зависи...   Feb 9 2006, 18:45
- - Harbour   Цитата(dxp @ Feb 10 2006, 07:25) Цитата(H...   Feb 10 2006, 06:53
|- - dxp   Цитата(Harbour @ Feb 10 2006, 12:53) Ну-у...   Feb 10 2006, 07:18
|- - des00   Цитата(Harbour @ Feb 10 2006, 01:53) Как ...   Feb 10 2006, 08:09
- - Harbour   Статей про распараллеливание рле полно в инете, во...   Feb 10 2006, 10:50
|- - des00   ЦитатаСтатей про распараллеливание рле полно в ине...   Feb 10 2006, 11:49
- - Harbour   Цитата(des00 @ Feb 10 2006, 13:49) Тут сл...   Feb 10 2006, 12:56
- - jojo   #include <math.h> Обращение выполняется за ...   Feb 10 2006, 13:35
- - Harbour   Прикинул на пальцах Ваши матрицы, вот чего вышло :...   Feb 11 2006, 12:46
- - jojo   В процессоре этап 1 выполняется за 14.3 мкс (7128 ...   Feb 11 2006, 17:09
- - jojo   Вытащил из процессора таблицу начальных приближени...   Feb 13 2006, 10:53


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th August 2025 - 04:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016