0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 15
1

Накапливающий сумматор на VHDL

05.05.2014, 21:27. Показов 6640. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Изучаю VHDL совсем не давно, так что не судите строго.
Есть вот такая схемка, которая должна накапливать сумму результата умножения, при "i in 0 to 5".



Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity summC is
 
port (
   Xin: in std_logic_vector(7 downto 0);
   c: in std_logic_vector(31 downto 0);
   Ycout: out std_logic_vector(31 downto 0)
    
    );
    
end summC;
 
architecture Behavioral of summC is
 
 constant c0 : std_logic_vector(31 downto 0) := "00000000111110110010000000000000";
 constant c1 : std_logic_vector(31 downto 0) := "00000000111011001000000000000000";
 constant c2 : std_logic_vector(31 downto 0) := "00000000110101001110000000000000";
 constant c3 : std_logic_vector(31 downto 0) := "00000000101101010000000000000000";
 constant c4 : std_logic_vector(31 downto 0) := "00000000100011100100000000000000";
 constant c5 : std_logic_vector(31 downto 0) := "00000000011000100000000000000000";
 
 signal x: std_logic_vector(31 downto 0);
 signal SA0, SA1, SA2, SA3, SA4, SA5 : std_logic_vector(31 downto 0);
 
 
 begin
  
  SA0: process (Xin, c) begin
       for i in 0 to 5 loop
                  SA0(i)<=SA0(i)+(signed(x)*signed(c0));
                  SA1(i)<=SA1(i)+(signed(x)*signed(c1));
                  SA2(i)<=SA2(i)+(signed(x)*signed(c2));
                  SA3(i)<=SA3(i)+(signed(x)*signed(c4));
                  SA4(i)<=SA4(i)+(signed(x)*signed(c4));
                  SA5(i)<=SA5(i)+(signed(x)*signed(c5)); 
 
            
 end loop;
 end process;
  
 
 
end Behavioral;
Ошибка:
Pascal
1
2
3
4
5
6
7
ERROR:HDLParsers:800 - "C:/Xilinx92i/aProject/sx/summC.vhd" Line 58. Type of SA0 is incompatible with type of +.
ERROR:HDLParsers:800 - "C:/Xilinx92i/aProject/sx/summC.vhd" Line 59. Type of SA1 is incompatible with type of +.
ERROR:HDLParsers:800 - "C:/Xilinx92i/aProject/sx/summC.vhd" Line 60. Type of SA2 is incompatible with type of +.
ERROR:HDLParsers:800 - "C:/Xilinx92i/aProject/sx/summC.vhd" Line 61. Type of SA3 is incompatible with type of +.
ERROR:HDLParsers:800 - "C:/Xilinx92i/aProject/sx/summC.vhd" Line 62. Type of SA4 is incompatible with type of +.
ERROR:HDLParsers:800 - "C:/Xilinx92i/aProject/sx/summC.vhd" Line 63. Type of SA5 is incompatible with type of +.
ERROR:HDLParsers:1202 - "C:/Xilinx92i/aProject/sx/summC.vhd" Line 67. Redeclaration of symbol SA0.
Прошу помочь решить данную задачку или подсказать что именно не так, зарание благодарен.
Изображения
 
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2014, 21:27
Ответы с готовыми решениями:

AHDL. Накапливающий сумматор
Здравствуйте,помогите,пожалуйста нарисовать функциональную схему накапливающего сумматора...

Накапливающий сумматор в Quartus II
Необходимо построить накапливающий сумматор. Возможно ли сделать это на базе полного сумматора и...

4-х разрядный накапливающий сумматор с последовательной загрузкой
Прошу помочь с данным заданием . Сам могу делать только простые задания , ибо если бы это было не...

Выдает ошибку Error: VLM_0040: VHDL unit cannot be compiled as the target library name is not a legal VHDL identifier
выдает ошибку Error: VLM_0040: VHDL unit cannot be compiled as the target library name is not a...

Накапливающий сумматор
Здравствуйте! Есть задача одна: Построить накапливающий сумматор для формирования поразрядных...

