Forum: FPGA, VHDL & Co. Konvertieren UNSIGNED zu STD_LOGIC


von Ralph H. (guru)


Lesenswert?

Hallo an die Fachleute :-)

Könnt ihr mir mal fix verraten, wie ich aus einem (UNSIGNED (2 downto 
0)) das Bit 2 als Std_Logic konvertieren kann ? Ich brauch das für ne 
Logikverknüpfung in einem CPLD.
1
 signal  Test : out Std_logic ; 
2
 signal  QD19 : UNSIGNED (2 downto 0);  ist definiert und ich möchte
3
nun dem Ausgang Test nen Wert zuweisen, nach dem Schema..
4
5
Test <= '1' when Wert='1' and QD19(2) = '1' ;  --> das ist aber falsch weil ich ja konvertieren muss
6
7
Test <= '1' when Wert='1' and STD_LOGIC(QD19(2)) = '1' --> hätte ich als richtig angesehen, geht aber nicht !!
8
9
Test <= '1' when Wert='1' and STD_LOGIC_VECTOR(QD19(2)) = '1' -->bringt verständlicherweise nen Fehler

Was mach ich denn falsch ?

Gruß Ralph

von Klaus F. (kfalser)


Lesenswert?

1
Test <= '1' when Wert='1' and QD19(2) = '1' ;  --> das ist aber falsch weil ich ja konvertieren muss
Warum soll das falsch sein?
Unsigned ist (zumindest im package numeric_std) als array von std_logic 
definiert.
QD19(2) ist also ein std_logic.

Übrigens :
Bist Du sicher dass Du nicht
1
Test <= '1' when Wert='1' and QD19(2) = '1' else '0';

möchtest? Sonst gibts ein Latch das nie mehr zurückgesetzt wird.

von Ralph H. (guru)


Lesenswert?

Danke für die schnelle Antwort Klaus !

aaaaaaber... QD19(2)  liefert mir immer in '0' zurück, obgleich es 
Bestandteil eines Zähler ist, der permanent bis 6 zählt und auch nicht 
steht !

Test <= '1' when Wert='1' and QD19(2) = '1' else '0'; liefert immer '0'


Ich möchte gern die Zählerstände 0..3 so auswerten, weil das eben 
QD(2)='0' ist!

Das fehlende "else" war nur hier vergessen ;-)

von Ralph H. (guru)


Lesenswert?

Mal noch ein Hinweis.. Ich nutze diese Bibliotheken hier..

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL ;

von Klaus F. (kfalser)


Lesenswert?

Ralph H. schrieb:
> der permanent bis 6 zählt und auch nicht steht !

Sicher? Dann teste halt mal QD19(2) direkt auszugeben, oder Wert 
auszugeben.
Soviele Möglichkeiten gibts nicht, weil VHDL-mäßig stimmts.

von Ralph H. (guru)


Lesenswert?

Oh shitt... wenn es stimmt und doch nicht geht :-(

Also das hier geht !!
Test  <= '1' when QD19 = 0 else '0' ; --> Zählerstand 0

Das hier geht nicht !! und liefert immer '0' in Test !!

Test <= QD19(2) ;

auch das liefert '0'

Test <= STD_LOGIC(QD19(2)) ;

Mist was mach ich da nur ??

Das hier geht auch... ist aber wohl Ressorcenverschwendend ?

Test  <= '1' when CPU_Zugriff='1' and QD19 < 4 else '0'

von Duke Scarring (Gast)


Lesenswert?

Sag mal, hast Du eine Testbench dazu?

DUke

von Ralph H. (guru)


Lesenswert?

Nein Duke.. das wäre zu aufwendig, weil das Project ansich sehr 
umfangreich ist und im Kern ja geht, nur dieses kleine Detail stört.

von Duke Scarring (Gast)


Lesenswert?

Aha. Und statt dessen murkst Du rum. Ich habe eine Testbench (bzw. 
mehrere), weil meine Projekte umfanreich sind...

Duke

von Ralph H. (guru)


Lesenswert?

Du magst Recht haben Duke... nur frag ich mich was ich murkse, nur weil 
ich keine Testbench hab, bzw. einrichte. Bis vorhin bin ich davon 
ausgegangen, dass ICH irgendwo nen Denkfehler drin hab.

von Ralph H. (guru)


Lesenswert?

Ihr werdet es nicht glauben !! Es war KEIN VHDL Problem! sondern ein 
banales Hardwareproblem.. ne Zinnbrück hat für nen Schluß gesorgt und 
zufälligerweise genau das Testsignal immer verhunzt :)

Danke Euch allen Dir versucht haben, mir zu helfen !! Gruß Ralph

von Duke Scarring (Gast)


Lesenswert?

Ralph H. schrieb:
> Es war KEIN VHDL Problem!
Genau das hättest Du mit einer Testbench gesehen...

Duke

von Ralph H. (guru)


Lesenswert?

Na Duke.. das erklär mir mal, wie ich das hätte sehen sollen !
Ich hab in meinem Projekten für solche Testzwecke Testpins und wenn nun
genau das außen!! nen Schluß hat, dann erkenn ich in der Testbench nur 
das es hätte gehen müssen ! und das wusste ich an sich schon im Beitrag 
001 nach Klaus seiner Antwort. Ich bin sogar überzeugt, das mich die 
Testbenchn noch verrückter gemacht hätte ;-)

Aber dennoch Danke für Deine Hilfe, ich weiß das schon zu schätzen !

Liebe Grüße von Ralph

PS: Das Projekt hat übrigens 39 InputPins und 36 Output Pins... Da macht 
ne Testbench ne Menge Arbeit :)

