Guest User

Untitled

a guest
Dec 13th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.59 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.ALL;
  3. use ieee.numeric_std.ALL;
  4.  
  5. ENTITY full_adder IS
  6.  
  7. PORT(a: IN STD_LOGIC;
  8. b: IN STD_LOGIC;
  9. cin: IN STD_LOGIC;
  10. cout: OUT STD_LOGIC;
  11. y: OUT STD_LOGIC);
  12.  
  13. END full_adder;
  14.  
  15. ARCHITECTURE arch_full_adder of full_adder is
  16. BEGIN
  17. y <= (a xor b) xor cin;
  18. cout <= ((a xor b) and cin) or (a and b);
  19. END arch_full_adder;
  20.  
  21.  
  22.  
  23.  
  24.  
  25. library ieee;
  26. use ieee.std_logic_1164.ALL;
  27. use ieee.numeric_std.ALL;
  28.  
  29. ENTITY serial_adder_subtracter_saturate IS
  30. GENERIC (WIDTH:INTEGER);
  31. PORT(a: IN STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0);
  32. b: IN STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0);
  33. saturate: IN STD_LOGIC;
  34. add_sub: IN STD_LOGIC;
  35. clk: IN STD_LOGIC;
  36. reset: IN STD_LOGIC;
  37. start: IN STD_LOGIC;
  38. y: OUT STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0);
  39. overflow:OUT STD_LOGIC;
  40. finished:OUT STD_LOGIC);
  41. END serial_adder_subtracter_saturate;
  42.  
  43. ARCHITECTURE arch_serial_adder_subtracter_saturate OF serial_adder_subtracter_saturate IS
  44. COMPONENT full_adder IS
  45. PORT(a: IN STD_LOGIC;
  46. b: IN STD_LOGIC;
  47. cin: IN STD_LOGIC;
  48. cout: OUT STD_LOGIC;
  49. y: OUT STD_LOGIC);
  50. END COMPONENT full_adder;
  51.  
  52. SIGNAL filling:STD_LOGIC_VECTOR(WIDTH-2 DOWNTO 0);
  53. SIGNAL overflowed:STD_LOGIC;
  54. SIGNAL MSB:STD_LOGIC;
  55. SIGNAL sat_over:STD_LOGIC;
  56. SIGNAL y_tmp:STD_LOGIC;
  57. SIGNAL tmp_fill:STD_LOGIC_VECTOR(WIDTH-2 DOWNTO 0);
  58. SIGNAL ai:STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0);
  59. SIGNAL bi:STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0);
  60. SIGNAL yi:STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0);
  61. SIGNAL cini:STD_LOGIC;
  62. SIGNAL couti:STD_LOGIC;
  63.  
  64.  
  65. BEGIN
  66.  
  67. full_adder0:COMPONENT full_adder
  68. PORT MAP (a=>ai(0),
  69. b=>bi(0),
  70. cin=>cini,
  71. cout=>couti,
  72. y=>y_tmp);
  73.  
  74. --subtrahera
  75.  
  76. tmp_fill <= (OTHERS=>'0');
  77.  
  78.  
  79. clk_proc:PROCESS(clk) IS
  80. VARIABLE counter:NATURAL:=WIDTH;
  81. BEGIN
  82. IF rising_edge(clk) then
  83. IF reset='1' then
  84. yi <= (OTHERS=>'0');
  85. ai <= (OTHERS=>'0');
  86. bi <= (OTHERS=>'0');
  87. y <= (OTHERS=>'0');
  88. counter:=0;
  89. cini<='0';
  90. finished <='0';
  91.  
  92.  
  93. ELSIF start='1' THEN
  94. ai <= a;
  95. IF add_sub='1' then
  96. bi <= b;
  97. else
  98. bi<=STD_LOGIC_VECTOR(SIGNED(NOT(b)) + SIGNED(tmp_fill & '1'));
  99. end if;
  100. yi <= (OTHERS=>'0');
  101. cini <= '0';
  102. counter :=0;
  103. finished <='0';
  104.  
  105. ELSIF (counter < WIDTH) THEN
  106. ai <= '0' & ai(WIDTH-1 DOWNTO 1);
  107. bi <= '0' & bi(WIDTH-1 DOWNTO 1);
  108. overflowed <= couti XOR cini;
  109. cini <= couti;
  110. counter:=counter + 1;
  111. yi <= y_tmp & yi(WIDTH-1 DOWNTO 1);
  112. ELSE
  113. --overflow
  114. IF (saturate and overflowed and yi(WIDTH-1)) = '1' then -- TO BIG NUMBER, SETS y = 01111111 = 127
  115. y <= (OTHERS=>'1');
  116. y(WIDTH-1)<='0';
  117. ELSIF (saturate and overflowed and NOT(yi(WIDTH-1))) = '1' then -- TO SMALL NUMBER, SETS y = 10000000 = -128
  118. y <= (OTHERS=>'0');
  119. y(WIDTH-1)<='1';
  120.  
  121. ELSE
  122. y<=yi;
  123. END IF;
  124.  
  125. overflow<=overflowed;
  126. counter:=0;
  127. finished<='1';
  128. END IF;
  129. END IF;
  130. END PROCESS clk_proc;
  131.  
  132. END arch_serial_adder_subtracter_saturate;
Add Comment
Please, Sign In to add comment