Hallo,
ich habe hier einen Counter der dem IP Core lpm_counter von Altera
Quartus nachempfunden ist. Dieser zählt 32 Takte runter und setzt beim
Nullübergang ein Flag. Mein Problem sind dabei die LEs. Mein Design
benötigt 13 LEs der IP Core von Altera nur 8 LEs. Ich habe versucht das
Überlauf- Bit für mein Counter = 0 Flag (cout) zu nutzen.
Was könnte ich in meinem Design ändern um LEs zu sparen. Anbei Code mit
TB.
Danke für die Hilfe.
Du hast 2X "-1"-Operation, einmal mit 6 und einmal
mit 7 Bits, macht "13 Bits": Das 2. "-1" wird bei
Dir nur für den Überlauftest verwendet.
Mach mal eine komplette Tabelle mit einem z.B.
2-Bit-Counter + 1 Bit für Überlauf, dann siehst du,
wo man einsparen kann (Hinweis: fang z.B. mit 2^n-1
an zu zählen und zähl runter bis -1 => NEG-Flag
gesetzt).
Hallo,
danke für deine Anwort, ja kann ich theoretisch auch machen würd mir
auch 2 LEs sparen, aber immerhin...
Ich denke man müsste das Überlauf-Bit effizienter nutzen...
Ok, wenn ich dich richtig verstehe, soll ich einen von den zwei Countern
streichen. Diesen bis -1 dekrementieren...und nehme dann das neg Flag
für meinen Nulldurchlauf.
Hallo,
ich habe jetzt für meinen Zähler nur den Ausdruck cnt := ( '0' & cnt )-1
verwendet. Allerdings muss ich meinen zu ladendenden Wert (load) in eine
Variable legen und diese dann zuwweisen...
Kann ich noch was vereinfachen?
Beschreibe mal ganz exakt, was dein Counter können soll.
Also laden mit Flanke oder Pegel von "load"..?
Start mit Flanke oder Pegel von "start"..?
Zählen von 31 Takten und dann im nächsten Takt "overrun" auf High.. oder
sind es 32 Takte und dann "overrun" auf High.
Und wenn du mit Signalen statt Variablen arbeitest, dann bist du auch
gedanklich "näher" an der Hardware :-)
Danke für deine Antwort. Der Counter soll wenn dieser enabled ist 32
Taktzyklen runterzählen und anschließend beim Nulldurchlauf ein Flag
setzen (roll over zero flag). Der Counter soll mit einem festen Wert
geladen werden können, quasi mit den 32 Zyklen. Wenn die 32 Zyklen
runtergezählt sind soll mit dem overrun bit einen Takt lang ein Flag
gesetzt werden. Es passt ja auch alles wunderbar nur ich brauche halt
einfach zu viele LEs im Vergleich zum IP Core von Altera.
chris h. schrieb:> Kann ich noch was vereinfachen?
Es ist idR. besser, einen Zähler hochzählen und mit dem Endwert
vergleichen zu lassen. Hast du das mal probiert?
1
signalcnt:integerrange0to63:=0;
2
3
process(clk,aclr)
4
begin
5
ifaclr='1'then
6
cnt<=0;
7
elsif(rising_edge(clk))then
8
cout<='0';
9
ifload='1'then
10
-- Laden und Zurücksetzen ist das Selbe!?
11
cnt<=0;
12
elsifenable='1'then
13
ifcnt<31then-- sättigender Zähler nötig?
14
cnt<=cnt+1;
15
else
16
cout<='1';
17
endif;
18
endif;
19
endif;
20
endprocess;
21
22
-- Output the current count
23
q<=std_logic_vector(to_unsigned(cnt,6));
BTW:
deine Sensitivliste ist nicht vollständig: aclr fehlt.
Und die Kommentare sind fragwürdig:
Also wenn ich dich richtig verstehe, dann willst du 32 mal zählen und
erst mit dem 33. Takt wird der Überlauf gesetzt und bleibt so lange
gesetzt, bis der counter neu gestartet wird.
Dann würde ich einen Zähler machen, der von 31 auf 0 zählt (oder
andersrum) und mit Erreichen des Vergleichswertes das Overrun-REGISTER.
setzen, welches dann erst einen Takt später seinen Zustand ändert.
Dann hast einen 5-Bit Zähler, der bei erreichen von 0 (oder 31) EINEN
Takt später einen Overrun auslöst.
Danke für deine Antwort. Hochzählen würde genauso funktionieren. Dein
Design benötigt aber auch noch 11 LEs, so wie meines...Hmm, ich habe auf
meinem MAX3000 nur noch 8 LEs frei...
chris h. schrieb:> Ja richtig, nur das mein zero Flag auch nur solange aktiv ist, solange>> der Counter den Wert 0 hat, also genau einen Takt lang.
Also du willst, dass es nur EINEN Takt lang aktiv ist?
also unterbricht auch einen aktiven Zählvorgang? Oder setzt diesen
zurück oder was macht das?
Ist Laden auch ohne Enable erlaubt? Also steuert enable nur das zählen?
Wenn load den Counter zurücksetzt, aber er nicht losläuft, solange
enable nicht aktiv ist. Und ein inaktives enable den Counter ebenfalls
abbricht, dann haben meines Erachtens doch enable und load die gleiche
Funktion, oder nicht?
chris h. schrieb:> nur das Zählen läuft über den enable.
Was soll passieren, wenn das enable weggeht und wieder aktiviert wird?
Soll weitergezählt werden?
Falls ja: woher kommt das enable? Ist das ein asynchrones Signal?
> if ((aclr = '1') or (load = '1')) then> cnt <= "000000";
Obacht: ein kombinatorischer asynchroner Reset. Man sollte genau wissen,
welche Fußanglen da auftauchen können...
Lothar Miller schrieb:> Man sollte genau wissen, welche Fußanglen da auftauchen können...
... darum auch mein Hinweis...
Schlumpf schrieb:> Ist ein bisschen gemurkst
Hallo Zusammen,
falls es noch aktuell ist, hab ich meine Version angehängt.
Weiss zwar nicht wie groß der in einem MAX3000 wird aber funktional
enspricht er deinen Vorgaben.
Vielleicht könnte ihn mal jemand für einen MAX3000 synthetisieren und
Posten wie viel LEs es sind?
Mfg Dennis