Forum: FPGA, VHDL & Co. Signale/Variablen nochma


von Detlef _. (detlef_a)


Lesenswert?

Hi,

habe ne Frage zu angehängtem VHDL Code:
erste Warnung sagt "Input <binary_in<6:0>> is never used." .

Das verstehe ich nicht:
binary_in geht zuerst nach hex_src und dann sukzessive in dem loop nach 
bcd, also wird es m.E. doch benutzt ?!

Alles wird gut, wenn ich direkt segment7 zuweise:
segment7 <= hex_src(6 downto 0)

Hat vllt. was mit Variablen/Signalen zu tun, bin da blutiger Anfänger.

Danke
Cheers
Detlef
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use ieee.std_logic_unsigned.all; 
4
entity Binary2bcd is
5
    Port ( binary_in : in  STD_LOGIC_VECTOR (7 downto 0);
6
           sel : in  STD_LOGIC_VECTOR (1 downto 0);
7
           segment7 : out  STD_LOGIC_VECTOR (6 downto 0));
8
end Binary2bcd;
9
10
architecture Behavioral of Binary2bcd is
11
begin
12
13
p1: process (sel, binary_in) is
14
 variable hex_src : std_logic_vector (7 downto 0) ;
15
 variable bcd     : std_logic_vector (11 downto 0) ;
16
 variable act : STD_LOGIC_VECTOR (3 downto 0);
17
 variable ones : STD_LOGIC_VECTOR (3 downto 0);
18
 variable tens : STD_LOGIC_VECTOR (3 downto 0);
19
 variable huns : STD_LOGIC_VECTOR (3 downto 0);
20
begin
21
 hex_src :=  binary_in;
22
 bcd     := (others => '0') ;
23
 for i in 0 to 7 loop
24
            bcd := bcd(11 downto 1) & hex_src(7) ; 
25
            hex_src := hex_src(7 downto 1) & '0' ; 
26
            if bcd(3 downto 0) > "0100" then
27
                bcd(3 downto 0) := bcd(3 downto 0) + "0011" ;
28
            end if ;
29
            if bcd(7 downto 4) > "0100" then
30
                bcd(7 downto 4) := bcd(7 downto 4) + "0011" ;
31
            end if ;
32
            if bcd(11 downto 8) > "0100" then
33
                bcd(11 downto 8) := bcd(11 downto 8) + "0011" ;
34
            end if ;
35
 end loop ;
36
 segment7 <= bcd(6 downto 0);  
37
end process; 
38
end Behavioral;

: Bearbeitet durch Moderator
von Alexander F. (alexf91)


Lesenswert?

Wenn du der Meinung bist, dass das fehlerhaften Verhalten von Variablen 
verursacht wird, dann versuche zuerst, diese zu beseitigen ;)

In diesem Fall sind es aber, soweit ich das bei kurzen drübersehen 
feststellen kann, die Zuweisungen zu bcd und hex_src in der Schleife:
1
bcd := bcd(11 downto 1) & hex_src(7) ;
2
hex_src := hex_src(7 downto 1) & '0';
ist äquivalent zu
1
bcd(0) := hex_src(7);
2
hex_src(0) := '0';

Das wird jetzt zwar mehrmals in der Schleife ausgewertet, verwendet wird 
aber immer nur das 7. Bit von hex_src, die restlichen werden nie 
gelesen.

Wenn du den Vektor als 7 downto 0 deklarierst, dann hat das linke 
Element den Index 7 und das rechte den Index 0.

Wenn du tatsächlich schieben willst, dann muss das so aussehen:
1
vec := '0' & vec(7 downto 1); --Shift nach rechts
2
vec := vec(6 downto 0) & '0'; --Shift nach links

Schreib dir eine Testbench und mach das ganze mit Signalen. In den 
meisten Simulatoren kannst du auch interne Signale untersuchen, da fällt 
dann sofort auf, dass nicht geschoben wird.

: Bearbeitet durch User
von Detlef _. (detlef_a)


Lesenswert?

Hallo,

danke, ja, ich hatte Mist aus dem Netz kopiert ohne es zu verstehen. So 
baut man eine 8-Bit Binärzahl in 3 BCD Zahlen um.
Danke
Cheers
Detlef
1
p1: process (sela, selb, binary_in) is
2
 variable hex_src : std_logic_vector (4 downto 0) ;
3
 variable bcd     : std_logic_vector (11 downto 0) ;
4
 variable act : STD_LOGIC_VECTOR (3 downto 0);
5
 variable ones : STD_LOGIC_VECTOR (3 downto 0);
6
 variable tens : STD_LOGIC_VECTOR (3 downto 0);
7
 variable huns : STD_LOGIC_VECTOR (3 downto 0);
8
 variable sel : STD_LOGIC_VECTOR (1 downto 0);
9
10
begin
11
12
    bcd             := (others => '0') ;
13
    bcd(2 downto 0) := binary_in(7 downto 5) ;
14
    hex_src         := binary_in(4 downto 0) ;
15
    sel             := sela & selb;
16
17
    for i in hex_src'range loop
18
        if bcd(3 downto 0) > "0100" then
19
            bcd(3 downto 0) := bcd(3 downto 0) + "0011" ;
20
        end if ;
21
        if bcd(7 downto 4) > "0100" then
22
            bcd(7 downto 4) := bcd(7 downto 4) + "0011" ;
23
        end if ;
24
        -- No roll over for hundred digit, since in 0 .. 2
25
26
        bcd := bcd(10 downto 0) & hex_src(hex_src'left) ; -- shift bcd + 1
27
new entry
28
        hex_src := hex_src(hex_src'left - 1 downto hex_src'right) & '0' ;
29
-- shift src + pad with 0
30
    end loop ;
31
32
    huns := bcd(11 downto 8);
33
    tens := bcd(7  downto 4);
34
    ones := bcd(3  downto 0);
35
..............................

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Detlef _a schrieb:
> So baut man eine 8-Bit Binärzahl in 3 BCD Zahlen um.
Für ein einzelnes Byte mimmt man evtl. besser ein RAM:
http://www.lothar-miller.de/s9y/archives/33-Byte-nach-BCD.html

Und für breitere Vektoren nimmt man ein weniger ressourcenfressendes 
Verfahren, wenn nicht in jedem Takt eine neue BCD-Zahl nötig ist:
http://www.lothar-miller.de/s9y/archives/34-Vektor-nach-BCD.html

Mehr zu Wandlungen von Vektor nach BCD und ASCII und zurück dort:
http://www.lothar-miller.de/s9y/categories/44-BCD-Umwandlung/P2.html

: Bearbeitet durch Moderator
von Detlef _. (detlef_a)


Lesenswert?

Hallo,

THX für die Hinweise, Deine site ist super als infoquelle. Ja, das ist 
das Shift-Add-3 Verfahren, hab ich noch nicht verstanden, werde ich aber 
tun. Diese 8-Bit Zahl Wandlung zu 3 stellig BCD soll in einem kleinen 
64Bit CPLD laufen, dort macht es 43% der Pterms dicht, kein FF, ist ne 
recht fette kombinatorische Logik.

Cheers
Detlef

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.