17
408 / 227 / 43
Регистрация: 10.02.2013
Сообщений: 780
06.05.2014, 16:37 2
вот код накапливающего сумматора с CORAGeneratore
Код
signal add : std_logic_vector(7 downto 0));
signal sum: std_logic_vector (7 downto 0);
--signal a :unsigned (7 downto 0) := "00110010";--50
--signal a :unsigned (7 downto 0) := "01010000";--40
signal a :unsigned (7 downto 0) := "00100100";--36
signal f_out : std_logic;

process (clk,clr)
begin
if clr='1' then add<="00000000";
elsif clk'event and clk='1' then
if add(7) ='0' then
add <=unsigned('0'&add(6 downto 0)) + a;
else
add <=unsigned('0'&add(6 downto 0)) + a+28; --Десятичная коррекция
end if;
end if;
end process;

f_out <=add(6);
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 15
06.05.2014, 17:59  [ТС] 3
Чесно, человеку который довольно недавно начал разбератся в этой среде (VHDL), довольно сложно понять, что описано в том участке кода что вы показали, да и с CORAGenerator я еще ниразу не сталкивался.
0
408 / 227 / 43
Регистрация: 10.02.2013
Сообщений: 780
06.05.2014, 19:25 4
HeFoPmaT,
Цитата Сообщение от HeFoPmaT Посмотреть сообщение
Чесно, человеку который довольно недавно начал разбератся в этой среде (VHDL), довольно сложно понять, что описано в том участке кода что вы показали, да и с CORAGenerator я еще ниразу не сталкивался.
ничего нового я не добавил мой код почти такой ж как и ваш но написал в более компактной форме, объявили внутренние сигналы и проанализироли их, потом а процессе по тактому сигналу обрабатываем полученные данные,

укажите что именно не понятно опишу детальнее
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 15
06.05.2014, 19:47  [ТС] 5
Цитата Сообщение от shurikspk Посмотреть сообщение
укажите что именно не понятно опишу детальнее
Если я правильно понимаю то вначале по клоку мы обнуляем add, а вот что происходит дальше неочень понятно,
особенно этот момент:
C
1
2
3
add <=unsigned('0'&add(6 downto 0)) + a; --и зачем конкотанация?
else
add <=unsigned('0'&add(6 downto 0)) + a+28;
Добавлено через 9 минут
0
408 / 227 / 43
Регистрация: 10.02.2013
Сообщений: 780
06.05.2014, 20:06 6
Код
add <=unsigned('0'&add(6 downto 0)) + a; --и зачем конкотанация?
сначала идет прелбразование а потом этим действием мы объеденяем несколько строк в одну, сумирруем и записываем в переменную

Добавлено через 37 секунд
интесная статья по VHDL http://we.easyelectronics.ru/p... nulya.html
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 15
06.05.2014, 20:34  [ТС] 7
Цитата Сообщение от shurikspk Посмотреть сообщение
интесная статья по VHDL http://we.easyelectronics.ru/p... nulya.html
тут я был, статья действительно неплохая.

Еще я читал это http://dspace.nbuv.gov.ua/bits... sequence=1
и тут.
http://kanyevsky.kpi.ua/index.html

Интересно но сложно.
0
408 / 227 / 43
Регистрация: 10.02.2013
Сообщений: 780
06.05.2014, 21:05 8
Цитата Сообщение от HeFoPmaT Посмотреть сообщение
Интересно но сложно.
а разработка под ПЛИС вообще очень веселая вещь
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 15
06.05.2014, 23:46  [ТС] 9
Вот такой вариант навоял, незнаю насколько это правильно.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
architecture Behavioral of massAB is
        type Mas is array (0 to 5) of STD_LOGIC_VECTOR (31 downto 0);
          constant c:Mas:=("00000000111110110010000000000000", "00000000111011001000000000000000", "00000000110101001110000000000000",
                           "00000000101101010000000000000000", "00000000100011100100000000000000", "00000000011000100000000000000000");
          shared variable SA: Mas;
        signal x: STD_LOGIC_VECTOR (11 downto 0);         
begin
    Process (RST, CLK)
          begin
           if RST='1' then
            for i in 0 to 6               
             loop
                  SA(i)<=0;
     end loop;
            elsif rising_edge (CLK);
               for i in 0 to 6
                 loop
                  SA(i)<=SA(i)+(c(i)*x);
    end loop;   
end process;
 
