Ich lese gerade das Buch: "Structured Computer Organisation".
Im Abschnitt "The Digital Logic Level" ist eine 1-Bit ALU beschrieben,
welche ich mal versucht habe in VHDL Nachzubilden (siehe Anhang).
Zur Zeit hat diese auf nem Spartan 3 folgende Werte:
4 Slices / 7 LUTs
Maximum combinational path delay: 12.030ns
Ich frage mich nur, ob man da noch das ganze geschickter beschreiben
kann sodass die Synthese das FPGA besser ausnutzt, meine bisherigen
Versuche das zu minimieren sind leider fehlgeschlagen, aber dass muß ja
nichts heißen.
Da später die ALU kaskadiert wird um größere Bitbreiten zu berechnen
erscheint mir das Delay schon etwas hoch.
> Maximum combinational path delay: 12.030ns
Da streust du dir selber Sand in die Augen:
Wenn du mal einen Takt einführst, und die Eingangs- und Ausgangssignale
taktest, dann siehst du, dass die meiste Zeit in den Eingangs- und
Ausgangs-Pintreibern des FPGAs verplempert wird.
> Da später die ALU kaskadiert wird um größere Bitbreiten zu berechnen> erscheint mir das Delay schon etwas hoch.
In deiner fertigen CPU wirst du mit diesen Signalen aber niemals an die
Pins fahren, sondern diese synchron im FPGA weiterbearbeiten.
Mit dem Code im Anhang sieht das Ganze entspannter aus:
(mit Speedgrade -5)
Und auch an der Beschreibung selber würde ich etwas ändern.
Weg mit den Variablen und ein wenig Concurrent, damit man den MUX
schöner sieht:
1
architectureBehavioralofOneBitAluis
2
signalAV,BV:std_logic;
3
signalSUM:std_logic_vector(1downto0);
4
begin
5
AV<='0'whenENA='0'else
6
notAwhenINVA='1'else
7
A;
8
BV<='0'whenENB='0'else
9
B;
10
MUXout:process(AV,BV,Cin,F)
11
begin
12
Cout<='0';
13
caseFis
14
-- AND
15
when"00"=>Y<=AVANDBV;
16
-- OR
17
when"01"=>Y<=AVORBV;
18
-- NOT B
19
when"10"=>Y<=NOTBV;
20
-- A + B
21
when"11"=>SUM:=("0"&AV)+("0"&BV)+("0"&Cin);
22
Y<=SUM(0);
23
Cout<=SUM(1);
24
whenothers=>Y<='-';
25
endcase;
26
endprocess;
27
endBehavioral;
Und zudem würde ich eher das NUMERIC_STD Package nehmen.
@Lothar Miller: Ich kann nur sagen, das hats gebracht! Da wäre ich nie
drauf gekommen, das das die Ausgangstreiber sind, wieder was gelernt...
Bin jezt für meine 32bit Version aus 1-Bit ALUs von 75ns auf Period 13ns
gekommen, das ist annehmbar, war schon etwas frustriert das dieser
Ansatz so dermaßen fehlgeschlagen war.
Habe auch nochmal ne "native" Version mit std_logic_vector gemacht kom
dort auf kom ich auf 9ns, da kann er wohl noch etwas mehr rausholen.
Hätte dazu aber gleich mal ne Frage:
Minimum period: 9.275ns (Maximum Frequency: 107.817MHz)
Minimum input arrival time before clock: 1.941ns
Maximum output required time after clock: 17.895ns
Maximum combinational path delay: No path found
Was ist den jezt hier die "Laufzeit" meiner ALU/Logic?
Und zu dem Concurrent:
Was für einen Vorteil habe ich dadurch? In meinem Fall hat das
umstellen auf Concurrent nix gebracht was die Laufzeit betrifft, habe
mich aber schon gefragt ob ein Process ohne CLK oder eine Concurrent
Anweisung "besser" ist oder ob ich überhaupt die ganze ALU lieber als
eine Zuweisung versuche zu schreiben...
> Und zu dem Concurrent:> Was für einen Vorteil habe ich dadurch?
1. Es liest sich schöner ;-)
2. Du sparst dir diese (blödsinnigen) Variablen.
3. Wenn du Kombinatorik concurrent schreibst,
mußt du nicht auf irgendwelche Sensitivity-Listen achten.
> Was ist den jezt hier die "Laufzeit" meiner ALU/Logic?
9.275ns - tsu - tcko --> also etwa 8ns, das ist die Zeit, die die
ALU-Kombinatorik braucht.
Alles klar, super dann kann es ja weitergehen :)
Habe jezt meine "große" ALU auch auf Concurrent umgeschrieben, eine
Variable brauch ich aber trozdem für die Flags, wenn ich die auch
COncurrent mache ist das komischerweise langsamer. (Die große ALU hat
ein Negativ und ein Zero Flag).
> ist das komischerweise langsamer.
Sieh dir mal die statische Timinganalyse (Post Place/Route Static
Timing) an, da steht detailliert, welcher Pfad der Flaschenhals im
Design ist.
> INFO:Timing:2698 - No timing constraints found, doing default enumeration.
Wenn du der Toolchain keine Vorgaben machst, dann gibt die sich auch
keine Mühe.
> ... das das ZeroFlag irgenwie ärger macht.> ... clk to PAD 23.030(R)...
Das Ganze ist derzeit eher eine akademische Spielerei. In der realen CPU
wird das Z-Flag sowieso nicht auf ein Pad geführt. Mach dir um die
Laufzeit hier mal keine Gedanken.
Okay, alles klar, dann werd ich mich mal weiter vorarbeitenim CPU Model
und dann sehen wie sich das mit dem Delay entwickelt.
Ich wollte nur von Anfang an bei den "Basics" schon versuchen möglichst
effizient zu arbeiten, man muß ja nicht unütz da Zeit verschenken. :)
Bedanke mich auf jeden fall schonmal.