Liebe mikrocontroller Forenbesucher :) Ich bin gerade dabei, aus einem Buch die Sprache VHDL zu erlernen. Eigentlich lief es bis jetzt ziemlich gut nur bin ich gerade auf ein Problem gestoßen, wo mein Wissen hinsichtlich der Digitaltechnik (glaube ich zumindest) nicht mehr ausreicht. Ich bin in dem Buch auf ein Quellcode einer skalierbaren Addier/Subtrahier Einheit gestoßen, wo ich leider nicht alles ganz verstanden habe. Wie im Betreff schon beschrieben, haut es mich beim Carry Bit um. Ich weiß, dass das Carry Bit der Übertrag ist aber in diesem Kontext ist es mir ein Rätsel, wie man in manchen case-abschnitten diese auf '1' setzt. Der Quellcode ist:
1 | use IEEE.std_logic_1164.all; |
2 | use IEEE.std_logic_arith.all; |
3 | entity V_AD_SUB_2 is |
4 | generic (WB : positive := 3); |
5 | port( A_IN ,B_IN : in bit_vector(WB - 1 downto 0); |
6 | OP, CIN : in bit ; |
7 | SUM : out bit_vector(WB - 1 downto 0); |
8 | OV, C_B : out bit); |
9 | end V_AD_SUB_2; |
10 | architecture VECTOR_ADD of V_AD_SUB_2 is |
11 | Signal CIN: bit_vector(0 downto 0); |
12 | begin
|
13 | CIN(0) <= C_IN; |
14 | ADD_SUB: process(OP, CIN, A_IN, B_IN) |
15 | variable ZW, VI, V2, V3 : signed(WB - 1 downto 0); |
16 | variable TEMP : signed( 2 downto 0); |
17 | variable NULL_V : signed(WB - 2 downto 0) |
18 | begin
|
19 | NULL_V := (others => '0'); |
20 | VI := signed(To_StdLogicVector(A_IN(WB - 1 downto 0))); |
21 | V2 := signed(To_StdLogicVector(B_IN(WB - 1 downto 0))); |
22 | V3 := NULL_V & signed(To_StdLogicVector(CIN)); |
23 | if OP = '1' then |
24 | ZW := VI + V2 + V3; |
25 | TEMP := (ZW(WB - 1) , V2 (WB - 1) , VI(WB 1) ) ; |
26 | case TEMP is |
27 | when "001" => C_Β <= '1'; OV <= '0'; |
28 | when "010" => C_Β <= '1'; OV <= '0'; |
29 | when "011" => C_Β <= '0'; OV <= '1'; |
30 | when "100" => C_Β <= '1'; OV <= '1'; |
31 | when "1ll" => C_Β <= '1'; OV <= '0'; |
32 | when others => C_Β <= '0'; OV <= '0'; |
33 | end case; |
34 | else ZW : = VI - V2 - V3; |
35 | TEMP := (ZW(WB - 1) , V2 (WB - 1),VI(WB - 1) ) ; |
36 | case TEMP is |
37 | when "001" => C_Β <= '1'; OV <= '1'; |
38 | when "010" => C_B <= '1'; OV <= '0'; |
39 | when "100" => C_B <= '1'; OV <= '0'; |
40 | when "110" => C_B <= '0'; OV <= '1'; |
41 | when "111" => C_B <= '1'; OV <= '0'; |
42 | when others => C_B <= '0'; OV <= '0'; |
43 | end case; |
44 | end if; |
45 | SUM <= To_bitvector(std_logic_vector(ZW(WB - 1 downto 0))); |
46 | end process ADD_SUB; |
47 | end VECTOR_ADD; |
Das setzen des Overflow Bits verstehe ich nur beim Carry Bit, sowohl bei der Addition als auch bei der Subtraktion ist mir ein Rätsel und ich hoffe ihr könnt mir da weiter helfen. Lg