end Behavioral;
0
408 / 227 / 43
Регистрация: 10.02.2013
Сообщений: 780
07.05.2014, 00:18 10
ну на вскидку вродебы правильно, компилятор если не ругается значит все нормально
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 15
07.05.2014, 00:45  [ТС] 11
Цитата Сообщение от shurikspk Посмотреть сообщение
ну на вскидку вродебы правильно, компилятор если не ругается значит все нормально
я просто раньше делфи изучал, а тут конеш такая катавасия с портами сигналами постоянно путаюсь...
0
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
07.05.2014, 11:05 12
Лучший ответ Сообщение было отмечено raxp как решение

Решение

Чтобы не путаться советую вам отказаться variable. variable - коварная вещь и новичку с ней сложно правильно работать.

Добавлено через 2 минуты
можно обойтись signal
1
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 15
07.05.2014, 12:18  [ТС] 13
Цитата Сообщение от Caruso Посмотреть сообщение
Чтобы не путаться советую вам отказаться variable. variable - коварная вещь и новичку с ней сложно правильно работать. Добавлено через 2 минуты
можно обойтись signal
Немогли бы Вы помочь?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
entity massAB is
     port (
         CLK : in std_logic;
          RST : in std_logic
      );
      
end massAB;
 
architecture Behavioral of massAB is
        type Mas is array (0 to 5) of STD_LOGIC_VECTOR (31 downto 0);
          constant c:Mas:=("00000000111110110010000000000000", "00000000111011001000000000000000", "00000000110101001110000000000000",
                           "00000000101101010000000000000000", "00000000100011100100000000000000", "00000000011000100000000000000000");
          shared variable SA: Mas;
        signal x:STD_LOGIC_VECTOR (11 downto 0);          
begin
    Process (RST, CLK)
          begin
           if RST='1' then
            for i in 0 to 6               
             loop
                  SA(i)<=0(i); ---------------------line 50
                  --SA(i)<=(others=>'0');
                end loop;  
        end if;
            elsif rising_edge (CLK) -------------------------------line 54
              --elsif CLK='1' and CLK'event then
               for i in 0 to 6
                 loop
                  SA(i)<=SA(i)+(c(1)*x(i));
                  
                end if;   
          end loop; 
         end if;      
end process;
 
end Behavioral;
получаю вот такие ошибки, непойму как сними бороться.

ERROR:HDLParsers:164 - "C:/Xilinx92i/aProject/new060514/massAB.vhd" Line 50. parse error, unexpected OPENPAR, expecting SEMICOLON
ERROR:HDLParsers:164 - "C:/Xilinx92i/aProject/new060514/massAB.vhd" Line 54. parse error, unexpected ELSIF, expecting END
0
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
07.05.2014, 15:47 14
Объясните более подробно, что вы хотите получить. Смотрю ваш код и совершенно не понимаю...
1
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 15
07.05.2014, 23:13  [ТС] 15
Цитата Сообщение от Caruso Посмотреть сообщение
Объясните более подробно, что вы хотите получить. Смотрю ваш код и совершенно не понимаю...
В самом первом посте схемка, сумматор накапливает результат умножения за 10 тактов.

Добавлено через 2 часа 10 минут
Такс в общем получилось у меня довести до ума мою писанину, программа вроде норм сиснтезирует схему акамулятора суммы, но всеравно выдает ряд вернингов, Помогите понять чаво ему ненравится и как решить проблему, есть предположения, что, что то с разрядностью но точно всеравно непоянтно.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
entity ts2 is
port (
         CLK : in std_logic;
          RST : in std_logic;
          SAout  : out STD_LOGIC_VECTOR (31 downto 0)
      );
end ts2;
 
architecture Behavioral of ts2 is
type Mas is array (0 to 5) of STD_LOGIC_VECTOR (31 downto 0);
          constant c:Mas:=("00000000111110110010000000000000", "00000000111011001000000000000000", "00000000110101001110000000000000",
                           "00000000101101010000000000000000", "00000000100011100100000000000000", "00000000011000100000000000000000");
          shared variable SA: Mas;
        signal x:STD_LOGIC_VECTOR (3 downto 0);           
 
begin
 
