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

 
 
> DDS, dds с 40-разрядным сумматором
kkosik
сообщение Sep 28 2012, 07:03
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 8-09-12
Пользователь №: 73 445



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

Удалось-таки его написать, но при моделировании с учетом задержек в кристалле (после place&route) оказалось, что при суммировании числа (1111... + A) происходит огроменная задержка (т.е. старшие разряды числа долго-долго перекидываются в 0000...).
Суммируем по фронту испульса, а значение из таблицы синусов в соответствии с 10 старшими разрядами суммы выдается по срезу. Т.о. задержка суммирования "залазит" на срез. Из-за этого на выход по таблице синусов отчего-то выдается значение, которого в этой таблице в принципе нет!!
Тактовая частота 40 МГц, плис Actel apa300.

Кто что может посоветовать? wacko.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kkosik
сообщение Sep 28 2012, 14:14
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 8-09-12
Пользователь №: 73 445



Цитата
На 40 МГц даже 40-разрядный сумматор будет работать без проблем. Сдаётся мне, что вы сумматор этот криво описываете. В общем, код - в студию!

Я даже попробовал сделать 2 сумматора.
1) "обычный", складываем два unsigned
Код
entity adder_simple is
  port(
       DataA : in std_logic_vector(31 downto 0);
       Aclr : in std_logic;
       Clock : in std_logic;
       Sum : out std_logic_vector(39 downto 0);
       Cout : out std_logic);
end adder_simple;

architecture behavioral of adder_simple is

  signal DataA_unsigned : UNSIGNED(39 downto 0);
  signal SumAPlusB_unsigned : UNSIGNED(39 downto 0);
  signal SumOut_unsigned : UNSIGNED(39 downto 0);

begin
  DataA_unsigned <= resize(UNSIGNED(DataA),40);

  process (DataA_unsigned, SumOut_unsigned)
    variable sumAux_unsigned : UNSIGNED(40 downto 0);

  begin
    sumAux_unsigned := ('0' & DataA_unsigned) + ('0' & SumOut_unsigned);
    SumAPlusB_unsigned <= sumAux_unsigned(39 downto 0);
    Cout <= not(std_logic(sumAux_unsigned (40)));
  end process;

  process (AClr, Clock)
  begin
    if (Aclr = '1') then
       SumOut_unsigned <= TO_UNSIGNED(0, 40);
    elsif (Clock'event and Clock = '1')then
         SumOut_unsigned <= SumAPlusB_unsigned;
    end if;
  end process;

  Sum <= std_logic_vector(SumOut_unsigned(39 downto 0));

end behavioral;


2) с ускоренным переносом. За основу взят код ускоренного сумматора из книжки VHDL: Справочное пособие по основам языка:
Код
entity adder_fast is
  port(
       DataA : in std_logic_vector(31 downto 0);
       Aclr : in std_logic;
       Clock : in std_logic;
       Sum : out std_logic_vector(39 downto 0);
       carry_out : out std_logic);
end adder_fast;

architecture behavioral of adder_fast is


    signal h_sum : unsigned(39 downto 0);
    signal carry_generate : unsigned(39 downto 0);
    signal carry_propogate : unsigned(39 downto 0);
    signal carry_in_internal : unsigned(39 downto 1);

    signal sumout : unsigned(39 downto 0);

    signal dataA_unsigned : unsigned(39 downto 0);

begin
    
    dataA_unsigned <= resize(UNSIGNED(DataA),40);
    h_sum <= dataA_unsigned xor sumout;
    carry_generate <= dataA_unsigned and sumout;
    carry_propogate <= dataA_unsigned or sumout;

    process(carry_generate,carry_propogate,carry_in_internal)
        begin
            carry_in_internal(1) <= carry_generate(0);
      
            inst: for i in 1 to 38 loop
                carry_in_internal(i+1) <= carry_generate(i) or (carry_propogate(i) and carry_in_internal(i));
                end loop;

            carry_out <= carry_generate(39) or (carry_propogate(39) and carry_in_internal(39));
        end process;
    
    process(AClr, Clock)
        begin
            if(Aclr = '1') then
                sumout <= TO_UNSIGNED(0, 40);
                elsif (Clock'event and Clock = '1')then
                    sumout(0) <= h_sum(0) xor '0';
                    sumout(39 downto 1) <= h_sum(39 downto 1) xor carry_in_internal(39 downto 1);
            end if;
        end process;
    
    Sum <= std_logic_vector(sumout);
end behavioral;


Позже выложу графики из modelsim.

Цитата
always @(posedge clk)
begin
sum[39:20] <= sum[39:20] + adder[39:20] + co;
{co,sum[19:0]} <= {1'b0,sum[19:0]} + adder[19:0];
end

эммм, я vhdl учу. verilog воспринимаю пока что с трудом... Не могли бы переконвертировать? суть, в принципе, ясна. но вот эти {} ???
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Sep 28 2012, 15:27
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Я так понимаю, что и Serhiy_UA и yes предложили Вам обычную конвейерную реализацию сумматора http://www.masters.donntu.edu.ua/2012/fknt...l/ACIT_2012.htm
рис.1 Он будет работать быстрее, но имеет латентность. Чем больше уровней - тем быстрее, но и латентность выше. Соответственно, если у Вас есть обратная связь, то данный вариант наврядли подойдет.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- kkosik   DDS   Sep 28 2012, 07:03
- - TRILLER   Я бы вам посоветовал сделать всю схему только по ф...   Sep 28 2012, 08:04
- - kkosik   Боюсь, что все организованные процессы по фронту м...   Sep 28 2012, 09:59
|- - Timmy   Цитата(kkosik @ Sep 28 2012, 13:59) Боюсь...   Sep 28 2012, 10:05
- - bogaev_roman   Цитата(kkosik @ Sep 28 2012, 11:03) Удало...   Sep 28 2012, 10:23
- - Bad0512   Цитата(kkosik @ Sep 28 2012, 14:03) Вообщ...   Sep 28 2012, 11:06
|- - Serhiy_UA   Есть такой прием с конвейеризацией. Вместо одного...   Sep 28 2012, 11:56
||- - Serhiy_UA   Цитата(Serhiy_UA @ Sep 28 2012, 14:56) Эт...   Oct 18 2012, 08:54
|- - yes   Цитата(Bad0512 @ Sep 28 2012, 15:06) На 4...   Sep 28 2012, 14:11
|- - Bad0512   Цитата(yes @ Sep 28 2012, 21:11) с проази...   Sep 28 2012, 16:04
|- - yes   Цитата(kkosik @ Sep 28 2012, 18:14) эммм,...   Sep 28 2012, 14:23
|- - des00   Цитата(bogaev_roman @ Sep 28 2012, 09:27)...   Sep 28 2012, 15:38
- - kkosik   Это сумматор №1. Собственно, "обычный" с...   Sep 28 2012, 15:03
- - bogaev_roman   to Bad0512 я так понял со слов ТС, что данные от р...   Sep 28 2012, 18:15
- - Bad0512   Цитата(bogaev_roman @ Sep 29 2012, 01:15)...   Sep 29 2012, 03:55
- - Timmy   Проблема вашего сумматора по первому варианту в то...   Sep 29 2012, 06:34


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:39
Рейтинг@Mail.ru


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