Moin Hab mal angefangen mich in Verilog einzuarbeiten und wollte mal damit anfangen ein paar 74LS Bausteine nachzubilden. Soweit hab ich das auch erstmal hinbekommen, hab mir den 74LS83 rausgesucht, ist ein 4Bit Adder mit Carry In und Out. Sieht der Code so in ordnung aus, also kann man das so machen, ohne, dass man später arge Probleme bekommt? Hab halt keine Lust jetzt 10 Bausteine zu machen um dann festzustellen, dass ich irgendwas besser anders gemacht hätte und das dann bei allen umändern darf. Ein paar Sachen stören mich im Moment auch noch, ich hätte zB. gern, das der Ausgang, wenn sich der Eingang ändert, für die 24ns Delay in irgendeinen ungültigen Zustand wechselt. Ich glaub nicht so recht dran, dass die Ausgänge alle zum selben Zeitpunkt auf den neuen Zustand wechseln... Hab im Netz schon nach Beispielmodellen zu den 74LS Bausteinen gesucht, aber leider nix gefunden (nur VHDL).
Also ich hab wirklich keine Ahnung von Verilog, aber Verzögerungen sind zumindest auf einem FPGA so nicht synthetisierbar. Deswegen sag ich jetz einfach mal schlecht. Für Simulationszwecke ist allerdings mehr erlaubt. Warum hast du dich für Verilog entschieden? Für VHDL gäbe es in Deutschland mehr Support.
Ich will es auch erstmal nur zur Simulation einsetzen. Wollte zB. mal 'ne Mikromaschiene mit 74LS... und ROMs aufbauen, und das vorher komplett in Verilog testen und vll noch ein oder 2 Programme schreiben. Verilog hab ich benutzt, weil es scheinbar bessere Linux Programme gibt. Außerdem entspricht es wohl eher meinem Programmierstiel g (bin absoluter C/C++ Verfechter).
@ I_ H. (i_h) >Ich will es auch erstmal nur zur Simulation einsetzen. Wollte zB. mal >'ne Mikromaschiene mit 74LS... und ROMs aufbauen, und das vorher Falscher Ansatz. Mit HDLs in FPGAs kannst und solltest du die 74er schnell vergessen. Du beschreibst Logik wie sie gebraucht wird, NICHT wie sie die 74er bieten. >komplett in Verilog testen und vll noch ein oder 2 Programme schreiben. Auch dabei solltest du die auf synthestisierbaren Code beschränken. Delays haben nur was in Testbenches zu suchen. (Ja, es gibt auch Speichermodelle etc. mit Delays, das ist aber was anderes) >Verilog hab ich benutzt, weil es scheinbar bessere Linux Programme gibt. >Außerdem entspricht es wohl eher meinem Programmierstiel g (bin >absoluter C/C++ Verfechter). Naja, wenn das mal ein gutes Omen ist . . . ;-) MFG Falk
Du hast mich falsch verstanden - ich will das mit richtigen 74LS Bausteinen aufbauen. Hab mir was ausgedacht das mit 7 Steinchen auskommt, und die sollten problemlos auf 2 Steckbretter passen. Icarus Verilog (frei, quelloffen, für Linux) kann zB. sogar synthetisieren, es gibt auch noch andere gute Verilog Sachen für Linux. VHDL ist mir nur ghdl bekannt, das trägt allerdings die Versionsnummr 0.26. Die Linkliste auf der ghdl Seite ist ziemlich aussagekräftig: http://ghdl.free.fr/links.html Da stehen 2 VHDL Simulatoren, aber 6 für Verilog. Die Delays entstehen auch in den 74LS Steinen, also müssen die für eine ordentliche Simulation rein. Die VHDL Models die ich gefunden hab, implementieren auch die Delays.
In Verilog-2000 kannst du die Deklaration der I/Os wahlweise auch direkt in den Modulkopf schreiben. Als C/C++-Verfechter kennst du sicher den Unterschied zwischen K&R- und ANSI-Funktionsköpfen, so ist das hier auch:
1 | module TTL74LS83(input [3:0] A, input [3:0] B, input C0, |
2 | output [3:0] S, output C4); |
Danke, das macht die Sache schonmal übersichtlicher. Ich hab jetzt mal das mit den undefinierten Ausgangszuständen implementiert, jetzt gibt er, wenn sich die Eingangswerte ändern, für 24ns undefiniert aus. So ganz ideal ist es aber nicht, wenn zB. für 5ns irgendwelche anderen Werte anliegen, und danach wieder die ursprünglichen. Kann man die buf Sachen eigentlich kompakter schreiben?
Verilog scheint dafür ein extra Konstrukt anzubieten:
1 | `timescale 1ns / 100ps |
2 | |
3 | module TTL74LS83(input[3:0] A, input[3:0] B, output[3:0] S, input C0, output C4); |
4 | |
5 | wire[4:0] Si=A+B+C0; |
6 | |
7 | assign S[3:0]=Si[3:0]; |
8 | assign C4=Si[4]; |
9 | |
10 | specify |
11 | (C0, A, B *> S) = 24; |
12 | (C0 *> C4) = 17,22; |
13 | (A, B *> C4) = 17; |
14 | endspecify |
15 | |
16 | |
17 | endmodule |
Damit kann man die Delays von allen Eingängen zu allen Ausgängen festlegen, auch getrennt für rise, fall, usw. Mehr als jetzt in dem Code da oben steht, gibt das Datenblatt auch nicht her. Mich wundert allerdings, dass man die Ausgänge während der Zustandsänderung nicht in einen ungültigen Zustand setzen kann. Verilog kennt >100 verschiedene Möglichkeiten Zeitverzögerungen zu spezifizieren, aber das geht scheinbar nicht. obwohl man sogar min, typ und max delays angeben kann (statt 24 zB. 20:24:28).
Wenn es in sieben Steinchen passt, dann sollte es auch in einen kleinen CPLD passen. Nur so als Denkanstoss. Rick
Der Reiz besteht ja aber grad darin, das mit 74LS aufzubauen (zumindest für mich). Außerdem ist eins der 7 Steinchen kein 74LS sondern ein FlashRom, und das wird wohl so ohne weiteres nicht in ein CPLD passen. Vielleicht kommt ja am Ende sowas raus: http://www.mycpu.eu Da ich eigentlich mit Informatik zu tun hab, ist CPU Desing für mich nicht neu, nur die Umsetzung davon (die hat's aber auch in sich). Aber erstmal kommt die Mikromaschine, dann seh ich weiter. Hab das Ding jetzt in Verilog am Laufen, im Moment nur mit 6 Steinchen, es fehlt aber noch ein Multiplexer damit das Ding mehr als nur statische Sprünge kann. Momentan sind auch nur 256 Worte addressierbar, mit einem weiteren 74LS83, 151 und 373 sind's dann aber schon 12 Bit. Früher oder später werd ich mich auch noch mit CPLDs und FPGAs beschäftigen, interessant sind die Dinger auf jeden Fall. Nur die vielen Beinchen...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.