3 / 3 / 2
Регистрация: 17.05.2010
Сообщений: 67
1

Устройство вычитания двух 16-разрядных чисел

07.05.2014, 00:20. Показов 3604. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Новичок в этом деле, поэтому прошу наставить на путь истинный. Нужно построить устройство вычитания двух 16-разрядных чисел, представленных в прямом коде. Использовать синхронный сброс.

Для начала составил схему черного ящика. Правильно ли?

Устройство вычитания двух 16-разрядных чисел


Z – знак, определяющий, какое действие нужно выполнить: при подаче логической единицы, будет производиться сложение, при логическом нуле – вычитание;

Я так полагаю, что устройство вычитания будет состоять из двух 8-разрядных сумматоров?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2014, 00:20
Ответы с готовыми решениями:

Устройство сложения 4-х разрядных двоичных чисел
Здравствуйте, проблема следующая Необходимо разработать устройство, позволяющее производить...

[intel8051] Реализовать подпрограммы на ассемблере для сложения, вычитания, умножения 32 разрядных чисел
Реализовать три подпрограммы (вызываемые с помощью команды call), принимающие в качестве аргументов...

Сравнение двух 10-ти разрядных чисел
Я новичок в программировании микроконтролеров,помогите с алгоритмом сравнения двух 10-разрядных...

Разность двух 16-ти разрядных чисел
Добрый вечер завтра экзамен.В билете 2 вопроса 1)Написать программу вычитания 16-ти разрядных...

16
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
07.05.2014, 11:22 2
Для вычитания необходимо представить вычитаемое число в дополнительном коде и подать его на сумматор. Для представления числа в дополнительном коде необходимо побитно проинвертировать число.
Название: image003.gif
Просмотров: 143

Размер: 8.7 Кб
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
07.05.2014, 22:33 3
....
При записи числа в дополнительном коде старший разряд является знаковым. Если его значение равно 0, то в остальных разрядах записано положительное двоичное число, совпадающее с прямым кодом. Если число, записанное в прямом коде, отрицательное, то все разряды числа инвертируются, а к результату прибавляется 1. К получившемуся числу дописывается старший (знаковый) разряд, равный 1.
0
3 / 3 / 2
Регистрация: 17.05.2010
Сообщений: 67
08.05.2014, 11:50  [ТС] 4
А как быть, если оба этих числа знаковые. Например -3-(-5).
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
08.05.2014, 14:04 5
-3-(-5) = -3 + 5;
-3+(-5) = -3 - 5 = (-3) + (-5);
0
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
08.05.2014, 14:20 6
-3-(-5) = 5-3
поменять местами слагаемые
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
08.05.2014, 17:32 7
Нет. Тут мы имеем дело с вычитанием через сложение с отрицательным числом в дополнительном коде. Поэтому именно: -3-(-5) = -3 + 5.
0
3 / 3 / 2
Регистрация: 17.05.2010
Сообщений: 67
12.05.2014, 23:55  [ТС] 8
Из всего исходящего я сделал следующий вывод. Если уменьшаемое отрицательное, то переводим его в дополнительный код. Если вычитаеммое отрицательное то просто складываем числа. Если же вычитаемое положительное, то то переводим его в дополнительный код. Вопрос как быть с переполнением?
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
13.05.2014, 00:14 9
...а никак, можете просто его выводить.
0
3 / 3 / 2
Регистрация: 17.05.2010
Сообщений: 67
13.05.2014, 23:52  [ТС] 10
Вот вроде бы сотворил некое чудо. Правильно ли?
Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_unSIGNED.ALL;
Entity summator is
  Port (A,B : in std_logic_vector (15 downto 0);
  Z, Res, Clk : in std_logic;
  S : out std_logic_vector (15 downto 0);
  P : out std_logic);
end summator;
architecture sum of summator is
  begin
    Process (Clk, Res)
     variable a1, b1, w : signed(15 downto 0);
