VHDL E-Learning

20 posts in this topic

Posted

Hey Leute,

ich hänge beim 3. E-Learning BSP (PWM Generator), könnte mir da vielleicht jemand weiterhelfen? Hab keine Ahnung wie ich das angehen soll.

LG

Share this post


Link to post
Share on other sites

Posted (edited)

*edit, selbst drauf gekommen. bin blöd :P

Edited by Kershak

Share this post


Link to post
Share on other sites

Posted

könnte jemand eine schöne Lösung für Task2 aufladen? :D ich habe es korrekt gelöst aber ich meine es gibt sicher einfachere und elegantere lösungen dazu .....:D

Share this post


Link to post
Share on other sites

Posted (edited)

Hat jemand die Simulation erfolgreich gemacht ? Ich habe das Task 1 richtig  erledigt aber koennte es  nicht simulieren. Glaube, dass das Problem bei meinem Testbench liegt. Wenn jemand sein Testbench posten koennte waere ich ihm sehr dankbar.

Edited by refare

Share this post


Link to post
Share on other sites

Posted

Die Lösung von Task 2

gates_beh.vhdl

1 person likes this

Share this post


Link to post
Share on other sites

Posted

Task 3 mit bzw. 

gif.latex?%5Cbegin%7Baligned%7D%20f_P_W_

Falls jemand Tips and Hints zu Task4, z.B. wie man die Flags macht, feel free to share and help. 

MfG

pwm_beh.vhdl

1 person likes this

Share this post


Link to post
Share on other sites

Posted

Das Digisys-Skriptum ist hilfreich, zumindest fürs Zweierkomplement.

Share this post


Link to post
Share on other sites

Posted

Bei mir war die 4.Angabe  

Addition I1 + I2

• Input operand 1 (I1): 7 bit, unsigned

• Input operand 2 (I2): 6 bit, unsigned

• Output (O): 7 bit, unsigned

• Overflow (V) and Carry flag (C) set accordingly

• Valid flag (VALID): indicates if the computed solution is valid or not 

 

http://www.edaplayground.com/x/VGt   

Die Loesung ist nicht die eleganteste aber es funktioniert. Falls jemand einen eleganteren Weg hat, waere es sehr gut und hilfreich, denw Code zu sehen.

Die Simulation funktioniert auch wenn man C statt g, I1(6) statt h und O statt overflow benutzt und der PLaygroundcompeiler gibt keine Fehlermeldung aus. Gleich ist im Vivado.

Aber wenn ich solcher Code abgebe, kriege ich folgende Fehlermeldungen:

Analyzation of your submitted behavior file failed:
arithmetic_beh.vhdl:21:12: 'o' of mode out can't be in a sensivity list
arithmetic_beh.vhdl:21:14: 'c' of mode out can't be in a sensivity list
arithmetic_beh.vhdl:23:21: port "o" cannot be read
arithmetic_beh.vhdl:24:14: port "c" cannot be read
arithmetic_beh.vhdl:25:23: port "o" cannot be read

.

.

.usw.

Es koennte compilerabhaengig sein, aber sicher weiss ich nicht. Ich soll noch die Literatur gut durchlesen.

Ich habe noch ein paar Fragen.

Hatte jemand Probleme mit Vivado ? Die Simulationen in Vivado kann ich nie richtig starten, obwohl alle meine architetures richtig sind.  

Testbench ist keine Testbench wenn drinnen das Output definiert ist.Oder irre ich mich ? Dafuer sollte sich das architecture kuemmern aber meine Sims. im Vivado funktionieren nur wenn ich die Testbench falsch schreibe also wenn ich in der TB auch mein Output definiere.

In playground funktioniert es schon mit gleichen nur richtig geschriebenen(Kein output im TB) Testbenches. Koennte jemand sein Testbench,die im Vivado funktioniert hat, hier posten?  Es ist nicht wichtig welche Angabe.

Hat jemand eine Angabe mit signed arithmetics bekommen ?

Was wurde whaerend der Vorlesungen und der Uebungen ueber das VHDL-Teil gesagt ? Wie sieht der Pruefung aus ? Ist die Pruefung so wie Tasks konstruiert oder kommt etwas komplexer ?

 

 

Share this post


Link to post
Share on other sites

Posted

[...]

Was wurde whaerend der Vorlesungen und der Uebungen ueber das VHDL-Teil gesagt ? Wie sieht der Pruefung aus ? Ist die Pruefung so wie Tasks konstruiert oder kommt etwas komplexer ?

Das würde mich auch interessieren, falls da jemand mehr Infos hat :)

Share this post


Link to post
Share on other sites

Posted

Schwierigkeitsgrad Task 3 ungefähr...

Share this post


Link to post
Share on other sites

Posted

Task 4 hab ich mir ganz einfach überlegt, und siehe da, es funktioniert:

Wie im beiliegenden pdf drin steht: 

1. The carry flag is set if the addition of two numbers causes a carry out of the most significant (leftmost) bits added. 

1111 + 0001 = 0000 (carry flag is turned on) 

    2. The carry (borrow) flag is also set if the subtraction of two numbers requires a borrow into the most significant (leftmost) bits subtracted. 

   0000 - 0001 = 1111 (carry flag is turned on) 

 
Das heißt 

Für alle Addierer (unsigned):

 if (unsigned(I1)+unsigned(I2))<unsigned(I1) and (unsigned(I1)+unsigned(I2))<unsigned(I2) then

     C <= '1';

 else 

    C <= '0';

