Forum: FPGA, VHDL & Co. Optimierung eines Schieberegisters


von Holger K. (holgerkraehe)


Lesenswert?

Hallo zusammen

Ich habe 3 Zähler des Typs unsigned(9 to 0)...
Diese möchte ich seriell auslesen können.
Dazu habe ich folgendes Konstrukt gemacht:

SCLK_Int ist das externe Clock signal
MISO ist der Ausgangsport
Shiftcount ist ebenfalls ein Zähler des Typs unsigned.
1
  process(SCLK_Int, SHCLR)
2
  begin
3
    if(rising_edge(SCLK_Int)) then
4
      
5
      if(ShiftCount = "00000") then MISO <= CounterA(0); end if;
6
      if(ShiftCount = "00001") then MISO <= CounterA(1); end if;
7
      if(ShiftCount = "00010") then MISO <= CounterA(2); end if;
8
      if(ShiftCount = "00011") then MISO <= CounterA(3); end if;
9
      if(ShiftCount = "00100") then MISO <= CounterA(4); end if;
10
      if(ShiftCount = "00101") then MISO <= CounterA(5); end if;
11
      if(ShiftCount = "00110") then MISO <= CounterA(6); end if;
12
      if(ShiftCount = "00111") then MISO <= CounterA(7); end if;
13
      if(ShiftCount = "01000") then MISO <= CounterA(8); end if;
14
      if(ShiftCount = "01001") then MISO <= CounterA(9); end if;
15
      
16
      if(ShiftCount = "01010") then MISO <= CounterB(1); end if;
17
      if(ShiftCount = "01011") then MISO <= CounterB(2); end if;
18
      if(ShiftCount = "01100") then MISO <= CounterB(3); end if;
19
      if(ShiftCount = "01101") then MISO <= CounterB(4); end if;
20
      if(ShiftCount = "01110") then MISO <= CounterB(5); end if;
21
      if(ShiftCount = "01111") then MISO <= CounterB(6); end if;
22
      if(ShiftCount = "10000") then MISO <= CounterB(7); end if;
23
      if(ShiftCount = "10001") then MISO <= CounterB(8); end if;
24
      if(ShiftCount = "10010") then MISO <= CounterB(9); end if;
25
      
26
      if(ShiftCount = "10011") then MISO <= CounterR(1); end if;
27
      if(ShiftCount = "10100") then MISO <= CounterR(2); end if;
28
      if(ShiftCount = "10101") then MISO <= CounterR(3); end if;
29
      if(ShiftCount = "10110") then MISO <= CounterR(4); end if;
30
      if(ShiftCount = "10111") then MISO <= CounterR(5); end if;
31
      if(ShiftCount = "11000") then MISO <= CounterR(6); end if;
32
      if(ShiftCount = "11001") then MISO <= CounterR(7); end if;
33
    
34
      ShiftCount <= ShiftCount + 1;
35
      
36
      if(ShiftCount = "11001") then 
37
        ShiftCount <= "00000"; 
38
      end if;        
39
    end if;  
40
    
41
      if(SHCLR = '1') then
42
        ShiftCount <= "00000";  
43
      end if;
44
  end process;

Sieht hier jemand optimierungs potential?
Wegen 4 Makrozellen, müsste ich sonst den grösseren CPLD nehmen.
Abgesehen davon, möchte ich auch noch was lernen, und sehen, ob man dies 
optimieren kann.

Danke

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


Lesenswert?

Holger K. schrieb:
> Optimierung eines Schieberegisters
Das ist kein Schieberegister. Das ist ein Multiplexer.

> Wegen 4 Makrozellen
Von wieviel insgesamt? Weniger als 33 wirst du nicht schaffen. Denn 
soviel brauchen deine 4 Zähler...

von Holger K. (holgerkraehe)


Lesenswert?

Lothar M. schrieb:
> Das ist kein Schieberegister. Das ist ein Multiplexer.

Das ist ein Problem.
Ich habe leider kein Schieberegister hinbekommen.
Wäre froh um Inputs.

Hatte es zuerst noch so versucht:
1
signal CounterA : unsigned(9 downto 0) := "0000000000";
2
signal CounterB : unsigned(9 downto 0) := "0000000000";
3
signal CounterR : unsigned(7 downto 0)  := "00000000";
4
  
5
signal CounterC : unsigned(27 downto 0);
6
7
CounterC <= CounterA & CounterB & CounterR;

Dann wollte ich mit
1
CounterC <= CounterC srl 1;
2
MISO <= CounterC(0);

