Forum: FPGA, VHDL & Co. Optimierung eines Schieberegisters


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Holger K. (holgerkraehe)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.