von Duke Scarring (Gast)


Lesenswert?

Ralph H. schrieb:
> Na Duke.. das erklär mir mal, wie ich das hätte sehen sollen !
Wenn man sieht das die Simulation tut, kann man den Fehler in der 
Synthese oder in der Hardware suchen. Du hast im ersten Beitrag mit 
verschiedenen Beschreibungsvarianten rumprobiert, obwohl Dir die 
Simulation/Testbench sofort gesagt hätte, ob das klappt oder nicht :-(

> Ich hab in meinem Projekten für solche Testzwecke Testpins
Ja und ich habe in meinen Projekten eine Testbench und einen Simulator.
Und solange wie das Design nicht im Simulator läuft, brauche ich es gar 
nicht in den FPGA zu packen...

> PS: Das Projekt hat übrigens 39 InputPins und 36 Output Pins... Da macht
> ne Testbench ne Menge Arbeit :)
WTF?
Im einem meiner aktuellen Projekte nutze ich ca. 200 Pins. Das im 
übrigen noch nicht wirklich viel. Es gibt FPGAs mit > 1000 Pins. Und 
auch dafür würde ich einmal eine Testbench machen. Danach hab ich nicht 
mehr viel Arbeit damit, sondern eher viel Freude...

Duke

von Ralph H. (guru)


Lesenswert?

Hm--über 1000 Pins ?? Wow.. da brauchste ja ewig um alle Signale in der 
Testbench richtig zu definieren und das Ding zum laufen zu bekommen !
Respekt.. aber ich geb auch zu, kein besonders gutes Verhältnis zur 
Testbench zu haben, denn ich hab bisher lieber schnell mal den COde 
geändert.

Ich seh aber schon ein das es bei solch großen Projekten absolut 
unerlässlich ist, den Code erstmal zu testen. Das ist meine kleine 
Grafikkarte einfach ein Baby dagegen.. was übrigens auf Anhieb lief !
Der Fehler trat erst beim Löten bei einer Erweiterung auf !

LG Ralph

von Duke Scarring (Gast)


Lesenswert?

Ralph H. schrieb:
> da brauchste ja ewig um alle Signale in der
> Testbench richtig zu definieren und das Ding zum laufen zu bekommen !

Mit einem guten Editor, der vertikale Blöcke verarbeiten kann, geht es 
eingentlich ziemlich schnell:

Die Entity in die Testbench kopieren:
1
entity top is
2
    port (
3
        -- ==== Pushbuttons (BTN) ====
4
        BTN_EAST        : in    std_logic;
5
        BTN_NORTH       : in    std_logic;
6
        BTN_SOUTH       : in    std_logic;
7
        BTN_WEST        : in    std_logic;
8
        -- ...
Das ganze etwas umformatieren (ich lass in den Instanzierungen immer die 
Definition als Kommentar mit dran):
1
    top_i0: top
2
        port map (
3
            BTN_EAST        => tb_BTN_EAST        , -- : in std_logic;
4
            BTN_NORTH       => tb_BTN_NORTH       , -- : in std_logic;
5
            BTN_SOUTH       => tb_BTN_SOUTH       , -- : in std_logic;
6
            BTN_WEST        => tb_BTN_WEST        , -- : in std_logic;
7
            -- ...
Und fix die Signale definieren:
1
    -- ==== Pushbuttons (BTN) ====
2
    signal   tb_BTN_EAST       : std_logic;
3
    signal   tb_BTN_NORTH      : std_logic;
4
    signal   tb_BTN_SOUTH      : std_logic;
5
    signal   tb_BTN_WEST       : std_logic;
Dann muß man sich noch sinnvolle Stimuli überlegen...
1
    tb_BTN_EAST   <= '0';
2
    tb_BTN_NORTH  <= '0';
3
    tb_BTN_SOUTH  <= '0';
4
    tb_BTN_WEST   <= '0', '1' after 600 us, '0' after 650 us;

Alles in allem nicht wirklich viel Arbeit. (Außer vielleicht Du 
verwendest den ISE-Editor...)

Duke

von Ralph H. (guru)


Lesenswert?

Na das hört sich so leicht bei Dir an hihi.. ich bin ja blutiger Leie 
und hab mir schon Stunden mit der Testbench um die Ohren gehauen, nur um 
dann festzustellen alles geht, nur die Testbench war nicht richtig 
gemacht grins..
Allerdings seh ich das auch als immer gutes Lernen an ! Nur so kann ich 
weiterkommen und mach das auch, aber nicht immer ist Zeit und Lust dazu 
:-)

Machst Du das beruflich hier ?  Ich verkauf ja eher Wertpapiere und muss 
da meine ganze Aufmerksamkeit haben ;) Übrigens gibt da auch sowas wie 
ne Testbench :D

Gruß Ralph

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


Lesenswert?

Duke Scarring schrieb:
> Mit einem guten Editor, der vertikale Blöcke verarbeiten kann, geht es
> eingentlich ziemlich schnell:
Mit der ISE geht es noch schneller:
New Source --> VHDL Testbench -->
Associate Source --> Top-Level-Modul auswählen
und fertig ist der Rahmen...

Dann geht es weiter bei:
> Dann muß man sich noch sinnvolle Stimuli überlegen...

von D. I. (Gast)


Lesenswert?

Testbenches sind was für Weicheier, VHDL ist eh überbewertet und viel zu 
abstrakt.

Der wahre Könner programmiert seine Xilinx Bausteine in XDL (Xilinx 
Description Language)!

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.