begin
if (CLK'event and CLK='1') then
if Res='1' then 
S<="0000000000000000"; 
P<='0';
z='0' //вычитание
a1:= to_signed(a, 16);
 b1:= to_signed(b, 16);
 w:=a1-b1;
s <= conv_std_logic_vector(w,16);
	  end if;
	  end if;
  end process;     
end sum;
Переполнение вот так реализовывать?
Код
 if (w>?) then //За место знака "?" какое значение указать?
  P<='1';
 s <= conv_std_logic_vector(w,8);
  else P<='0';
  s <= conv_std_logic_vector(w,8);
   end if;
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
14.05.2014, 11:09 11
У вас есть симулятор? Запустите и по временным диаграммам все будет ясно.
0
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
14.05.2014, 13:55 12
FauLL, я чего - то не пойму что вам нужно сделать. Огласите какой у вас задание.
0
3 / 3 / 2
Регистрация: 17.05.2010
Сообщений: 67
14.05.2014, 21:49  [ТС] 13
Построить устройство вычитания двух 16-разрядных знаковых чисел, представленных в прямом коде. Использовать синхронный сброс.
0
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
15.05.2014, 11:24 14
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date:    09:33:06 05/08/2014 
-- Design Name: 
-- Module Name:    ts2 - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
 
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;
 
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
 
 
--            A - B
entity ts2 is
port (
          Clk : in std_logic;
          Rst : in std_logic;
          Diff  : out STD_LOGIC_VECTOR (29 downto 0);
             NumA  : in STD_LOGIC_VECTOR (14 downto 0);
          NumB  : in STD_LOGIC_VECTOR (14 downto 0);
             SignA : in std_logic;  -- 1 положит/ 0 отритц
             SignB : in std_logic;  
             SignDiff : out std_logic
      );
end ts2;
 
architecture Behavioral of ts2 is
 
signal bNumA    : INTEGER range 0 to 32767;
signal bNumB    : INTEGER range 0 to 32767;
signal bDiff    : INTEGER range 0 to 1073676289;
          
 
begin
 
bNumA <= To_integer(Unsigned(NumA));
bNumB <= To_integer(Unsigned(NumB));
Diff <= Std_logic_vector(To_unsigned(bDiff, 30));
 
process (Rst, Clk)       
    begin
        if Rst='1' then bDiff <= 0;
                          SignDiff <= '0';
            elsif Clk='1' and Clk'event then
                    if SignA = '1' and SignB = '0' then bDiff <= bNumA + bNumB; SignDiff <= '1';         --    A+B
                         elsif SignA = '0' and SignB = '1' then bDiff <= bNumA + bNumB; SignDiff <= '0';  --   -A-B
                              elsif SignA = '1' and SignB = '1' then                                      --    A-B
                                    if bNumA > bNumB then  bDiff <= bNumA - bNumB; SignDiff <= '1';          --    A > B
                                         else bDiff <= bNumB - bNumA; SignDiff <= '0';                        --    A =< B
                                     end if;
                                     elsif SignA = '0' and SignB = '0' then                                  --    -A-(-B)
                                         if bNumA >= bNumB then  bDiff <= bNumA - bNumB; SignDiff <= '0';     --    A => B
                                             else bDiff <= bNumB - bNumA; SignDiff <= '1';                    --    A < B
                                         end if;
                     end if;
        end if;      
end process;
 
 
end Behavioral;
Код не проверял. Проверте на симуляторе саме.
0
3 / 3 / 2
Регистрация: 17.05.2010
Сообщений: 67
19.05.2014, 23:09  [ТС] 15
А вот такой вариант может сработать? В данный момент качаю modelsim чтоб проверить.
вот отсюда брал информацию когда переделывал код http://www.bsuir.by/vhdl/posts... zyka-vhdl/

Код
entity kurs is port (   A, B  : in std_logic_vector  (15 downto 0);
          Clk, Rst : in std_logic;
          S: out std_logic_vector (16 downto 0);
             SignA , SignB: in std_logic;    			-- 1 положит/ 0 отритц
             P : out std_logic
      );
end ts2;
 architecture Behavioral of kurs is
signal bA    :  signed(15 downto 0);
signal bB    :  signed(15 downto 0);
signal bS    :  signed(16 downto 0);
          
begin
 
bA <= to_signed(A, 16); 
bB <= to_signed(B, 16);
bS <= Std_logic_vector(to_signed(S, 16));
process (Rst, Clk)       
    begin
If (Clk='1' and Clk'event)  then
        if Rst='1' then 
bS <= 0;
             P <= '0';
                    if SignA = '1' and SignB = '0' then bS <= bA + bB; P <= '1';         --    A+B
                         elsif SignA = '0' and SignB = '1' then bS <= bA + bB; P <= '0';  --   -A-B
                              elsif SignA = '1' and SignB = '1' then                                      --    A-B
                                    if bA > bB then  bS <= bA - bB; P <= '1';          --    A > B
                                         else bS <= bB - bA; P <= '0';                        --    A =< B
                                     end if;
                                     elsif SignA = '0' and SignB = '0' then                                  --    -A-(-B)
                                         if bA >= bB then  bS <= bA - bB; P <= '0';     --    A=>B
                                             else bS <= bB - bA; P <= '1';                    --    A < B
                                         end if;
                     end if;
        end if;      
end process; 
end Behavioral;
0
3 / 3 / 2
Регистрация: 17.05.2010
Сообщений: 67
05.06.2014, 01:10  [ТС] 16
Caruso, Можете объяснить почему у нас выход 30-разрядный?
Код
Diff  : out STD_LOGIC_VECTOR (29 downto 0);
И почему мы используем именно такие пределы целого числа?
Код
signal bNumA    : INTEGER range 0 to 32767;
signal bNumB    : INTEGER range 0 to 32767;
signal bDiff    : INTEGER range 0 to 1073676289;
0
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
07.06.2014, 23:01 17
FauLL, Вы же сами написали что у вас перемножаются 16-разрядные знаковые числа. Следовательно число состоит из модуля - 15 разрядов и из знака - один разряд. Отсюда вывод: максимальный модуль числа может быть равен 215 = 32767.
Идем дальше. Выход у нас должен быть 30 разрядным для того, что бы туда поместилось любое число, которое мы получим в результате умножения. Например, если мы будем умножать максимально - возможные числа 32767 * 32767 то получим 1073676289. 230 = 1073676289. И это гигантское число должно поместиться в наш "выход". По этому "выход должен быть 30 разрядов"
1
07.06.2014, 23:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2014, 23:01
Помогаю со студенческими работами здесь

Разработать рекурсивную функцию для вычитания двух n-разрядных шестнадцатеричных чисел
Разработать рекурсивную функцию для вычитания двух n-разрядных шестнадцатеричных чисел (1&lt;n&lt;100),...

Выполнить операцию вычитания 8-разрядных чисел
Нужно Выполнить операцию вычитания 8-разрядных чисел, находящихся в ОЗУ, и сформировать признаки...

Реализовать операции сложения, вычитания, умножения для целых знаковых 32-х разрядных чисел
Помогите плиз.

Умножение двух 16-ти разрядных чисел
Здравствуйте . Помогите , пожалуйста, понять , как умножаются числа в ассемблере. Читал , что...

Вычитание двух 32-разрядных двоичных чисел
Добрый день! Понимаю, что задача простейшая, но все же вызывает затруднения. Мне надо написать...

Реализовать вычитание двух 64-разрядных чисел.
Всем привет:) Ребят подскажите, пожалуйста, в чём проблема?? Есть следующая задача: &quot;Реализовать...


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

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

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