CPLD: mein erstes Projekt

Zuerst habe ich eine ähnliche Frage im CPLD/FPGA-Benutzerforum gepostet, sie scheinen jedoch nicht so aktiv zu sein wie StackExchange. Ich hoffe also, dass es mir helfen wird, mit CPLDs loszulegen, und dass es auch nützliche Informationen für andere Anfänger sein wird.

Nach ein wenig Recherche war ich überzeugt, mich auf Xilinx CPLDs zu konzentrieren, da es nach Meinung einiger Leute studentenfreundlicher zu sein scheint und der Anbieter kostenlose Software anbietet. Ich habe weder ein Entwicklungsboard noch den Chip - versuche es nur vor dem Kauf erstmal zu simulieren. Nachdem ich also die ISE WebPack- Software heruntergeladen hatte, begann ich mit meinem ersten Tutorial . Ich bin bei Schritt 5 "Implementieren eines neuen Top-Level-Designs" hängen geblieben. Es passt nicht zum Design:

Geben Sie hier die Bildbeschreibung ein

Das Protokoll gibt mir die Antwort auf meinen Fehler, aber ich weiß wirklich nicht, was ich als nächstes tun soll. Obwohl ich alle Schritte aus dem Tutorial befolgt habe, fehlt mir wahrscheinlich etwas? Ich habe versucht, IO im Grundriss zu planen und IO-Pins zuzuweisen, aber es hat nicht geholfen. Irgendwelche Ideen? Irgendwelche anderen guten Tutorials für absolute Anfänger?

Hier ist das Skript:

Geben Sie hier die Bildbeschreibung ein

Die ersten Warnungen tauchten während der Synthese auf und ich vermute, dass sie den Schlüssel enthalten.
Sie könnten den Code für weitere detaillierte Ratschläge posten, aber die Fehlermeldung sagt Ihnen viel - Sie scheinen keine Ausgangsports zu haben, also gibt es letztendlich kein Design, das der Monteur platzieren kann.
@fru1tbat Was soll ich tun, um ein Design zu erstellen? Das sieht das Tutorial nicht vor.

Antworten (2)

Es gibt nichts in der Architektur Ihres Designs, also wird es zu keinen Gates synthetisiert. Ohne Gates ist nichts mit den Ausgangssignalen zu verbinden, daher werden die Ausgangssignale gelöscht. Ebenso werden die Eingangssignale gelöscht, weil sie nichts verbinden. Daher gab es keine Stifte und keine Tore, die in das Design passen mussten. Ich bin mir ziemlich sicher, dass die Warnungen aus dem Syntheseschritt Ihnen dies gesagt hätten.

Ja, du hast recht. Aber was muss ich tun, um Architektur zu schaffen? Kennen Sie ein gutes Tutorial zu CPLDs, das mich durch alle notwendigen Schritte führt, angefangen bei der Erstellung eines Projekts bis hin zur Simulation? Ich kann einfach nicht verstehen, welcher Schritt in dem Tutorial übersprungen wird, auf das ich in meiner Frage verwiesen habe. Anscheinend lässt mich dieser Schritt nicht vorankommen.
Sie müssen den VHDL-Code schreiben, der das gewünschte Verhalten der Hardware beschreibt. Wenn Sie nicht wissen, wie das geht, sollten Sie sich ein wenig von den Design-Tools zurückziehen und sich mit VHDL vertraut machen.
Sollten Pins nicht bleiben, unabhängig davon, ob sie mit irgendeiner Logik verbunden sind oder nicht, da die konfigurierten Optionen auf einem Pin sein elektrisches Verhalten beeinflussen können [z. B. wenn es Buskeeper usw. gibt]? Während die meisten Konfigurationsoptionen das elektrische Verhalten beeinflussen, würde ich nicht erwarten, dass die Syntheselogik diejenigen, die dies tun, von denen unterscheidet, die dies nicht tun.
Die Synthesewerkzeuge versuchen, Ihr Design zu optimieren, es sei denn, Sie hindern sie ausdrücklich daran. Die Optimierung umfasst das Entfernen jeglicher Logik oder Pins, die keinen Einfluss auf die Funktion des Designs haben. Wenn kein Signal an einen Ausgangspin geht, hat der Synthesizer keine Ahnung, was er mit diesem Signal machen soll. Welchen Unterschied macht das elektrische Verhalten, wenn der Logikwert undefiniert ist?
Ja, das Lesen dieses Buches von der ersten bis zur letzten Seite hat geholfen, das Problem zu lösen.

Das Beispielprojekt sollte den richtigen Code enthalten.

Diese Seite weist darauf hin, das Projekt jc2_abl zu öffnen. Dies finden Sie entweder durch Navigieren zu Ihrem ISEExamples-Verzeichnis in Ihrer ISE-Installation (was sie Ihnen empfehlen, finden Sie in <Install Dir>/14.5/ISE_DS/ISE/ISEexamples) oder durch File -> Open Example.

Meine spezielle Installation von ISE hatte kein jc2_abl als Beispiel, aber jc2_vhd, das den vhd-Code für das Beispiel enthält, wurde hier kopiert:

library IEEE;
use IEEE.std_logic_1164.all;            -- defines std_logic types

entity jc2_top is
  port (
    left  : in  std_logic;                     -- Active-low switch #3 (left)
    right : in  std_logic;                     -- Active-low switch #0 (right)
    STOP  : in  std_logic;                     -- Active-low switch #2
    CLK   : in  std_logic;
    Q     : out std_logic_vector (3 downto 0)  -- Active-low LEDs
    );
--To pass pin location constraints from this HDL source file rather than 
--through a User Constraints Format (UCF) file, uncomment the six attribute 
--declarations below and remove jc2_top.ucf from the project.
--    attribute pin_assign : string;
--    attribute pin_assign of clk : signal is "A7";
--    attribute pin_assign of left : signal is "G7";
--    attribute pin_assign of right : signal is "B2";
--    attribute pin_assign of stop : signal is "F2";
--    attribute pin_assign of q : signal is "G5 F6 C6 B4";
end jc2_top;

architecture jc2_top_arch of jc2_top is
  signal DIR   : std_logic                     := '0';     -- Left=1, Right=0
  signal RUN   : std_logic                     := '0';
  signal Q_int : std_logic_vector (3 downto 0) := "0000";  -- Internal signal driving Q output; Active-low LEDs
begin

  process (CLK, right, left, STOP, RUN, DIR, Q_int)
  begin
    if (CLK'event and CLK = '1') then   -- CLK rising edge
      -- DIR register:
      if (right = '0') then
        DIR <= '0';
      elsif (left = '0') then
        DIR <= '1';
      end if;

      -- RUN register:
      if (STOP = '0') then
        RUN <= '0';
      elsif (left = '0' or right = '0') then
        RUN <= '1';
      end if;

      -- Counter section:
      if (RUN = '1') then
        if (DIR = '1') then
          Q_int(3 downto 1) <= Q_int(2 downto 0);  -- Shift lower bits (Left Shift)
          Q_int(0)          <= not Q_int(3);  -- Circulate inverted MSB to LSB
        else
          Q_int(2 downto 0) <= Q_int(3 downto 1);  -- Shift upper bits (Right Shift)
          Q_int(3)          <= not Q_int(0);  -- Circulate inverted LSB to MSB
        end if;
      end if;

    end if;
    Q <= Q_int;
  end process;

end jc2_top_arch;