end if;

Für alle Subtrahierer (in meinem Fall unsigned, funktioniert bei mir):

    if ((unsigned(I1)-unsigned(I2)) > unsigned(I1)) and ((unsigned(I1)-unsigned(I2)) > unsigned(I2)) then
        C <= '1';
    else
        C <= '0';
    end if;

  1. If the sum of two numbers with the sign bits off yields a result number with the sign bit on, the ”overflow” flag is turned on. 

    0100 + 0100 = 1000 (overflow flag is turned on) 

  2. If the sum of two numbers with the sign bits on yields a result number with the sign bit off, the ”overflow” flag is turned on. 

    1000 + 1000 = 0000 (overflow flag is turned on) 

If you are doing complement (signed) arithmetic, overflow flag on means the answer is wrong - you added two positive numbers and got a negative, or you added two negative numbers and got a positive.If you are doing unsigned arithmetic, the overflow flag means nothing and should be ignored. 

 

Für alle Addierer:

if I1(x)='0' and signed(std_logic_vector(unsigned(I1)+unsigned(I2)))<0 then

    V <= '1';

else

    V <= '0';

end if;

Für alle Subtrahierer (in meinem Fall unsigned, funktioniert bei mir):

if I1(x)='1' and signed(std_logic_vector(unsigned(I1)-unsigned(I2)))>0 then --x ist das höchte Bit von I1
        V <= '1';
    else
        V <= '0';
    end if;

 

Das einzige was ich beim Subtrahierer mache ist den Fall 2. aus der Angabe zu überprüfen, sonst nix. Das MSB von I1 soll 1 sein, das MSB von I2 ist sowieso 1 weil ich ja diese Umwandlung machen muss, von -I2 alles invertieren und 1 dazuaddieren (dann bekomme ich +I2), und da I2 immer kleiner als I1 von der Länge ist, ist das Bit dort auch Null und durch das Invertieren wird es zu 1. Das Ergebis soll Vorzeichenbehaftet (signed()) > 0 sein, dann ist V = 1.

Der Addierer ist genau umgekehrt, da betrachte ich Fall 1.

Hoffe es hilft weiter :)

 

1 person likes this

Share this post


Link to post
Share on other sites

Posted

Und ja, für das das VALID:

hier mein BSP: Subtrahierer, unsigned:

if unsigned(I1) < unsigned(I2) then
        VALID <= '0';
    else
        VALID <= '1'; 
    end if;

und 

O <= std_logic_vector(unsigned(I1)-unsigned(I2));

Share this post


Link to post
Share on other sites

Posted

Kann jemand eine Lösung zum 1. Beispiel hochladen?

Share this post


Link to post
Share on other sites

Posted

library IEEE;
use IEEE.std_logic_1164.all;

architecture behavior of truth_table is

begin

O <= (A and not B and not D) or (A and not B and not C) or (A and not C and not D) or (not A and B and not C and D);

end behavior;

Share this post


Link to post
Share on other sites

Posted

Für die Vereinfachung am Besten das KV-Diagramm (1.Sem: Digitale Systeme) verwenden.

Share this post


Link to post
Share on other sites

Posted

Kann jemand seine VHDL-Lösung von Task 4 hier reinstellen. Hab es gestern noch probiert, u.a. mit den hier im Forum angegeben Codes von Filip_h  jedoch war meine Lösung nicht richtig.  Wahrscheinlich irgendwelche Fehler mit der Einbindung der if-Segmente in den process. Hinsichtlich der Klausur wäre es eine feine Sache  einen funktionierenden Code zu haben. Danke im Voraus.

 

Share this post


Link to post
Share on other sites

Posted

Hallo,

ich habe eine Frage zu Bsp.3, ich blicke da mit meiner Logik nicht durch.

In meinem Programm skaliere ich die 5MHz zu meinen angegebenen 200Hz herunter. Anschließend lasse ich den Counter zum duty_cycle zählen und da soll 1 ausgegeben werden. Ansonsten 0. Trotzdem funktioniert mein Programm nicht, wieso?

library IEEE;
use IEEE.std_logic_1164.all;


architecture behavior of pwm is


signal prescaler: integer range 0 to 250000 := 0;
signal period: integer range 1 to 200 := 1;
signal duty_cycle: integer := 52;
signal counter: integer range 1 to 200 := 1;

begin

pwm_200Hz: process (CLK) begin
    if rising_edge(CLK) then
        prescaler <= prescaler +1;
        if (prescaler = 1) then
            counter <= counter +1;
            if (counter < duty_cycle) then
                O <= '1';
            else 
                O <= '0';
            end if;
        end if;
    end if;
end process pwm_200Hz;


end behavior;

 

Share this post


Link to post
Share on other sites

Posted (edited)

Denke dass dein duty_cycle 52 % von 25000 sein soll. Oder ?

Schau dir die hier gepostete Loesung an. 

Edited by refare

Share this post


Link to post
Share on other sites

Posted

Denke dass dein duty_cycle 52 % von 25000 sein soll. Oder ?

Schau dir die hier gepostete Loesung an. 

Danke für die Mühe einen Fehler zu finden!

Mein duty_cycle soll allerdings 26% der 200Hz betragen, das ergibt 52 (0.26*200)

Ich finde den Denkfehler einfach nicht, beim PIC funktioniert dieses Programm doch auch

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now