Schieben uns ausgeben.
Leider kamen da  Errors wie:
1
ERROR:Xst:528 - Multi-source in Unit <main> on signal <CounterB<4>>; this signal is connected to multiple drivers.
2
ERROR:Xst:528 - Multi-source in Unit <main> on signal <CounterB<3>>; this signal is connected to multiple drivers.
3
ERROR:Xst:528 - Multi-source in Unit <main> on signal <CounterB<2>>; this signal is connected to multiple drivers.
4
ERROR:Xst:528 - Multi-source in Unit <main> on signal <CounterB<1>>; this signal is connected to multiple drivers.
5
ERROR:Xst:528 - Multi-source in Unit <main> on signal <CounterB<0>>; this signal is connected to multiple drivers.

Wie du siehst sind nur CounterA und B 10 Bittig, der andere ist 8 Bit.

Lothar M. schrieb:
>> Wegen 4 Makrozellen
> Von wieviel insgesamt? Weniger als 33 wirst du nicht schaffen. Denn
> soviel brauchen deine 4 Zähler...

36 Hätte das CPLD und jetzt sind es halt halt 40.

Ich bin mir noch nicht sicher, ob ich ein CPLD von Altera (Max II Serie) 
oder eines von Xilinx nehmen soll. Da ich gerade erst mit VHDL begonnen 
habe, fehlt es mir an Erfahrung. Mit dem ISE von Xilinx bin ich bisher 
aber recht zufrieden. Die xilinx CPLDs kosten einfach fast das doppelte.

Danke

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


Lesenswert?

Holger K. schrieb:
> 36 Hätte das CPLD und jetzt sind es halt halt 40.
> Ich bin mir noch nicht sicher, ob ich ein CPLD von Altera (Max II Serie)
> oder eines von Xilinx nehmen soll.
Du wirst mit CPLDs ständig an solche Grenzen stoßen.

> Die xilinx CPLDs kosten einfach fast das doppelte.
Ist das relevant? Welche Stückzahlen hast du und wie ist der Preis 
verhandelt?

> Da ich gerade erst mit VHDL begonnen
> habe, fehlt es mir an Erfahrung.
Mein Tipp: CPLDs sind tot, nimm Lattice MachXO2.

> Ich habe leider kein Schieberegister hinbekommen.
Ein Schieberegister ist in VHDL recht einfach beschrieben, aber das 
hilft hier eh nichts, weil Schieberegister nur auf FPGAs elegant zu 
implementieren sind. Denn mit Schieberegister brauchst du jedes 
Zählerbit doppelt: einmal als Zählerregister und einmal im 
Schieberegister.
Beim CPLD ist der Multiplexer eleganter, denn die Mikrowellen können 
eine mächtige Logik abbilden.

> Wie du siehst sind nur CounterA und B 10 Bittig, der andere ist 8 Bit.
Ja, und der Multiplexer-Zähler hat nochmal 5 Bits.

> Leider kamen da  Errors wie:
Klar, weil keinerlei "Ladelogik" für das Schieberegister vorgesehen ist: 
du willst immer gleichzeitig Laden und Schieben. Zeichne dir das mal 
auf.

> Wäre froh um Inputs.
Steig auf FPGAs um. Dann ist Schaltungsbeschreibung mit VHDL tatsächlich 
schön...

von Holger K. (holgerkraehe)


Lesenswert?

Lothar M. schrieb:
>> Die xilinx CPLDs kosten einfach fast das doppelte.
> Ist das relevant? Welche Stückzahlen hast du und wie ist der Preis
> verhandelt?

Nein, ist nicht relevant. Hast du schon recht.

Lothar M. schrieb:
> Mein Tipp: CPLDs sind tot, nimm Lattice MachXO2.

MachX02 sind in der Tat günstige Chips.


Vermutlich werde ich das jetzige Design noch mit den restlichen CPLDs 
machen.
Der XC9572XL-10 lebt übrigens noch etwa 5 Jahre lang.

von Meine Zukunft war gestern (Gast)


Lesenswert?

> Der XC9572XL-10 lebt übrigens noch etwa 5 Jahre lang.

Woher hast du diese Aussage? Xilinx weiß da noch nichts genaues.

von Holger K. (holgerkraehe)


Lesenswert?

Meine Zukunft war gestern schrieb:
>> Der XC9572XL-10 lebt übrigens noch etwa 5 Jahre lang.
>
> Woher hast du diese Aussage? Xilinx weiß da noch nichts genaues.

Der Silicon-Expert hat dies abgeschätzt.

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.