Process (RST, CLK)
        --variable a: STD_LOGIC_VECTOR (63 downto 0);         
          begin
           if RST='1' then
            for i in 0 to 5               
             loop
                  SA(i):="00000000000000000000000000000000";
                  --SA(i)<=(others=>'0');
                end loop;  
            --elsif rising_edge (CLK)
              elsif CLK='1' and CLK'event then
               for i in 0 to 5
                 loop
                  --a:=c(i)*"00000000000000000000"&x;
                    SA(i):=SA(i)+(c(i)*x); 
          end loop; 
         end if;      
end process;
 SAout<= SA(2);-- любое значение от 0 до 5
 
end Behavioral;
WARNING:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Low Level Synthesis                           *
=========================================================================
WARNING:Xst:1710 - FF/Latch  <SA_2_31> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_30> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_29> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_28> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_27> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_26> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_25> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_24> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_23> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_22> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_21> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_20> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_19> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_18> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_17> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_16> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_15> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_14> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_13> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_12> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_11> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_10> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_9> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_8> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_7> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_6> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_5> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_4> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_3> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_2> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_1> (without init value) has a constant value of 0 in block <ts2>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch  <SA_2_0> (without init value) has a constant value of 0 in block <ts2>.
0
408 / 227 / 43
Регистрация: 10.02.2013
Сообщений: 780
07.05.2014, 23:24 16
ну варнинги это ж не ошибки, они в любом проекте могут быть, тем более такие варнинги не критичны
1
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
08.05.2014, 10:27 17
Лучший ответ Сообщение было отмечено HeFoPmaT как решение

Решение

Попробовал ваш код откомпилировать компилятором ISE для xilinx и он мне не выдал таких предупреждений как вам. Но ISE не понравилась выражение SA(i):=SA(i)+(c(i)*x); так как в нем содержится несоответствие типов. Вот подправленный код со всеми правильными приведениями типов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
 
entity ts2 is
port (
          CLK : in std_logic;
          RST : in std_logic;
          SAout  : out STD_LOGIC_VECTOR (31 downto 0)
      );
end ts2;
 
architecture Behavioral of ts2 is
 
type Mas is array (0 to 5) of STD_LOGIC_VECTOR (31 downto 0);
 
        constant c:Mas:=("00000000111110110010000000000000", 
                            "00000000111011001000000000000000", 
                             "00000000110101001110000000000000",
                         "00000000101101010000000000000000", 
                                "00000000100011100100000000000000", 
                                 "00000000011000100000000000000000");
        signal SA: Mas;
        signal x : STD_LOGIC_VECTOR (3 downto 0);           
 
begin
 
process (RST, CLK)       
    begin
        if RST='1' then
            for i in 0 to 5 loop
                SA(i) <= (others => '0');
                     x <= (others => '0');
            end loop;  
            elsif CLK='1' and CLK'event then
                for i in 0 to 5 loop                     
                    SA(i) <= Std_logic_vector(To_signed(( To_integer(Signed(SA(i))) +  To_integer(Signed(c(i))) * To_integer(Signed(x))),32));
                end loop; 
        end if;      
end process;
 
SAout<= SA(2);
 
end Behavioral;
В моем коде приведение типов довольно запутанное. Поможет разобраться вот такая картинка:
Накапливающий сумматор на VHDL
1
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 15
08.05.2014, 18:24  [ТС] 18
Хочу сказать всем спс, за то, что помогали, это была для меня самая сложная часть схемы и теперь все работает как надо, еще раз спс.
0
08.05.2014, 18:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2014, 18:24
Помогаю со студенческими работами здесь

Построить накапливающий сумматор
Здравствуйте. Простите, что второй раз с одним вопросом... Нужно построить накапливающий сумматор...

Накапливающий сумматор конвейерной архитектуры
Здравствуйте,помогите,пожалуйста нарисовать функциональную схему накапливающего сумматора...

Построить накапливающий сумматор для формирования поразрядных сумм
Здравствуйте. Нужно построить накапливающий сумматор для формирования поразрядных сумм и переносов...

ВП, накапливающий массив значений температур
Создайте ВП, который накапливает массив значений температур с помощью «Снятие напряжения.vi» и...

Реализовать счетчик, накапливающий значение от 1 до 10^9
необходимо реализовать счетчик, накапливающий значение от 1 до 10^9. Каждый 100000 вычислений,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru