<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fpgakuechle</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fpgakuechle"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Fpgakuechle"/>
	<updated>2026-05-18T04:44:12Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=105250</id>
		<title>Benutzer:Fpgakuechle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=105250"/>
		<updated>2022-06-07T17:07:22Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;end of transmission&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Editoren_und_IDEs&amp;diff=104916</id>
		<title>VHDL Editoren und IDEs</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Editoren_und_IDEs&amp;diff=104916"/>
		<updated>2022-01-10T06:05:27Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Persönliche Meinung gestrichen, zeitliche Einordnung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;VHDL_Editoren_und_IDEs&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Klasse&lt;br /&gt;
! Lizenz&lt;br /&gt;
! Windows&lt;br /&gt;
! Linux&lt;br /&gt;
! Mac&lt;br /&gt;
! Kurzbeschreibung&lt;br /&gt;
! Evaluierung Fazit&lt;br /&gt;
|-&lt;br /&gt;
| [http://notepad-plus-plus.org Notepad++]&lt;br /&gt;
| Editor&lt;br /&gt;
| frei&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
| Unterstützt viele Sprachen, unter anderem auch VHDL und Verilog&lt;br /&gt;
| Sehr vielseitig und intuitiv. &lt;br /&gt;
|-&lt;br /&gt;
| [http://kate-editor.org/ Kate]&lt;br /&gt;
| Editor&lt;br /&gt;
| frei&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| (ja)&lt;br /&gt;
| Unterstützt viele Sprachen, unter anderem auch VHDL und Verilog&lt;br /&gt;
| Sehr vielseitig und intuitiv.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.iis.ee.ethz.ch/~zimmi/emacs/vhdl-mode.html (X)Emacs VHDL Mode]&lt;br /&gt;
| Editor&lt;br /&gt;
| frei&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| Extrem umfangreich, sehr viele automatische Funktionen&lt;br /&gt;
| Emacs kann &amp;quot;alles&amp;quot;, das Einarbeiten ist aber auch entsprechend aufwendig &lt;br /&gt;
|-&lt;br /&gt;
| [http://sourceforge.net/projects/veditor Eclipse Verilog editor]&lt;br /&gt;
| IDE&lt;br /&gt;
| frei&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| Eclipse Plugin&lt;br /&gt;
| TODO&lt;br /&gt;
|-&lt;br /&gt;
| [http://zamiacad.sourceforge.net zamiaCAD]&lt;br /&gt;
| IDE&lt;br /&gt;
| frei&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| Eclipse Plugin, eingebauter Simulator&lt;br /&gt;
| TODO&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.sigasi.com Sigasi]&lt;br /&gt;
| IDE&lt;br /&gt;
| proprietär&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| Eclipse Plugin, eingeschränkte Demoversion verfügbar. Integrierter Syntax Check und VCOM-Anbindung. Kontextsensitives Renaming.&lt;br /&gt;
| Bislang vermutlich die leistungsfähigste VHDL-IDE. Manchmal etwas instabil. Guter Herstellersupport. Ständige Updates.&lt;br /&gt;
|-&lt;br /&gt;
| [http://sourceforge.net/projects/signs/ Signs]&lt;br /&gt;
| IDE&lt;br /&gt;
| frei&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| Eclipse Plugin, obsolete, Vorgänger von zamiaCAD&lt;br /&gt;
| TODO&lt;br /&gt;
|-&lt;br /&gt;
| [http://simplifide.com Simplifide]&lt;br /&gt;
| IDE&lt;br /&gt;
| proprietär&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| Eclipse Plugin, kostenlos verfügbar, Entwicklung eingestellt&lt;br /&gt;
| TODO&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.vide-software.at/ ViDE]&lt;br /&gt;
| IDE&lt;br /&gt;
| proprietär&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
| basiert auf Visual Studio Shell&lt;br /&gt;
| nicht so mächtig wie Sigasi, aber deutlich günstiger&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Forumsthread 2012: [http://www.mikrocontroller.net/topic/264288#new Welche VHDL IDE benutzt ihr?]&lt;br /&gt;
* Weitere IDE: [http://www.vhdplus.com VHDPlus IDE]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.vhdleditor.com VHDL Editors - Verilog Editors]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=104877</id>
		<title>Benutzer:Fpgakuechle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=104877"/>
		<updated>2021-12-12T14:50:11Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Pause&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich lege ab 12/21 eine Pause unbestimmter Länge in der Forumsmitarbeit ein.&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=104026</id>
		<title>Benutzer:Fpgakuechle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=104026"/>
		<updated>2021-02-28T10:40:14Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Erstellte Artikel=&lt;br /&gt;
*[[Raspberry als Universalprogrammer]]&lt;br /&gt;
*[[Hardwarenahe Programmierung am Raspberry Pi]]&lt;br /&gt;
*[[Eigenbau ADC am Raspberry Pi]]&lt;br /&gt;
*[[Durchblicker]] - FPGA Projekt: Interner Logicanalyzer mit Ausgabe an VGA&lt;br /&gt;
*[[PiBla]] - FPGA Projekt: Nachbau des 8 bit controllers Picoblaze als Register-Transfer Level&lt;br /&gt;
*[[Retrocomputing auf FPGA]]&lt;br /&gt;
*[[TTL74185]] - FPGA benchmark, Untersuchung wie gut verschiedenen Beschreibungsformen synthetisierbar sind&lt;br /&gt;
*[[VHDL Code Style und DO-254]] Beispiel für FPGA (VHDL) - Codierrichtlinien aus dem Avionik Umfeld&lt;br /&gt;
&lt;br /&gt;
===Von mir begonnene, inzwischen in der Community stark überarbeitete Artikel===&lt;br /&gt;
*[[Taktung FPGA/CPLD]] - Darstellung der Taktverteilung/-domain/-qualität in FPGA&#039;s&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=102463</id>
		<title>Benutzer:Fpgakuechle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=102463"/>
		<updated>2020-10-25T15:50:12Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Änderung 94726 von Fpgakuechle (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich lege eine Pause in der Forumsarbeit bis Ende 2020 ein.&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=99817</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=99817"/>
		<updated>2018-09-30T14:23:11Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Formatierung, ISBN ergänzt, persönliche Revisionsinfo entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie bei anderen Programmiersprachen, wie z.B. C, existieren auch für [[VHDL]] eine Reihe von Richtlinien, um gut les- und wartbaren Code zu schreiben, der zu stabilen und funktionssicheren Schaltungen führt. Vieles davon ist Geschmackssache sowie Ergebnis firmeninterner Festlegungen, jedoch hat sich auf der Basis von opensource Projekten wie z.B. auf open cores ein gewissen de facto Standard entwickelt. Darüber hinaus existieren inzwischen verschiedene branchenspezifische Standards, die als Vorgabe dienen können. Diese haben teilweise empfehlenden- als auch verpflichtenden Charakter.&lt;br /&gt;
&lt;br /&gt;
In der Luftfahrtbranche gibt es z.B. mit DO-254 einen anerkannten Standard, der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält, sondern auch Methoden zur sicheren Umsetzung von Taktübergängen und FSMs empfiehlt.&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliches zur DO-254==&lt;br /&gt;
Die DO-254 ist die bekannteste Spezifikation zur Zertifizierung komplexer digitaler Schaltungen im Bereich der sogenannten Avionik (Fluggeräte). An solche Schaltungen werden üblicherweise höhere Sicherheitsanforderungen gestellt, als bspw. in der Consumer-Elektronik. Sie entsprechen in vielen Bereichen den Vorgaben, wie sie in der Fahrzeugbranche (Automotive) und der Medizintechnik bekannt sind - gehen aber oftmals auch darüber hinaus. Die Aufwände und Kosten für Simulation, Reviews, etc. steigen im Vergleich zu Designs ohne besondere Sicherheitsanforderungen auch um 50% und mehr. Daher ist es um so wichtiger, bereits in der Designphase auf die erhöhten Anforderungen Rücksicht zu nehmen und mehr in die korrekte Formulierung zu investieren - auch im Hinblick darauf, dass eventuelle Fehler in Tests nicht- oder nur schwerlich erkannt werden können. &lt;br /&gt;
&lt;br /&gt;
Das Grundthema der DO-254 ist die Qualitätssicherung, d.h. die Frage, wie man eine Entwicklung gestalten sollte, sodass das Produkt am Ende des Entwicklungsprozesses das Vertrauen in dessen Funktion rechtfertigt. Deshalb finden sich in der DO auch weniger technische Ratschläge oder Designspezifikationen, sondern vermehrt Methoden und Prozessbeschreibungen, die - in der Entwicklung und Verifikation sinngemäß angewandt - zu einem definierten und akzeptierten Grad an Vertrauen in die Funktionsfähigkeit der Produktes führen.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 beginnt mit der Beschreibung, wie Anforderungen (die sogenannten &amp;quot;requirements&amp;quot;) erfasst, verfeinert und in einem Dokument festgehalten werden sollen. Alle weiteren im Entwicklungsprozess erstellten Dokumente wie Testspezifikation und -ergebnisse verweisen direkt auf diese Requirements.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 war eine der ersten grundlegenden Spezifikationen für digitale Schaltungen und Entwicklungsmethoden, welche auch weitgehende Vorgaben für VHDL und Verilog gemacht hat. Im Umfeld der DO-254 sind damit früh &amp;quot;Ratschläge&amp;quot; für &amp;quot;saubere&amp;quot; Designs entstanden, die auch außerhalb des Avionik-Umfeldes nützlich sein können.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschränkt sich auf die Darstellung der VHDL-Richtlinien wie von der DO-254 usergroup  erarbeitet und in dem Dokument &amp;quot;Best Practice VHDL Coding Standards for DO-254 Programs&amp;quot; aus dem Jahr 2010 festgehalten.&lt;br /&gt;
&lt;br /&gt;
=Aufbau der Richtlinien=&lt;br /&gt;
&lt;br /&gt;
Die designrules sind in 4 Kategorien unterteilt, die Gruppe bestimmt den &lt;br /&gt;
Prefix der Regel. Beispielsweise  SS-10  für die Zehnte Regel in der Kategorie &amp;quot;Safe synthesis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*SS  - Safe Synthesis&lt;br /&gt;
*CP  - Coding Practice&lt;br /&gt;
*CDC - Clock domain Crossing&lt;br /&gt;
*DR  - Code Reviews&lt;br /&gt;
&lt;br /&gt;
Jeder Regel ist ein Schweregrad (severity) zugeordnet:&lt;br /&gt;
&lt;br /&gt;
*Note&lt;br /&gt;
*warning&lt;br /&gt;
*Error&lt;br /&gt;
&lt;br /&gt;
Ja nach Risikograd des designs kann die Einhaltung der Regeln auf einzelne Schweregrade beschrebkt sein. Es ist bei einigen Regeln angegeben das in Einzelfällen Verletzung der Regel in der Schwere herabgestuft (von Error auf Warning) werden kann, wenn diese Fälle entsprechend dokumentiert und begründet werden. &lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
Die Regeln dieser Kategorie stellen sicher, dass ein Kodier-Stil benutzt wird, der auf bewährter Designpraxis im sicherheitskritischen Bereich beruht.&lt;br /&gt;
&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
Entity exa is (dat_i: IN dword);&lt;br /&gt;
Architecture behave of exa is&lt;br /&gt;
 signal m_index : std_logic_vector ( 13 downto 0);&lt;br /&gt;
--..&lt;br /&gt;
 m_index &amp;lt;= dat_i(M_index_lo to m_index_hi);&lt;br /&gt;
end exa; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald diese Fehler bei der Kompilierung entdeckt werden sollte man sie sofort korrigieren.&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide von der Breite eines Vector abhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zuweisung sollte in einer Weise geschehen, dass sie unabhängig von der Bit-Anzahl im Vektor ist.&lt;br /&gt;
Das verringert den Änderungsaufwand bei neuen Vektorbreiten und erleichtert so die Design-Portierung.&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher, dass alle FSM einheitlich codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlicher Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher, dass die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher, dass die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die Sensitivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher, dass Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollten vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
Dieser Abschnitt (der eine einzelne Regel enthält - Anm.d. Autors) behandelt potentielle Probleme in Designs mit mehreren Takt-Domänen und den dadurch entstehenden asynchronen Taktübergängen&lt;br /&gt;
&lt;br /&gt;
===Analysiere alle asynchronen Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat oder in dem interne Takte generiert werden, ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Fehlerhaft realisierte Signalübergänge führen regelmäßig zu undefinierten Signalen und in Einzelfällen zu Metastabilität von Daten. Damit entsteht ein unbestimmtes Schaltungsverhalten, das stark nachteiligen Einfluss auf den Betrieb des Gerät hat. Diese Richtlinie muss hier erwähnt werden, auch wenn die Analyse von Taktübergängen fern des Fokus von VHDL-Code-Style-check-tools und diesem Dokument ist.&lt;br /&gt;
&lt;br /&gt;
Beim Design-Review muss nach möglichen Taktübergängen gesucht werden und wenn diese aufgefunden wurden, nachgewiesen werden, dass diese korrekt synchronisiert wurden. Fehlverhalten durch inkorrekt ausgeführte Taktübergänge sind mit Testläufen an realer Hardware nur extrem schwierig einzugrenzen, deshalb ist die Designanalyse äußerst wichtig. Es ist oft unmöglich, das Fehlverhalten im Debugging-Prozess konsistent zu reproduzieren. Erschwerend kommt die Wirkung von Umgebungseinflüssen während des Betriebes hinzu: unbekannte kapazitive Lasten, die Temperatur des Die&#039;s sowie Potentialschwankungen zB. der Masse. Im schlimmsten Fall zeigt sich der Fehler unter den Testbedingungen nie, sondern nur unter realen Einsatzbedingungen (Flug).&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
Kombinatorische Rückkopplungen verursachen race-conditions und führen so zu nicht vorhersehbaren Verhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel f. Verletzung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
fred_s &amp;lt;= gated_in_s OR pulse_r;  --comb. loop at fred_s&lt;br /&gt;
&lt;br /&gt;
P_GATED_IN: PROCESS(en_i, fred_s, pulse_r)&lt;br /&gt;
BEGIN&lt;br /&gt;
gated_in_s &amp;lt;= fred_s AND en_i;&lt;br /&gt;
IF (en_i = &#039;0&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= NOT(fred_s);&lt;br /&gt;
ELSIF (pulse_r &amp;lt;= &#039;1&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= &#039;0&#039;;&lt;br /&gt;
END IF;&lt;br /&gt;
END PROCESS P_GATED_IN;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechten Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt, dass eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und die synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufriedenstellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher bieten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher, dass alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Alle Register in den designs sollten einen expliziten Resetanschluss haben. Ein Reset-Signal wird benutzt, um ein Gerät in einen determinierten Zustand zu versetzen. Dieses vom system initierte &amp;quot;Error recovery&amp;quot; Kommando wird als letzte Rettungsmöglichkeit für nicht antwortende Systeme benutzt. (&amp;quot;is used as the last resort recovery mechanism for a &lt;br /&gt;
non-responsive device.&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Ausnahmen bspw. synchronizer flops und scan chains sind möglich, sollten aber in jedem einzelnen Fall dokumentiert und begründet (&amp;quot;justify&amp;quot;) werden. Mehrdimensionale signal/register, die als memory implementiert sind, sind von dieser Warning ausgenommen.&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und Latches die nur unbenutzte Logik treiben, müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
Unbenutzte Register, Latches und sonstige Logik sind einfach toter Code. Toter Code  kann nachteilig sein wenn das Design wieder benutzt wird und der tote Code während der Portierung unbeabichtigt aktiv wird. Die Auswirkungen von totem Code bei der Erstellung von Sicherheitskritische Design ist nicht vorhersehbar und kann sich auch deutlich je nach verwendeten Synthese tool, Release-Version und soga Computersystemen unterscheiden. Damit ist eine konsistente Abschätzung der Folgen nicht möglich.&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide tiefe kombinatorische Verschaltungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer, als eine vorgegebene maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Die Ermittlung des kritischen Pfades ist schwieriger, wenn der Pfad viele Hierachie-Ebenen durchquert. Lange kombinatorische Pfad - auch snake paths genannt- können Syntheseprobleme verursachen. Das Projekt-Team sollte eine Obergrenze für die Anzahl von Hierarchie-Ebenen die ein Pfad durchqueren kann festlegen. Jeder längere Pfad soll als Regelverletzung gemeldet werden und an einer passenden Stelle durch Einfügen eines Register verkürzt werden. &lt;br /&gt;
&lt;br /&gt;
Anm. FPGAkuechle: &#039;&#039;Die Regel lautet im Original &amp;quot;Avoid Snake Paths&amp;quot;; allerdings ist im deutschen Sprachgebrauch Schlangenpfad oder ähnliches völlig ungebräuchlich und wurde nicht für die Überschrift übernommen. Kritischer Pfad ist der Pfad zwischen zwei Registern, der die längsten Laufzeit aufweist.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Anm. von J.S.: &#039;&#039;Der Hintergrund des Problems der langen Pfade liegt physikalisch u.a. auch darin, dass mit der Länge und dem Ausmaß von Kombinatorik zwischen zwei Registern die Verletzlichkeit der Information durch Einflüsse wie Strahlung überproportional steigt und damit der Einfluss von Registern, die ein Vergleichen von Werten und somit eine Korrektur mittels Redundanz ermöglichen, relativ reduziert wird. So sind Fehlersimulationen und Testmustermengen weniger gut zu optimieren und praktisch anzuwenden, wenn es um Systemtests oder um system recovery geht. Lange Pfade verschlechtern auch die sogenannte &amp;quot;Fehlerbeobachtbarkeit&amp;quot; im Sinne der Erkennung von &amp;quot;stuck at&amp;quot; - Fehlern in der Produktion. Der gesamte Sachverhalt bezieht sich aber überwiegend auf ASICs. Bei FPGAs ist die Länge eines Pfades allein durch die VHDL-Beschreibung weniger gut bis gar nicht zu kontrollieren. Damit ist die Sinnhaftigkeit der Regel IMO infragegestellt. Man kann zudem beobachten, dass bei FPGAs die Verbindungen (interconnections) insgesamt als solche schon anfällig sind und sich weniger Unterschied durch lange oder kurze Leitungen zeigt, d.h. die Beschreibung kann nur wenig Einfluss auf die Struktur im FPGA nehmen. Umgekehrt kann man bei &amp;quot;langsamen&amp;quot; Schaltungen mit mehr Kombinatorik eine massive Reduzierung von Registerzellen bewirken, die sich als sehr strahlungsanfällig erwiesen haben.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Statements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß- und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Anmerkung von J.S. &#039;&#039;Aus meiner Sicht müsste hier beim Thema FPGA eigentlich der Schweregrad &amp;quot;Error&amp;quot; gesetzt werden, weil eine Unterscheidbarkeit in VHDL so gar nicht gegeben ist. Werden zwei verschiedene Signale oder Variablen so formuliert, wird nur eine erzeugt, was in eine Kollision mündet, die bei Berücksichtigung anderer Programmierregeln - vor allem der Behandlung einer Variablen oder eines Signals in nur einem Prozess - direkt entdeckt wird. Damit darf man das Kritarium aber nicht etwas wegfallen lassen, den unter der Annahme der Nichtbefolgung dieser Regel, z.B. in Testbenches, kann eine unbeabsichtigte Doppelreferenzierung durchaus unentdeckt bleiben und äußert sich dann nur über ein funktionelles Fehlverhalten. Dieses muss aber nicht unbedingt auffallen. Dieser Fall wäre also durch diese Regel mit dem Zusatz &amp;quot;error&amp;quot; grundsätzlich zu vermeiden. Um diese Regel praktisch umzusetzen, empfehlen sich alphabetisch geordnete Variablen- und Signallisten, die man im Rahmen der Code-Dokumentation generiert und bei der solche Doppelbelegungen optisch auffallen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015 ISBN: 978-1482206050&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=94726</id>
		<title>Benutzer:Fpgakuechle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=94726"/>
		<updated>2017-01-02T07:06:27Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Zurück&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomen est omen - meine Spezialität sind FPGA-Designs.&lt;br /&gt;
&lt;br /&gt;
=Erstellte Artikel=&lt;br /&gt;
*[[Raspberry als Universalprogrammer]]&lt;br /&gt;
*[[Hardwarenahe Programmierung am Raspberry Pi]]&lt;br /&gt;
*[[Eigenbau ADC am Raspberry Pi]]&lt;br /&gt;
*[[Durchblicker]] - FPGA Projekt: Interner Logicanalyzer mit Ausgabe an VGA&lt;br /&gt;
*[[PiBla]] - FPGA Projekt: Nachbau des 8 bit controllers Picoblaze als Register-Transfer Level&lt;br /&gt;
*[[Retrocomputing auf FPGA]]&lt;br /&gt;
*[[TTL74185]] - FPGA benchmark, Untersuchung wie gut verschiedenen Beschreibungsformen synthetisierbar sind&lt;br /&gt;
*[[VHDL Code Style und DO-254]] Beispiel für FPGA (VHDL) - Codierrichtlinien aus dem Avionik Umfeld&lt;br /&gt;
&lt;br /&gt;
===Von mir begonnene, inzwischen in der Community stark überarbeitete Artikel===&lt;br /&gt;
*[[Taktung FPGA/CPLD]] - Darstellung der Taktverteilung/-domain/-qualität in FPGA&#039;s&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_-_Die_genaue_Sekunde_/_RTC&amp;diff=93811</id>
		<title>AVR - Die genaue Sekunde / RTC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_-_Die_genaue_Sekunde_/_RTC&amp;diff=93811"/>
		<updated>2016-08-30T18:06:36Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: asm bunt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Oftmals sieht man Projekte, bei denen ein externer RTC-Baustein (engl. &#039;&#039;&#039;R&#039;&#039;&#039;eal &#039;&#039;&#039;T&#039;&#039;&#039;ime &#039;&#039;&#039;C&#039;&#039;&#039;lock, Echtzeituhr; z.&amp;amp;nbsp;B. PCF8583 mit [[I2C]]-Anschluss [http://www-us.semiconductors.philips.com/acrobat/datasheets/PCF8583_5.pdf Datenblatt (PDF)]) angeschlossen ist, ohne dessen Vorteil wirklich zu nutzen.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Vorteile einer externen RTC sind &lt;br /&gt;
# Die Zeitzählung läuft während eines Ausfalls der Hauptstromversorgung über eine kleine Stützbatterie bei geringem Strombedarf weiter.&lt;br /&gt;
# Es gibt hochgenaue RTCs, die man im Gegensatz zu Selbstbaulösungen nicht abgleichen muss.&lt;br /&gt;
# Der Strombedarf eines externen RTC ist in der Regel etwas niedriger als die RTC Funktion eines Prozessors. Als Vergleich diene ein DS1302(300nA@2V) zu einem Mega32(5uA@2.7V) als nicht ganz neuer Vertreter, bzw. ein Mega324P(500nA@1.8V) als moderner Vertreter. Dieser Vorteil kommt bei Datenschreibern (engl. data logger) zum Tragen, welche die meiste Zeit inaktiv im [[Sleep Mode]] sind.&lt;br /&gt;
&lt;br /&gt;
In allen anderen Fällen ist die zusätzliche Hardware nicht unbedingt nötig und man kann eine präzise Zeitbasis bequem mit dem Hauptquarz des Mikrokontrollers programmieren. Daraus ergeben sich sogar noch zusätzliche Vorteile, wie eine geringere Temperaturabhängigkeit und höhere Güte, die Quarze im MHz-Bereich gegenüber Quarzen im kHz-Bereich besitzen. Ich möchte hiermit die Angst vor dem bisschen Mathematik nehmen, welche zur Berechnung der Teilerfaktoren benötigt wird.&lt;br /&gt;
&lt;br /&gt;
==Lösung==&lt;br /&gt;
&lt;br /&gt;
Speziell für den AVR kommen Quarze im Bereich 1MHz bis 20MHz zum Einsatz, d.h. in einer Sekunde werden 1.000.000 bis 20.000.000 Zyklen durchlaufen (Zyklen pro Sekunde = Frequenz). Möchte man eine Sekunde messen, kann man somit die entsprechende Anzahl Zyklen von Null an hochzählen oder von dem entsprechenden Wert bis auf 0 runterzählen. Für das Zählen bietet sich im µC der &amp;quot;Clear on compare match&amp;quot; (CTC) Modus eines Timers an.&lt;br /&gt;
&lt;br /&gt;
Die obigen Zahlen lassen sich jedoch nicht in einer 16 Bit Variablen ausdrücken da sie zu gross sind und somit ist ein direktes Setzen des Compare-Wertes des Timers T1 im AVR nicht möglich. Deshalb unterteilt man die Quarzfrequenz in zwei Faktoren; der erste (Softwareteiler) bestimmt die Anzahl der Interrupts pro Sekunde von Timers T1 und der zweite den Reloadwert von Timer 1, welcher die Anzahl von Timertakten pro Interrupt definiert.&lt;br /&gt;
&lt;br /&gt;
==Beispiel== &lt;br /&gt;
&lt;br /&gt;
Im Beispiel AVR wird ein 11,0592-MHz-Quarz verwendet, was einem üblichen [[Baudratenquarz]] entspricht, d.h. damit können die UART-Standardbaudraten erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Der Softwareteiler wird mit 256 gewählt, d.h. 256 Timerinterrupts pro Sekunde, und kann somit mit nur einem einzigen Byte realisiert werden. Für größere Werte muß der Softwareteiler als int (2 Byte) deklariert werden. Bei kleinen Werten für den Softwareteiler muss man beachten, dass der zweite Faktor immer noch in 2 Byte passt, um als Comparewert für den 16-Bit-Timer 1 verwendet werden zu können. Das wird im unten gezeigten Quelltext automatisch geprüft und ggf. eine Fehlermeldung erzeugt.&lt;br /&gt;
&lt;br /&gt;
Die Timer-[[Interrupt|ISR]] wird in einer Sekunde F_TIMER mal aufgerufen. Mit diesen 256 Hz ergibt sich eine Periodendauer von ca. 4ms, die auch sehr gut zum Entprellen von Tasten benutzt werden kann. Eine Entprellroutine kann also bequem in den Timerinterrupt mit eingefügt werden. Beachten muss man nur noch, dass das Nullsetzen des Timers erst einen Zyklus nach dem Comparematch erfolgt, d.h. eine Periode der ISR ist ORC1A + 1 Timertakte lang.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In diesem Beispiel wird die Zahl 256 in einer 8-Bit Variablen gespeichert. Eigentlich geht das nicht, denn bei der Initialisierung wird die Variable aif 0 gesetzt. Praktisch geht es hier doch, weil eben durch das Dekrementieren die Variable beim nächsten Durchlauf der ISR einen normalen Wert bekommt (arithmetischer Überlauf). Allerdings ist das nicht der beste Programmierstil.&lt;br /&gt;
&lt;br /&gt;
==Berechnung==&lt;br /&gt;
&lt;br /&gt;
Die Berechnung des Comparewertes ist sehr einfach: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
Periodendauer     = 11059200 / 256    = 43200, Rest 0. &lt;br /&gt;
Comparewert OCR1A = Periodendauer - 1 = 43199 (siehe Datenblatt, Timer 1 CTC mode)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da haben wir ja noch mal Glück gehabt, es gibt keinen Rest bei der Division und die Sekunde ist exakt 256 * 43200 = 11059200 Zyklen lang. Theoretisch. Denn selbst wenn auf dem Quarz eine Frequenz von 11,0592 Mhz aufgedruckt ist, so schwingt er doch auf einer etwas anderen Frequenz. Der Grund dafür sind Fertigungstoleranzen und natürlich die Tatsache, dass die Frequenz eines Quarzes auch von der Temperatur abhängig ist. Es gilt also zunächst einmal herauszufinden, auf welcher Frequenz der Quarz wirklich schwingt.&lt;br /&gt;
&lt;br /&gt;
Dazu wird eine Uhr programmiert und mit dem nominalen Wert laufen gelassen. Nun habe ich die Uhr&lt;br /&gt;
exakt einen Tag laufen lassen und festgestellt, dass sie 1,5 s nach geht. Dazu kann man beispielsweise die Tagesschau nutzen, welche jeden Tag um 20:00 (+einer konstanten Zeitverschiebung durch das Übertragungsmedium SAT,DVB-T, ...) beginnt und sogar eine Uhr dabei einblendet. D.h. die Quarzfrequenz beträgt in Wirklichkeit: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
11059200 * (1 - 1,5 / 24 / 60 / 60) = 11059008 Hz. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ausführliche Rechnung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
(Zyklen in 24h - Zyklen Verspätung) / Sekunden pro 24h = korrekte Frequenz&lt;br /&gt;
((24 * 60 * 60 * 256 * 43200) - (1,5 * 256 * 43200)) / (24 * 60 * 60) = 11059008 Hz.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also die ganze Rechnung nochmal: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
Periodendauer     = 11059008 / 256    = 43199, Rest 64.&lt;br /&gt;
Comparewert OCR1A = Periodendauer - 1 = 43198 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nun haben wir einen Rest und es würden uns jede Sekunde 64 Timer-Zyklen fehlen. Das geht natürlich nicht. &lt;br /&gt;
&lt;br /&gt;
Deshalb wird jedesmal, wenn der Softwareteiler Null ist und die Sekunde weitergezählt wird, ein&lt;br /&gt;
anderer Comparewert geladen. Dieser ist dann um den Rest größer. Und beim nächsten Timerinterrupt&lt;br /&gt;
wird dann wieder der Comparewert geladen, der das Ergebnis der Division war. &lt;br /&gt;
&lt;br /&gt;
Es ergeben sich somit: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
255 * (43198 + 1) + 1 * (43198 + 64  + 1) = 11059008 Zyklen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Exakt so, wie wir es wollten.&lt;br /&gt;
&lt;br /&gt;
==Das Programm== &lt;br /&gt;
&lt;br /&gt;
Nachfolgend nun das C-Programm. Da wir ja alle nicht gerne rechnen, lassen wir das einfach den C-Compiler erledigen. D.h. wir brauchen nur noch per Definition für F_CPU den entsprechenden Wert eintragen und der Compiler rechnet alle nötigen Konstanten ganz alleine aus. So ein Compiler ist auch ziemlich faul, der merkt sofort, wenn die Operanden für eine Berechnung alles Konstanten sind. Und ehe er sich damit abquält, extra Code für diese Berechnungen zu erzeugen, rechnet er es lieber selber aus und fügt das Ergebnis direkt in den Code ein. Für den eher seltenen Sonderfall, daß Rest == 0 ist, wird ein Teil des Codes mit #if Rest==0 . . . #endif automatisch entfernt (bedingte Kompilierung mittels Präprozessordirektiven), damit spart man dort minimal CPU-Zeit und Programmspeicher. &lt;br /&gt;
&lt;br /&gt;
Der Assembler kann auch 32-Bit Konstanten-Berechnungen ausführen. Allerdings muß man dann die entsprechenden Präprozessoroperationen benutzen. Man könnte auch eine Divisionsroutine aufrufen, aber dann würde ja echter Code erzeugt. &lt;br /&gt;
&lt;br /&gt;
===Beispiel in C===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*  Die genaue Sekunde / RTC                                            */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*  Erzeugt einen Timerinterrupt mit beliebiger Frequenz                */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*              Author: Peter Dannegger                                 */&lt;br /&gt;
/*                      danni@specs.de                                  */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// hier alles eintragen&lt;br /&gt;
//#define F_CPU      11059201L   // Nominalwert des CPU-Taktes&lt;br /&gt;
#define F_CPU        11059008L   // gemessener Wert, Abweichung -1.5s/d&lt;br /&gt;
#define F_TIMER      256L        // Timer1 ISR-Frequenz&lt;br /&gt;
#define T1_PRESCALER 1           // Hardware-Vorteiler für Timer 1, &lt;br /&gt;
                                 // muss mit der Konfiguratiom übereinstimmen!  &lt;br /&gt;
&lt;br /&gt;
// hier wird alles berechnet&lt;br /&gt;
#define OCRx_RELOAD ((F_CPU / (T1_PRESCALER * F_TIMER)) -1) // Periodendauer pro Interrupt /Timertakte&lt;br /&gt;
                                                            // -1, weil die Timerperiode OCR1x +1 ist&lt;br /&gt;
#define REST         (F_CPU % (T1_PRESCALER * F_TIMER))     // Divisionsrest &lt;br /&gt;
&lt;br /&gt;
#if (OCRx_RELOAD+REST) &amp;gt; 65535&lt;br /&gt;
  #error Überlauf in Timer1! F_TIMER oder T1_PRESCALER erhöhen.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
uint8_t volatile second;         // Sekundenzaehler&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
    static uint8_t prescaler=(uint8_t)F_TIMER;&lt;br /&gt;
&lt;br /&gt;
    if( --prescaler == 0 ) { &lt;br /&gt;
        prescaler = (uint8_t)F_TIMER;&lt;br /&gt;
        second++;                               // eine Sekunde vorueber&lt;br /&gt;
        if( second == 60 ) second = 0;          // eine Minute vorbei    &lt;br /&gt;
#if REST==0&lt;br /&gt;
    }                                           // Sonderfall spart ein wenig Code&lt;br /&gt;
#else                            &lt;br /&gt;
        OCR1A = OCRx_RELOAD + REST;             // Rest behandeln&lt;br /&gt;
    } else {&lt;br /&gt;
        OCR1A = OCRx_RELOAD;                    // OCRx jeweils neu laden&lt;br /&gt;
    }&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
/*          Hier Entprellung für Tasten etc. einfügen                   */&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main( void ) {&lt;br /&gt;
&lt;br /&gt;
    DDRB = 0xFF;      // alles Ausgänge mit LEDs zur Anzeige&lt;br /&gt;
&lt;br /&gt;
    // Timer 1 initialisieren, mode 4, CTC, Vorteiler 1&lt;br /&gt;
    // Periode durch OCR1A definiert&lt;br /&gt;
&lt;br /&gt;
    TCCR1B = (1&amp;lt;&amp;lt;WGM12) | (1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
    OCR1A = OCRx_RELOAD;&lt;br /&gt;
    // OCR1A Interrupt freigeben, wird für Timer CTC mode benutzt&lt;br /&gt;
    TIMSK = 1&amp;lt;&amp;lt;OCIE1A;                  &lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        PORTB = second;  // einfache Anzeige der Sekunden in Binärform&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Beispiel in Assembler===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt; &lt;br /&gt;
;************************************************************************/&lt;br /&gt;
;*                                                                      */&lt;br /&gt;
;*          Precise one second timebase                                 */&lt;br /&gt;
;*                                                                      */&lt;br /&gt;
;*              Author: Peter Dannegger                                 */&lt;br /&gt;
;*                      danni@specs.de                                  */&lt;br /&gt;
;*                                                                      */&lt;br /&gt;
;************************************************************************/&lt;br /&gt;
.nolist&lt;br /&gt;
.include &amp;lt;m8def.inc&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.equ    F_CPU        = 11059008&lt;br /&gt;
.equ    F_TIMER      = 256&lt;br /&gt;
.equ    T1_PRESCALER = 1  ; must be identical to initialisation!&lt;br /&gt;
.equ    ISR_PERIOD   = (F_CPU / (F_TIMER * T1_PRESCALER))&lt;br /&gt;
.equ    REMAINDER    = F_CPU - (ISR_PERIOD * F_TIMER * T1_PRESCALER)&lt;br /&gt;
&lt;br /&gt;
.if (ISR_PERIOD + REMAINDER -1) &amp;gt; 65535&lt;br /&gt;
.error &amp;quot;Timer 1 overflow! Increase F_TIMER or T1_PRESCALER.&amp;quot;&lt;br /&gt;
.endif&lt;br /&gt;
&lt;br /&gt;
.def    isr_sreg   = r15&lt;br /&gt;
.def    isr_tmp    = r17&lt;br /&gt;
.def    tmp        = r16&lt;br /&gt;
.def    prescaler  = r18&lt;br /&gt;
.def    second     = r19&lt;br /&gt;
&lt;br /&gt;
.list&lt;br /&gt;
    rjmp    Reset&lt;br /&gt;
.org    OC1Aaddr&lt;br /&gt;
    rjmp    OC1Aint&lt;br /&gt;
;-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
OC1Aint:&lt;br /&gt;
    in  isr_sreg, sreg&lt;br /&gt;
&lt;br /&gt;
;************************************************************************/&lt;br /&gt;
;*          Insert Key Debouncing Here                                  */&lt;br /&gt;
;************************************************************************/&lt;br /&gt;
&lt;br /&gt;
    dec prescaler&lt;br /&gt;
    brne _oci1&lt;br /&gt;
&lt;br /&gt;
    ldi prescaler, (F_TIMER &amp;amp; 0xFF)&lt;br /&gt;
    inc second&lt;br /&gt;
    cpi second, 60&lt;br /&gt;
    brne _oci3&lt;br /&gt;
&lt;br /&gt;
    ldi second, 0&lt;br /&gt;
_oci3:&lt;br /&gt;
    ldi isr_tmp, high( ISR_PERIOD + REMAINDER - 1 )&lt;br /&gt;
    out ocr1ah, isr_tmp&lt;br /&gt;
    ldi isr_tmp, low( ISR_PERIOD + REMAINDER - 1 )&lt;br /&gt;
    out ocr1al, isr_tmp&lt;br /&gt;
    rjmp _oci2&lt;br /&gt;
&lt;br /&gt;
_oci1:&lt;br /&gt;
    ldi isr_tmp, high( ISR_PERIOD - 1 )&lt;br /&gt;
    out ocr1ah, isr_tmp&lt;br /&gt;
    ldi isr_tmp, low( ISR_PERIOD - 1 )&lt;br /&gt;
    out ocr1al, isr_tmp&lt;br /&gt;
&lt;br /&gt;
_oci2:&lt;br /&gt;
    out sreg, isr_sreg&lt;br /&gt;
    reti&lt;br /&gt;
&lt;br /&gt;
;-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reset:&lt;br /&gt;
    ; Stack initialaisieren&lt;br /&gt;
    ldi tmp, high( ramend )&lt;br /&gt;
    out sph, tmp&lt;br /&gt;
    ldi tmp, low( ramend )&lt;br /&gt;
    out spl, tmp&lt;br /&gt;
&lt;br /&gt;
    ; PORTB auf Ausgang&lt;br /&gt;
    ldi tmp, 0xFF&lt;br /&gt;
    out ddrb, tmp&lt;br /&gt;
&lt;br /&gt;
    ; Timer 1 initialisieren, mode 4, CTC, prescaler 1&lt;br /&gt;
    ldi tmp, 1&amp;lt;&amp;lt;WGM12 | 1&amp;lt;&amp;lt;CS10&lt;br /&gt;
    out TCCR1B, tmp&lt;br /&gt;
    &lt;br /&gt;
    ; Timer 1 Periode = OCR1A +1&lt;br /&gt;
    ldi tmp, high( ISR_PERIOD - 1 )&lt;br /&gt;
    out ocr1ah, tmp&lt;br /&gt;
    ldi tmp, low( ISR_PERIOD - 1 )&lt;br /&gt;
    out ocr1al, tmp&lt;br /&gt;
    out tcnt1l, tmp&lt;br /&gt;
&lt;br /&gt;
    ldi prescaler, (F_TIMER &amp;amp; 0xFF)&lt;br /&gt;
    ldi second, 0&lt;br /&gt;
&lt;br /&gt;
    ; OCR1A Interrupt freigeben&lt;br /&gt;
    ldi tmp, 1&amp;lt;&amp;lt;OCIE1A&lt;br /&gt;
    out TIMSK, tmp&lt;br /&gt;
    sei&lt;br /&gt;
&lt;br /&gt;
main_loop:&lt;br /&gt;
    out PORTB, second&lt;br /&gt;
    rjmp    main_loop&lt;br /&gt;
&lt;br /&gt;
;-------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verbesserte Version mit durchlaufendem Hardwarezähler===&lt;br /&gt;
&lt;br /&gt;
Wird im Timer die Option &amp;quot;Clear On Compare Match&amp;quot; verwendet, so verliert man den Overflow Interrupt. Oder möchte man nebenher noch eine Zeit mit der Input Capture Funktion messen, so benötigt man einen durchlaufenden Timer. Um dies zu erreichen wird OCR1A nicht fest eingestellt sondern bei jedem Aufruf um den gleichen Wert erhöht.&lt;br /&gt;
&lt;br /&gt;
In vorherigen Code wird der Rest auf einmal abgearbeitet. Damit erspart man sich bei jedem Interrupt einen Vergleich und die Verarbeitungszeit verkürzt sich geringfügig. Der Unterschied zwischen kurzem und langem Interrupt ist hier die Anzahl REST Timertakte, welche je nach mathematischer Konstellation zwischen 0 und F_TIMER-1 liegen kann (Divisionsrest, Modulo-Operation). Bei dem nachfolgenden Beispiel wird der Rest gleichmäßig abgearbeitet, d.h. die Resttakte werden gleichmäßig über eine Sekunde verteilt. Der Unterschied zwischen kurzem und langem Interrupt beträgt nur 1 Timertakt. Der Preis dafür ist ein klein wenig mehr CPU-Last im Interrupt und eine zusätzliche 16 Bit Variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*  Die genaue Sekunde / RTC                                            */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*  Erzeugt einen Timerinterrupt mit beliebiger Frequenz                */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/*  verbesserte Version mit durchlaufendem Timer 1                      */&lt;br /&gt;
/*  und gleichmäßiger Verteilung der restlichen Timertakte              */&lt;br /&gt;
/*                                                                      */&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// hier alles einstellen&lt;br /&gt;
//#define F_CPU      11059200L   // Nominalwert des CPU-Taktes&lt;br /&gt;
#define F_CPU        11059008L   // gemessener Wert, Abweichung 1.5s/d&lt;br /&gt;
#define F_TIMER      256L        // Timer 1 ISR-Frequenz&lt;br /&gt;
#define T1_PRESCALER 1           // Hardware-Vorteiler für Timer 1&lt;br /&gt;
                                 // muss mit der Konfiguration übereinstimmen&lt;br /&gt;
&lt;br /&gt;
// hier wird alles berechnet&lt;br /&gt;
#define OCRx_INC     (F_CPU / (T1_PRESCALER * F_TIMER))     // Timertakte pro Interrupt &lt;br /&gt;
#define REST         (F_CPU % (T1_PRESCALER * F_TIMER))     // Divisionsrest &lt;br /&gt;
&lt;br /&gt;
#if (OCRx_INC+1) &amp;gt; 65536&lt;br /&gt;
  #error Überlauf in Timer1! F_TIMER oder T1_PRESCALER erhöhen.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
uint8_t volatile second;         // Sekundenzaehler&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
    static uint8_t prescaler=(uint8_t)F_TIMER;&lt;br /&gt;
&lt;br /&gt;
    if( --prescaler== 0 ) { &lt;br /&gt;
        prescaler= (uint8_t)F_TIMER;&lt;br /&gt;
        second++;                               // eine Sekunde vorueber&lt;br /&gt;
        if( second == 60 ) second = 0;          // eine Minute vorbei                    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
#if REST !=0    &lt;br /&gt;
    static uint16_t restakku;&lt;br /&gt;
&lt;br /&gt;
    restakku += REST;&lt;br /&gt;
    if (restakku &amp;gt;= F_TIMER) {&lt;br /&gt;
        restakku -= F_TIMER;&lt;br /&gt;
        OCR1A += OCRx_INC + 1;      // lange Periode&lt;br /&gt;
    } else {   &lt;br /&gt;
        OCR1A += OCRx_INC;          // kurze Periode&lt;br /&gt;
    }&lt;br /&gt;
#else                               // kein REST&lt;br /&gt;
    OCR1A += OCRx_INC;              // immer kurze Periode&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
/*          Hier Entprellung für Tasten etc. einfügen                   */&lt;br /&gt;
/************************************************************************/&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main( void ) {&lt;br /&gt;
&lt;br /&gt;
    DDRB = 0xFF;      // alles Ausgänge mit LEDs zur Anzeige&lt;br /&gt;
&lt;br /&gt;
    // Timer 1 initialisieren, mode 0, normal, Vorteiler 1&lt;br /&gt;
    TCCR1B = (1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
    OCR1A  = OCRx_INC;&lt;br /&gt;
    // OCR1A Interrupt freigeben&lt;br /&gt;
    TIMSK = 1&amp;lt;&amp;lt;OCIE1A;                  &lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        PORTB = second;  // einfache Anzeige der Sekunden in Binärform&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Durchlaufender Hardwarezähler und fortlaufende Addition===&lt;br /&gt;
&lt;br /&gt;
Gänzlich ohne Hin- und Hertogglen eines Bits kommt man aus, wenn irgendein Timer mit einer Überlauf-Interruptfrequenz &amp;gt; 1Hz arbeitet. Dann kann die ISR eine 32-bit-Konstante auf einen 32-bit-Akkumulator addieren; bei Überlauf ist eine Sekunde vergangen. Zugegeben, es gibt &amp;quot;lange&amp;quot; und &amp;quot;kurze&amp;quot; Sekunden, aber der Fehler summiert sich nicht, und der Code ist sehr einfach.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
Es gibt ein Programm gettick(), das einen Wert holt. Dieser Wert wird von Zeit zu Zeit von der Hardware (Beispiel AVR: der Timer) oder dem Betriebssystem ermittelt. (Beispiel Linux: gettick ruft getmsec, getmsec ruft gettimeofday)&lt;br /&gt;
&lt;br /&gt;
Dieser aufgerufene Wert sollte pro Sekunde um TICKPERSEC erhöht werden, was aber mit einer gewissen Ungenauigkeit geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Laufzeitkorrektur wird dadurch ausgeführt, dass der von gettick() zurückgegebene Wert mit einem Faktor TFAK multipliziert wird. Der Faktor sollte so gewählt werden, dass:&lt;br /&gt;
&lt;br /&gt;
* Das Ergebnis actual_value immer in 32 Bit hineinpasst.&lt;br /&gt;
* Die Multiplikation durch Schiebeopertionen ersetzt werden kann, weil der Faktor eine 2-er-Potenz ist. (Das erledigt avr-gcc)&lt;br /&gt;
&lt;br /&gt;
Immer wenn tsdaytim_calibrated() erkennt, dass eine Sekunde vergangen, wird last_value um die Zahl onesecond erhöht.&lt;br /&gt;
&lt;br /&gt;
Der Zahlenwert onsecond wird mit TICKPERSEC*TFAK initalisiert und kann angezeigt oder neu eingegeben werden (Die Bedienung der seriellen Schnittstelle hierfür ist in diesem Beispiel nicht enthalten).&lt;br /&gt;
&lt;br /&gt;
Wenn festgestellt wird, dass die Uhr pro Zeit (P) um (E) zu schnell geht, dann kann der Wert onsecond korrigiert werden.&lt;br /&gt;
&lt;br /&gt;
c = d *  (P+E)/P&lt;br /&gt;
Beispiel Pro 7 Tage 120 Sekunden zu viel:&lt;br /&gt;
&lt;br /&gt;
7 Tage = 7*86400= 604800 sekunden&lt;br /&gt;
c = 992000000 * (604800+120)/604800=991803175&lt;br /&gt;
Dann wird die Uhr genauer gehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/****************************************************************/&lt;br /&gt;
/* File home/cc/qq/danclock.cpp                                 */&lt;br /&gt;
/*          Precise 1 Second Timebase                           */&lt;br /&gt;
/*                                                              */&lt;br /&gt;
/*      Author: Peter Dannegger / Hjherbert                     */&lt;br /&gt;
/*          danni@specs.de                                      */&lt;br /&gt;
/*                                                              */&lt;br /&gt;
/****************************************************************/&lt;br /&gt;
// Target: atmega8, (2313?)&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
// #include &amp;lt;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#ifndef OCR1A&lt;br /&gt;
#define OCR1A OCR1  // 2313 support&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifndef WGM12&lt;br /&gt;
#define WGM12 CTC1  // 2313 support&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifndef PINC&lt;br /&gt;
#define KEY_INPUT   PIND    // 2313&lt;br /&gt;
#else&lt;br /&gt;
#define KEY_INPUT   PINC    // Mega8&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//#define F_CPU     11059201L   // nominal value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define DIVISOR 256&lt;br /&gt;
&lt;br /&gt;
#define TICKPERSEC  (F_CPU/DIVISOR)&lt;br /&gt;
&lt;br /&gt;
uint8_t volatile second;            // count seconds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TFAK ? TICKPERSEC must not exceed 2^32&lt;br /&gt;
#define TM (0x7FFFFFFFUL/2/TICKPERSEC)  // max of TFAK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define TFAK ( (  (TM&amp;gt;&amp;gt;1) | (TM&amp;gt;&amp;gt;2) | (TM&amp;gt;&amp;gt;3)  | (TM&amp;gt;&amp;gt;4)  | (TM&amp;gt;&amp;gt;5)  | (TM&amp;gt;&amp;gt;6)  | (TM&amp;gt;&amp;gt;7) \&lt;br /&gt;
                | (TM&amp;gt;&amp;gt;8) | (TM&amp;gt;&amp;gt;9) | (TM&amp;gt;&amp;gt;10) | (TM&amp;gt;&amp;gt;11)  | (TM&amp;gt;&amp;gt;12)  | (TM&amp;gt;&amp;gt;13)  | (TM&amp;gt;&amp;gt;14)  | (TM&amp;gt;&amp;gt;15) \&lt;br /&gt;
                | (TM&amp;gt;&amp;gt;16) | (TM&amp;gt;&amp;gt;17) | (TM&amp;gt;&amp;gt;18) | (TM&amp;gt;&amp;gt;19)  | (TM&amp;gt;&amp;gt;20)  | (TM&amp;gt;&amp;gt;21)  | (TM&amp;gt;&amp;gt;22)  | (TM&amp;gt;&amp;gt;23) \&lt;br /&gt;
                | (TM&amp;gt;&amp;gt;24) | (TM&amp;gt;&amp;gt;25) | (TM&amp;gt;&amp;gt;26) | (TM&amp;gt;&amp;gt;27)  | (TM&amp;gt;&amp;gt;28)  | (TM&amp;gt;&amp;gt;29)  | (TM&amp;gt;&amp;gt;30)  | (TM&amp;gt;&amp;gt;31) \&lt;br /&gt;
               ) + 1 )&lt;br /&gt;
// TFAK is a power the biggest power of two which is less than TM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
uint32_t onesecond = 1*TICKPERSEC*TFAK ;    // correct this value if see the clock is late / too fast&lt;br /&gt;
uint32_t last_value ;&lt;br /&gt;
uint32_t ticks ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNAL (SIG_OUTPUT_COMPARE1A)&lt;br /&gt;
{&lt;br /&gt;
    ++ticks ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
uint32_t gettick( void )&lt;br /&gt;
{&lt;br /&gt;
    uint32_t l ;&lt;br /&gt;
    cli();&lt;br /&gt;
    l = ticks ;&lt;br /&gt;
    sei();&lt;br /&gt;
    return l ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void tsdaytim_calibrated(void)&lt;br /&gt;
// Keep the time-of-the-day actual&lt;br /&gt;
// Add a second, if a second if gone&lt;br /&gt;
{&lt;br /&gt;
    uint32_t actual_value ;         // gettick() multiplied by factor 2^n&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    actual_value = gettick() * TFAK ;   // because TFAK is a power of two&lt;br /&gt;
                                        // The compiler will create some shift commands&lt;br /&gt;
&lt;br /&gt;
    if ( actual_value - last_value &amp;gt; onesecond )&lt;br /&gt;
    {                           // once per second&lt;br /&gt;
        if ( ++second &amp;gt;= 60 )&lt;br /&gt;
        {&lt;br /&gt;
            second = 0 ;&lt;br /&gt;
        }&lt;br /&gt;
        last_value += onesecond ;   // One second more&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main( void )&lt;br /&gt;
{&lt;br /&gt;
    DDRB = 0xFF;&lt;br /&gt;
    while( KEY_INPUT &amp;amp; 1 );         // start with key 0 pressed&lt;br /&gt;
&lt;br /&gt;
    TCCR1B = 1&amp;lt;&amp;lt;WGM12^1&amp;lt;&amp;lt;CS10;      // divide by 1&lt;br /&gt;
                                    // clear on compare&lt;br /&gt;
    OCR1A = DIVISOR ;               // Output Compare Register&lt;br /&gt;
    TCNT1 = 0;                      // Timer start value&lt;br /&gt;
    second = 0;&lt;br /&gt;
&lt;br /&gt;
    TIMSK = 1&amp;lt;&amp;lt;OCIE1A;              // beim Vergleichswertes Compare Match&lt;br /&gt;
                                    // Interrupt (SIG_OUTPUT_COMPARE1A)&lt;br /&gt;
    sei();&lt;br /&gt;
    last_value = gettick() * TFAK ;&lt;br /&gt;
    for(;;)&lt;br /&gt;
    {&lt;br /&gt;
        tsdaytim_calibrated();&lt;br /&gt;
        PORTB = second;             // display second (binary)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Echtzeituhr mit Uhrenquarz ==&lt;br /&gt;
&lt;br /&gt;
=== RTC mit wenig Stromverbrauch ===&lt;br /&gt;
&lt;br /&gt;
Das vorgestellte Verfahren ist leider nicht direkt anwendbar, wenn man eine RTC mit einem 32,768 KHz Uhrenquarz realisieren möchte. Dieser Weg ist dann notwendig, wenn der Controller [[Ultra low power | batteriebetrieben]] sehr lange laufen soll und durch Verwendung des [[Sleep Mode]] Strom gespart wird.&lt;br /&gt;
&lt;br /&gt;
=== Begrenzung der Auflösung ===&lt;br /&gt;
&lt;br /&gt;
Wo liegt das Problem? Das obige Verfahren nutzt recht hochfrequente Quarze mit 1 MHz und mehr. Wenn man die Frequenz eines Quarzes von 1 MHz = 1.000.000 Hz mit einer [[Auflösung und Genauigkeit| Auflösung]] von 1 Hz angibt, entspricht das einem maximalen Fehler von 1/1.000.000 oder 1ppm (engl. parts per million, millionstel Teil). Das ist sehr wenig. Eine RTC mit einem Fehler von 1ppm hat eine Gangabweichung von 86,4ms pro Tag, oder 2,5s pro Monat. Das ist ein sehr guter Wert. Wenn ich nun aber die Frequenz 32768 Hz mit 1 Hz Auflösung angebe, ist das schlimmstenfalls ein Fehler von 1/32768 = 30,5ppm, was einer Abweichung von 2,5s pro Tag und 75s pro Monat entspricht!&lt;br /&gt;
&lt;br /&gt;
=== Uhrentakt genau messen und digital korrigieren ===&lt;br /&gt;
&lt;br /&gt;
Wie kann man das Problem lösen? Die AVRs können im [[Sleep Mode]] den Uhrenquarz nur am Timer 2 betreiben, welcher ein 8 Bit Timer ist. D.H. ein Überlauf passiert alle 256 Takte, sprich 7,8125ms (=128 Hz). Man kann auch einen Prescaler verwenden, welcher das Problem aber nicht löst.&lt;br /&gt;
&lt;br /&gt;
Wie bereits festgestellt, müssen wir die Frequenz des 32768Hz Uhrenquarzes genauer messen und darstellen. Wir wollen hier annehmen, dass wir die Frequenz auf 0,001Hz = 1mHz (Millihertz) auflösen, ein guter Frequenzzähler kann das problemlos und ist auch so [[Auflösung und Genauigkeit|&#039;&#039;&#039;genau&#039;&#039;&#039;]]. Wir können beispielsweise feststellen, dass ein Quarz mit 32768,423Hz schwingt, das entspricht einem Fehler von &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F_r=(\frac{f_{ist}}{f_{soll}} -1 )\cdot 10^6=(\frac{32768,423}{32768} -1 )\cdot 10^6=12,9ppm&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, daß diese Messung &#039;&#039;&#039;nicht&#039;&#039;&#039; direkt am Quarz erfolgen darf, auch nicht mit kapazitätsarmen 10:1 Tastköpfen! Denn so ein Quarz wird von kleinsten Kapazitäten im Bereich von weniger als ein pF messbar verstimmt. Darum muss man in so einem Fall den Uhrentakt auf ein anderes IO-Pin ausgeben und dort messen. Beim [[MSP430]] ist das einfach, man kann ACLK auf ein Pin direkt ausgeben. Der [[AVR]] kann das leider nicht. Hier muss man zu einem Trick greifen. Man benutzt die Output Compare Funktion, um mit Timer 2 einen 128 Hz Takt zu erzeugen. Dieser ist fest mit dem Uhrentakt verbunden und kann anstellte dessen gemessen werden, ohne den Quarz zu verstimmen. Die Messung ergibt in diesem Fall eine Frequenz von 128,00165 Hz.&lt;br /&gt;
&lt;br /&gt;
OK, jetzt haben wir den Takt gemessen, wir wissen, daß pro Sekunde 128 Timerüberläufe passieren (Prescaler =1). Wir wissen, dass unser Quarz pro Sekunde um 0,423 Takte zu schnell ist. Wir können aber keine halben Takte mehr oder weniger zählen? Doch! Mit [[Festkommaarithmetik]]! Denn nach 1000s ist unser Quarz um 423 Takte zu weit gelaufen und muss um diese Anzahl zurückgestellt werden. Also könnte man im ersten Ansatz nach 1000 Sekunden den Timer 2 um diesen Betrag korrigieren. Das Problem dabei ist nur, dass der Zähler nur 8 Bit breit ist. Ein Addieren oder Subtrahieren von 423 würde mehrfache Überläufe verursachen, welche programmtechnisch nur schwer zu handhaben wären. Also muss eine etwas bessere Methode her.&lt;br /&gt;
&lt;br /&gt;
=== Bresenham für RTCs ===&lt;br /&gt;
&lt;br /&gt;
Wenn man sich die Idee der [[Festkommaarithmetik]] mal eine Weile durch den Kopf gehen lässt, kommt man vielleicht auf folgende Idee. Der Frequenzfehler beträgt in unserem Beispiel 0,423 Hz, also Takte pro Sekunde. Oder aber 423 Tausendstel Takte pro Sekunde. Nach drei Sekunden sind es schon 1,269 Takte oder 1269 Tausendstel Takte. Moment! &#039;&#039;&#039;Einen&#039;&#039;&#039; Takt können wir korrigieren, indem wir den Zähler um 1 Takt zurück setzen. Den Restfehler von 269 Tausendstel merken wir uns und akkumulieren weiter. Wenn dann wieder die 1000er Marke überschritten wird machen wir das Gleiche. Analog dazu natürlich auch bei negativem Vorzeichen, sprich wenn der Quarz zu langsam schwingt wird er um einen Takt vorgestellt. É Voilà! Dieses Verfahren ist sehr ähnlich zum [http://de.wikipedia.org/wiki/Bresenham-Algorithmus Bresenham-Algorithmus] zum Zeichnen von Linien auf Computermonitoren.&lt;br /&gt;
&lt;br /&gt;
=== Beispielprogramm ===&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel stellt eine RTC mit sehr niedrigem Stromverbrauch zur Verfügung. Laut Datenblatt beträgt die Stromaufnahme nur ca. 6µA bei 3V Versorgungsspannung, besser als einige kommerzielle RTCs! Möglich macht das die Nutzung des Power Save [[Sleep Mode]]s. Die Frequenz kann auf &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; Hz genau abgeglichen werden, was in diesem Fall bei einer Messfrequenz von 128Hz einer Auflösung von 0,078ppm entspricht. Das bedeutet eine Abweichung von 6,7ms pro Tag, 0,2s pro Monat oder 2,46s pro Jahr!&lt;br /&gt;
&lt;br /&gt;
Die Abweichung des Quarzes wird in einer vorzeichenbehafteten 16 Bit Variable in der Einheit &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt; Hz gespeichert. D.h. es kann ein Frequenzfehler von +/- 32,768 Hz korrigiert werden, das sind 1000ppm! Normale Quarze haben Abweichungen von max. 100ppm, meist viel weniger. Jede Sekunde wird der Frequenzfehler neu berechnet und in den darauffolgenden 128 Interrupts ggf. mehrfach korrigiert. Wichtig ist dabei, dass die Korrektur wirklich ganz am Anfang der ISR steht, weil hier das Timing wirklich kritisch ist. Denn innerhalb eines Uhrenquarztaktes von ~30µs muss der Timer 2 neu beschrieben werden. Bei 1 MHz RC-Oszillatortakt sind das nur 30 Takte, wovon 6 zum Aufwachen und 4 zum Anspringen der ISR benötigt werden. Dazu kommen noch das Sichern einiger Register am Anfang der ISR, was man im C nicht direkt sieht. Sicherheitshalber sollte man auch einen höheren Takt einstellen, z.&amp;amp;nbsp;B. 2 MHz, dann ist das Timing wesentlich entspannter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
************************************************************************&lt;br /&gt;
*&lt;br /&gt;
* Stromsparende Echtzeituhr mit 32768Hz Uhrenquarz&lt;br /&gt;
*&lt;br /&gt;
* ATmega88 mit internem 2 MHz Oszillator + 32,768 kHz Quarz&lt;br /&gt;
*&lt;br /&gt;
* Fuses bleiben auf Standardeistellungen&lt;br /&gt;
* LOW Fuse Byte = 0x62&lt;br /&gt;
* HIGH Fuse Byte = 0xDF&lt;br /&gt;
* EXT Fuse Byte = 0xF9&lt;br /&gt;
*&lt;br /&gt;
* LED mit 1K Vorwiderstand an PB5&lt;br /&gt;
* Kalibriertaktausgang an PB3&lt;br /&gt;
************************************************************************&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 2000000L          // Systemtakt in Hz&lt;br /&gt;
#define F_CAL 12800000L         // gemessener Kalibriertakt in 10^-5 Hz&lt;br /&gt;
                                // Endung L ist wichtig!&lt;br /&gt;
&lt;br /&gt;
#define LED_TOGGLE PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/eeprom.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// EEPROM Daten&lt;br /&gt;
&lt;br /&gt;
int16_t ee_rtc_cal EEMEM = (F_CAL-12800000)*256/100;        // Kalibrierung für RTC, Frequenzfehler in 1/1000 Hz&lt;br /&gt;
&lt;br /&gt;
// globale Variablen&lt;br /&gt;
&lt;br /&gt;
// beidseitiger Zugriff durch ISR und Hauptprogramm&lt;br /&gt;
&lt;br /&gt;
volatile uint32_t time;             // 24h Zeitstempel, 1s Auflösung&lt;br /&gt;
volatile int16_t rtc_cal;           // Kalibrierung des 32K Quarzes&lt;br /&gt;
volatile uint8_t flag_1s;           // Flag für 1s Intervall&lt;br /&gt;
&lt;br /&gt;
void long_delay(uint16_t ms) {&lt;br /&gt;
    for (; ms&amp;gt;0; ms--) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (void) {&lt;br /&gt;
&lt;br /&gt;
// Clock divider auf /4&lt;br /&gt;
&lt;br /&gt;
    CLKPR = 0x80;       // update  enable&lt;br /&gt;
    CLKPR = 2;          // Prescaler /4&lt;br /&gt;
&lt;br /&gt;
// IO konfigurieren&lt;br /&gt;
&lt;br /&gt;
    DDRB  = (1&amp;lt;&amp;lt;PB3) | (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
    PORTB = ~((1&amp;lt;&amp;lt;PB3) | (1&amp;lt;&amp;lt;PB5)); // Pull ups &lt;br /&gt;
    PORTC = 0xFF;       &lt;br /&gt;
    PORTD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
// Analogcomparator ausschalten&lt;br /&gt;
&lt;br /&gt;
    ACSR = 0x80;&lt;br /&gt;
&lt;br /&gt;
// Timer2 konfigurieren&lt;br /&gt;
&lt;br /&gt;
    ASSR   = (1&amp;lt;&amp;lt; AS2);             // Timer2 asynchron takten&lt;br /&gt;
    long_delay(1000);               // Einschwingzeit des 32kHz Quarzes&lt;br /&gt;
    TCCR2A = (1&amp;lt;&amp;lt;COM2A1) | (1&amp;lt;&amp;lt;WGM21) | (1&amp;lt;&amp;lt;WGM20); // Fast PWM, non inverted&lt;br /&gt;
    TCCR2B = 1;                     // Vorteiler 1 -&amp;gt; 7,8ms Überlaufperiode&lt;br /&gt;
    OCR2A  = 128;                   // PWM, Tastverhältnis 50%&lt;br /&gt;
    while((ASSR &amp;amp; (1&amp;lt;&amp;lt; TCR2BUB)));  // Warte auf das Ende des Zugriffs&lt;br /&gt;
    TIFR2  &amp;amp;= ~(1&amp;lt;&amp;lt;TOV2);           // Interrupts löschen&lt;br /&gt;
    TIMSK2 |= (1&amp;lt;&amp;lt;TOIE2);           // Timer overflow Interrupt freischalten&lt;br /&gt;
&lt;br /&gt;
// EEPROM Werte auslesen&lt;br /&gt;
&lt;br /&gt;
    rtc_cal= eeprom_read_word(&amp;amp;ee_rtc_cal);&lt;br /&gt;
&lt;br /&gt;
// Interrupts freigeben&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
// Endlose Hauptschleife&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
&lt;br /&gt;
        while((ASSR &amp;amp; (1&amp;lt;&amp;lt; OCR2AUB)));  // Warte auf das Ende des Zugriffs&lt;br /&gt;
        set_sleep_mode(SLEEP_MODE_PWR_SAVE);&lt;br /&gt;
        sleep_mode();                   // in den Schlafmodus wechseln&lt;br /&gt;
&lt;br /&gt;
        // hier wachen wir wieder auf, nach Ausführung des 7,8ms Timerinterupt&lt;br /&gt;
&lt;br /&gt;
        if (flag_1s) {  &lt;br /&gt;
            flag_1s =0;&lt;br /&gt;
            LED_TOGGLE                      // Test&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer2 overflow Interrupt&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER2_OVF_vect) {&lt;br /&gt;
    static uint8_t ticks;               // Hilfsvariable für Messintervall&lt;br /&gt;
    static int16_t time_error;          // RTC Fehlerkompensation&lt;br /&gt;
&lt;br /&gt;
    // Zeitkritische Dinge, welche am Anfang der ISR stehen müssen!&lt;br /&gt;
&lt;br /&gt;
    OCR2A=128;                          // Dummy-Write zur Sicherung des Timings&lt;br /&gt;
                                        // von Timer 2 im asynchronen Modus &lt;br /&gt;
&lt;br /&gt;
    // RTC Fehler korrigieren&lt;br /&gt;
&lt;br /&gt;
    if (time_error&amp;gt;999) {               // RTC zu schnell&lt;br /&gt;
        TCNT2 = 2;                      // Zähler einen Schritt zurück setzen (2 Takte Verzögerung!)&lt;br /&gt;
        time_error -= 1000;&lt;br /&gt;
    } else if (time_error&amp;lt;-999) {       // RTC zu langsam&lt;br /&gt;
        TCNT2 = 4;                      // Zähler einen Schritt vor setzen (2 Takte Verzögerung!)&lt;br /&gt;
        time_error += 1000;     &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // ab hier ist es nicht mehr zeitkritisch&lt;br /&gt;
&lt;br /&gt;
    // Echtzeituhr&lt;br /&gt;
    ticks++;                            // 1/128tel Sekunde&lt;br /&gt;
    if (ticks==128) {                   // Sekundenintervall&lt;br /&gt;
        time_error += rtc_cal;          // RTC Fehler akkumulieren&lt;br /&gt;
&lt;br /&gt;
        // 24h Timer&lt;br /&gt;
        time++;&lt;br /&gt;
        if (time==86400) time=0;        // 24h Überlauf&lt;br /&gt;
&lt;br /&gt;
        ticks=0;&lt;br /&gt;
        flag_1s =1;                     // setzte Flag für 1s Verarbeitung in main Endlosschleife&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weitere Verbesserungen ===&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus ermöglicht eine sehr hochauflösende Kalibrierung der RTC. Allerdings heisst das leider noch lange nicht, daß die RTC dann auch wirklich so genau ist. Denn diese Kalibrierung gilt nur für eine exakte Temperatur! Auch ein Quarz hat eine Temperaturabhängigkeit der Schwingfrequenz. Wenn man nun eine sehr genaue RTC bauen möchte, welche über einen grossen Temperaturbereich genau läuft, muss man periodisch die Temperatur messen und in die Kalibrierung einbeziehen. Einen typischen Temperaturverlauf des Frequenzfehlers zeigt das folgende Bild.&lt;br /&gt;
&lt;br /&gt;
[[bild:rtc_tk.gif|thumb|260px|left|Temperaturgang eines Uhrenquarzes]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin kann man natürlich die Kalibrierung ohne erneutes Kompilieren des Quelltextets vornehmen, indem man den Kalibrierwert per [[UART]] oder [[I2C]] an den AVR sendet und im [[Speicher#EEPROM | EEPROM]] speichert.&lt;br /&gt;
&lt;br /&gt;
Kernpunkt der Kalibrierung ist natürlich die Messung der realen Quarzfrequenz. Die oben beschriebene Methode per Tagesschau und 1 Tag warten ist sehr zeitaufwändig und hat eine begrenzte Genauigkeit von ca. 1/2 Sekunde, das entspricht 5,8ppm. Hier muss zwangsläufig ein guter Frequenzzähler her. Da dieser nicht jedem Hobbybastler zur Verfügung steht, muss man sich in Lehrwerkstätten, Universitäten oder Firmen im Elektronikbereich umsehen und nachfragen, ob man einen Frequenzzähler vor Ort kurze Zeit nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Einige GPS-Module bieten auch einen hochgenauen 1PPS (Pulse Per Second) Ausgang an, der sich für den Abgleich gut heranziehen lässt. Auch das Sekunden-Zeichen eines DCF77-Funkuhr-Moduls ist sehr genau und kann als Referenz dienen.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/Uhr Implementierung einer Uhr mit Siebensegmentausgabe auf einem AVR ATTiny2313]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/165249 Uhr mit genauer Sekunde BASCOM]&lt;br /&gt;
*[https://www.mikrocontroller.net/topic/298306 Stromsparende und günstige Zeitmessung: ATtiny mit Uhrenquarz getaktet]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Projekte]]&lt;br /&gt;
[[Category:Timer und Uhren]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_16-Bit-Register&amp;diff=93810</id>
		<title>AVR 16-Bit-Register</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_16-Bit-Register&amp;diff=93810"/>
		<updated>2016-08-30T17:41:59Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Makros */ Bunt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Allgemeines ===&lt;br /&gt;
&lt;br /&gt;
Speziell bei den &#039;&#039;&#039;16-Bit-Timern&#039;&#039;&#039; und auch beim &#039;&#039;&#039;ADC&#039;&#039;&#039; ist es bei allen Zugriffen auf Datenregister erforderlich, dass diese Daten synchronisiert sind. Wenn z.&amp;amp;nbsp;B. bei einem 16-Bit-Timer das High-Byte des Zählregisters gelesen wurde und vor dem Lesezugriff auf das Low-Byte ein Überlauf des Low-Bytes stattfindet, erhält man einen völlig unsinnigen Wert. Auch die Compare-Register müssen synchron geschrieben werden, da es ansonsten zu unerwünschten Compare-Ereignissen kommen kann. &lt;br /&gt;
&lt;br /&gt;
Beim ADC besteht das Problem darin, dass zwischen den Zugriffen auf die beiden Teilregister eine Wandlung beendet werden kann und der ADC ein neues Ergebnis in ADCL und ADCH schreiben will, wodurch High- und Low-Byte nicht zusammenpassen.&lt;br /&gt;
&lt;br /&gt;
Um diese Datenmüllproduktion zu verhindern, gibt es in beiden Fällen eine Synchronisation, die jeweils durch den Zugriff auf das Low-Byte ausgelöst wird:&lt;br /&gt;
* Bei den Timer-Registern (das gilt für alle TCNT-, OCR- und ICR-Register bei den 16-Bit-Timern) wird bei einem &#039;&#039;&#039;Lesezugriff&#039;&#039;&#039; auf das Low-Byte automatisch das High-Byte in ein temporäres Register, das ansonsten nach außen nicht sichtbar ist, geschoben. Greift man nun &#039;&#039;anschließend&#039;&#039; auf das High-Byte zu, dann wird eben dieses temporäre Register gelesen.&lt;br /&gt;
* Bei einem &#039;&#039;&#039;Schreibzugriff&#039;&#039;&#039; auf eines der genannten Register wird das High-Byte in besagtem temporären Register zwischengespeichert und erst beim Schreiben des Low-Bytes werden &#039;&#039;beide&#039;&#039; gleichzeitig in das eigentliche Register übernommen.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet für die Reihenfolge beim &#039;&#039;&#039;Lesezugriff: Erst Low-Byte, dann High-Byte&#039;&#039;&#039; und für den &#039;&#039;&#039;Schreibzugriff: Erst High-Byte, dann Low-Byte&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Des weiteren ist zu beachten, dass es für all diese 16-Bit-Register nur ein einziges temporäres Register gibt, so dass das Auftreten eines Interrupts, in dessen Handler ein solches Register manipuliert wird, bei einem durch ihn unterbrochenen Zugriff i.d.R. zu Datenmüll führt. &#039;&#039;&#039;16-Bit-Zugriffe sind generell nicht atomar!&#039;&#039;&#039; Wenn mit &#039;&#039;&#039;Interrupts&#039;&#039;&#039; gearbeitet wird, kann es erforderlich sein, vor einem solchen Zugriff auf ein 16-Bit-Register die Interrupt-Bearbeitung zu deaktivieren.&lt;br /&gt;
&lt;br /&gt;
Beim &#039;&#039;&#039;ADC-Datenregister ADCH/ADCL&#039;&#039;&#039; ist die Synchronisierung anders gelöst. Hier wird beim Lesezugriff (ADCH/ADCL sind logischerweise Read-only) auf das Low-Byte ADCL beide Teilregister für Zugriffe seitens des ADC so lange gesperrt, bis das High-Byte ADCH ausgelesen wurde. Dadaurch kann der ADC nach einem Zugriff auf ADCL keinen neuen Wert in ADCH/ADCL ablegen, bis ADCH gelesen wurde. Ergebnisse von Wandlungen, die zwischen einem Zugriff auf ADCL und ADCH beendet werden, gehen verloren!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nach einem Zugriff auf ADCL muss grundsätzlich ADCH gelesen werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim ADC gibt es für den Fall, dass eine Auflösung von 8 Bit ausreicht, die Möglichkeit, das Ergebnis &amp;quot;linksbündig&amp;quot; in ADCH/ADCL auszurichten, so dass die relevanten 8 MSB in ADCH stehen. In diesem Fall muss bzw. sollte nur ADCH ausgelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== Zugriffe in C ===&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen (also sowohl bei den Timern als auch beim ADC) werden von &#039;&#039;&#039;C-Compilern&#039;&#039;&#039; 16-Bit-Pseudo-Register zur Verfügung gestellt (z.&amp;amp;nbsp;B. TCNT1H/TCNT1L &amp;amp;rarr; TCNT1, ADCH/ADCL &amp;amp;rarr; ADC bzw. ADCW), bei deren Verwendung der Compiler automatisch die richtige Zugriffsreihenfolge regelt. &#039;&#039;&#039;In C-Programmen sollten grundsätzlich diese 16-Bit-Register verwendet werden&#039;&#039;&#039;. Sollte trotzdem ein Zugriff auf ein Teilregister erforderlich sein, sind obige Angaben zu berücksichtigen.&lt;br /&gt;
&lt;br /&gt;
Es ist darauf zu achten, dass auch ein Zugriff auf die 16-Bit-Register vom Compiler in zwei 8-Bit-Zugriffe aufgeteilt wird und dementsprechend genauso nicht-atomar ist wie die Einzelzugriffe. Auch hier gilt, dass u.U. die Interrupt-Bearbeitung gesperrt werden muss, um Datenmüll zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
ADC und ADCW sind unterschiedliche Bezeichner für das selbe Registerpaar. Üblicherweise kann man in C-Programmen ADC verwenden, was analog zu den anderen 16-Bit-Registern benannt ist. ADCW (ADC Word) existiert nur deshalb, weil die Headerdateien auch für Assembler vorgesehen sind und es bereits einen Assembler-Befehl namens &#039;&#039;adc&#039;&#039; gibt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makros ===&lt;br /&gt;
&lt;br /&gt;
Um den Zugriff auf diese 16Bit Register zu vereinfachen&lt;br /&gt;
hast ATMEL in der Application Note AVR072 [http://www.atmel.com/dyn/resources/prod_documents/doc1493.pdf] folgende Makros&lt;br /&gt;
zur freien Verwendung vorgeschlagen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR Assembler Macros&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
.macro outw&lt;br /&gt;
  cli&lt;br /&gt;
  out @0, @1&lt;br /&gt;
  out @0-1, @2&lt;br /&gt;
  sei&lt;br /&gt;
.endmacro&lt;br /&gt;
&lt;br /&gt;
.macro inw&lt;br /&gt;
  cli&lt;br /&gt;
  in @1, @2-1&lt;br /&gt;
  in @0, @2&lt;br /&gt;
  sei&lt;br /&gt;
.endmacro&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Usage&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.include “8515def.inc”&lt;br /&gt;
&lt;br /&gt;
inw r17, r16, TCNT1H ; Reads the counter value (high, low, adr)&lt;br /&gt;
outw TCNT1H, r17, r16 ; Writes the counter value (adr, high, low)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IAR C MACROS&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;ina90.h&amp;gt;&lt;br /&gt;
#define outw( ADDRESS, VAL )\&lt;br /&gt;
  {\&lt;br /&gt;
  _CLI();&lt;br /&gt;
  ADDRESS = VAL;\&lt;br /&gt;
  _SEI();\&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
#define inw( ADDRESS, VAL )\&lt;br /&gt;
  {\&lt;br /&gt;
  _CLI();&lt;br /&gt;
  VAL = ADDRESS;\&lt;br /&gt;
  _SEI();\&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Usage&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;io8515.h&amp;gt;&lt;br /&gt;
inw( TCNT1, i ) ;/* Reads the counter value */&lt;br /&gt;
outw( TCNT1, i ) ;/* Writes the counter value */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AVR-Tutorial|AVR 16-Bit-Register]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=93236</id>
		<title>Benutzer:Fpgakuechle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=93236"/>
		<updated>2016-06-15T04:52:54Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: umformuliert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich lege eine Pause in der Forumsarbeit bis Ende 2016 ein, Gründe dort: &lt;br /&gt;
https://www.mikrocontroller.net/topic/399644#new&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=93225</id>
		<title>Benutzer:Fpgakuechle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=93225"/>
		<updated>2016-06-12T05:59:44Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Habe fertig&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich stelle meine Forumsarbeit ein - macht Euren Dreck doch bitte alleine.&lt;br /&gt;
&lt;br /&gt;
MfG,&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90343</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90343"/>
		<updated>2015-11-18T06:20:23Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* VHDL Schreibstil - Coding Practice (CP) */  Erläuterungen detaillierter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-11-09, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie bei &amp;quot;richtigen&amp;quot; Programmiersprachen, wie C, existieren auch für [[VHDL]] Richtlinien, um gut les- und wartbaren Code zu schreiben, der zu stabilen und funktionssicheren Designs führt. Vieles davon ist Geschmackssache, mit der DO-254 gibt es jedoch einen anerkannten Standard, der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält, sondern auch Methoden zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSMs empfiehlt.&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliches zur DO-254==&lt;br /&gt;
Die DO-254 ist die bekannteste Spezifikation zur Zertifizierung komplexer digitaler Schaltungen im Bereich der sogenannten Avionik (Fluggeräte). An solche Schaltungen werden üblicherweise höhere Sicherheitsanforderungen gestellt, als bspw. in der Consumer-Elektronik. Die Aufwände und Kosten für Simulation, Reviews, etc. steigen daher im Vergleich zu Designs ohne besondere Sicherheitsanforderungen auch um 50% und mehr. &lt;br /&gt;
&lt;br /&gt;
Im Umfeld der DO-254 sind aber auch weniger teure &amp;quot;Ratschläge&amp;quot; für &amp;quot;saubere&amp;quot; Designs entstanden, die außerhalb des Avionikumfeldes nützlich sein können.&lt;br /&gt;
&lt;br /&gt;
Das Grundthema der DO-254 ist die Qualitätssicherung, d.h. die Frage, wie man eine Entwicklung gestalten sollte, sodass das Produkt am Ende des Entwicklungsprozesses das Vertrauen in dessen Funktion rechtfertigt. Deshalb finden sich in der DO auch weniger technische Ratschläge oder Designspezifikationen, sondern vermehrt Methoden und Prozessbeschreibungen, die - in der Entwicklung und Verifikation sinngemäß angewandt - zu einem definierten und akzeptierten Grad an Vertrauen in die Funktionsfähigkeit der Produktes führen.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 beginnt mit der Beschreibung, wie Anforderungen (die sogenannten &amp;quot;requirements&amp;quot;) erfasst, verfeinert und in einem Dokument festgehalten werden sollen. Alle weiteren im Entwicklungsprozess erstellten Dokumente wie Testspezifikation und -ergebnisse verweisen direkt auf diese Requirements.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschränkt sich auf die Darstellung der VHDL-Richtlinien wie von der DO-254 usergroup  erarbeitet und in dem Dokument &amp;quot;Best Practice VHDL Coding Standards for DO-254 Programs&amp;quot; aus dem Jahr 2010 festgehalten.&lt;br /&gt;
&lt;br /&gt;
=Aufbau der Richtlinien=&lt;br /&gt;
&lt;br /&gt;
Die designrules sind in 4 Kategorien unterteilt, die Gruppe bestimmt den &lt;br /&gt;
Prefix der Regel. Beispielsweise  SS-10  für die Zehnte Regel in der Kategorie &amp;quot;Safe synthesis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*SS  - Safe Synthesis&lt;br /&gt;
*CP  - Coding Practice&lt;br /&gt;
*CDC - Clock domain Crossing&lt;br /&gt;
*DR  - Code Reviews&lt;br /&gt;
&lt;br /&gt;
Jeder Regel ist ein Schweregrad (severity) zugeordnet:&lt;br /&gt;
&lt;br /&gt;
*Note&lt;br /&gt;
*warning&lt;br /&gt;
*Error&lt;br /&gt;
&lt;br /&gt;
Ja nach Risikograd des designs kann die Einhaltung der Regeln auf einzelne Schweregrade beschrebkt sein. Es ist bei einigen Regeln angegeben das in Einzelfällen Verletzung der Regel in der Schwere herabgestuft (von Error auf Warning) werden kann, wenn diese Fälle entsprechend dokumentiert und begründet werden. &lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
Die Regel dieser Kategoriestellen sicher das ein Kodier-Stil benutzt wird der auf bewährter Designpraxis im Sicherheitskritischen Bereich beruht.&lt;br /&gt;
&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
Entity exa is (dat_i: IN dword);&lt;br /&gt;
Architecture behave of exa is&lt;br /&gt;
 signal m_index : std_logic_vector ( 13 downto 0);&lt;br /&gt;
--..&lt;br /&gt;
 m_index &amp;lt;= dat_i(M_index_lo to m_index_hi);&lt;br /&gt;
end exa; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald diese Fehler bei der Kompilierung entdeckt werden sollte man sie sofort korriegieren.&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide von der Breite eines Vector abhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zuweisung sollte in einer Weise geschehen das sie unabhängig von der bit-Anzahl im Vektor ist.&lt;br /&gt;
Das Verringert den Änderungsaufwand bei neuen Vektorbreiten und erleichter so die Design-Portierung.&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
Dieser Abschnitt (der eine einzelnen Regel enthält - Anm.d. Autors) behandelt potentialle Probleme in Designs mit mehreren Takt-Domainen und asynchronen Taktübergängen&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat oder in dem interne Takte generiert werden ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Fehlerhafte Taktübergänge führen zur Metastabilität und unbestimmten Schaltungsverhalten, die stark nachteilige Einfluß auf den Betrieb des Gerät haben. Diese Richtlinien muß hier erwähnt werden, auch wenn die Analyse von Taktübergänge fern des Fokus von VHDL-Code-Style-check-tools und  diesem Dokument ist.&lt;br /&gt;
&lt;br /&gt;
Beim Design-Review muß nach möglichen Taktübergängen gesucht werden und wenn aufgefunden nachgewiesen werden das diese korrekt einsynchronisiert werden. Fehlverhalten durch inkorrekt ausgeführte Taktübergänge sind mit Testläufen an realer Hardware nur extrem schwierig einzugrenzen, deshalb ist die Designanalyse äußerst wichtig. Es ist oft unmöglich das Fehlverhalten fürs Debugging konsistent zu reproduzieren. Erschwerend kommt der Einfluß von Umgebungseinflußen während des Betriebes hinzu: kapazitive Last, Temperatur des Die&#039;s, Masseprellen. Im schlimmsten Fall zeigt sich der Fehler nie unter normalen Testbedingungen aber unter realen Einsatzbedingungen (Flug).&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
Kombinatorische Rückkopplungen verursachen race-conditions und führen so zu nicht vorhersehbaren Verhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel f. Verletzung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
fred_s &amp;lt;= gated_in_s OR pulse_r;  --comb. loop at fred_s&lt;br /&gt;
&lt;br /&gt;
P_GATED_IN: PROCESS(en_i, fred_s, pulse_r)&lt;br /&gt;
BEGIN&lt;br /&gt;
gated_in_s &amp;lt;= fred_s AND en_i;&lt;br /&gt;
IF (en_i = &#039;0&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= NOT(fred_s);&lt;br /&gt;
ELSIF (pulse_r &amp;lt;= &#039;1&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= &#039;0&#039;;&lt;br /&gt;
END IF;&lt;br /&gt;
END PROCESS P_GATED_IN;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt das eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufrieden stellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher biten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Alle Register in den design sollten einen expliziten Reset haben. Ein Reset-Signal wird benutzt um ein Geröt in einen determinierten Zustand zu versetzen. Dieses vom system initierte &amp;quot;Error recovery&amp;quot; Kommando wird als letzte Rettungsmöglochkeit für nicht antwortende systzem benutzt. (&amp;quot;is used as the last resort recovery mechanism for a &lt;br /&gt;
non-responsive device.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Ausnahmen bspw. synchronizer flops und scan chains sind möglich, sollten aber in jedem einzelnen Fall dokumentiert und begründet (&amp;quot;justify&amp;quot;) werden. Mehrdimensionale signal/register die als memory implementiert sind, sind von dieser Warning ausgenommen.&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und Latches die nur unbenutzte Logik treiben, müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
Unbenutzte Register, Latches und sonstige Logik sind einfach toter Code. Toter Code  kann nachteilig sein wenn das Design wieder benutzt wird und der tote Code während der Portierung unbeabichtigt aktiv wird. Die Auswirkungen von totem Code bei der Erstellung von Sicherheitskritische Design ist nicht vorhersehbar und kann sich auch deutlich je nach verwendeten Synthese tool, Release-Version und soga Computersystemen unterscheiden. Damit ist eine konsistente Abschätzung der Folgen nicht möglich.&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide tiefe kombinatorische Veschaltungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Die Ermittlung des kritischen Pfades ist schwieriger wenn der Pfad viele Hierachie-Ebenen durchquert. Lange kombinatorische Pfad - auch snake paths genannt- können Syntheseprobleme verursachen. Das Projekt-Team sollte eine Obergrenze für die Anzahl von Hierarchie-Ebenen die ein Pfad durchqueren kann festlegen. Jeder längere Pfad soll als Regelverletzung gemeldet werden und an einer passenden Stelle durch Einfügen eines Register verkürzt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anm. des Autors: Die Regel lautet im Original &amp;quot;Avoid Snake Paths&amp;quot;; allerdings ist im deutschen Sprachgebrauch Schlangenpfad oder ähnliches völlig ungebräuchlich und wurde nicht für die Überschrift übernommen.&lt;br /&gt;
&lt;br /&gt;
Kritischer Pfad ist der Pfad zwischen zwei Registern der die längsten Laufzeit aufweist.&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Statements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß- und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90302</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90302"/>
		<updated>2015-11-15T19:21:51Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Grundsätzliches zur DO-254 */  jahr, Titel ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-11-09, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie bei &amp;quot;richtigen&amp;quot; Programmiersprachen, wie C, existieren auch für [[VHDL]] Richtlinien, um gut les- und wartbaren Code zu schreiben, der zu stabilen und funktionssicheren Designs führt. Vieles davon ist Geschmackssache, mit der DO-254 gibt es jedoch einen anerkannten Standard, der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält, sondern auch Methoden zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSMs empfiehlt.&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliches zur DO-254==&lt;br /&gt;
Die DO-254 ist die bekannteste Spezifikation zur Zertifizierung komplexer digitaler Schaltungen im Bereich der sogenannten Avionik (Fluggeräte). An solche Schaltungen werden üblicherweise höhere Sicherheitsanforderungen gestellt, als bspw. in der Consumer-Elektronik. Die Aufwände und Kosten für Simulation, Reviews, etc. steigen daher im Vergleich zu Designs ohne besondere Sicherheitsanforderungen auch um 50% und mehr. &lt;br /&gt;
&lt;br /&gt;
Im Umfeld der DO-254 sind aber auch weniger teure &amp;quot;Ratschläge&amp;quot; für &amp;quot;saubere&amp;quot; Designs entstanden, die außerhalb des Avionikumfeldes nützlich sein können.&lt;br /&gt;
&lt;br /&gt;
Das Grundthema der DO-254 ist die Qualitätssicherung, d.h. die Frage, wie man eine Entwicklung gestalten sollte, sodass das Produkt am Ende des Entwicklungsprozesses das Vertrauen in dessen Funktion rechtfertigt. Deshalb finden sich in der DO auch weniger technische Ratschläge oder Designspezifikationen, sondern vermehrt Methoden und Prozessbeschreibungen, die - in der Entwicklung und Verifikation sinngemäß angewandt - zu einem definierten und akzeptierten Grad an Vertrauen in die Funktionsfähigkeit der Produktes führen.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 beginnt mit der Beschreibung, wie Anforderungen (die sogenannten &amp;quot;requirements&amp;quot;) erfasst, verfeinert und in einem Dokument festgehalten werden sollen. Alle weiteren im Entwicklungsprozess erstellten Dokumente wie Testspezifikation und -ergebnisse verweisen direkt auf diese Requirements.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschränkt sich auf die Darstellung der VHDL-Richtlinien wie von der DO-254 usergroup  erarbeitet und in dem Dokument &amp;quot;Best Practice VHDL Coding Standards for DO-254 Programs&amp;quot; aus dem Jahr 2010 festgehalten.&lt;br /&gt;
&lt;br /&gt;
=Aufbau der Richtlinien=&lt;br /&gt;
&lt;br /&gt;
Die designrules sind in 4 Kategorien unterteilt, die Gruppe bestimmt den &lt;br /&gt;
Prefix der Regel. Beispielsweise  SS-10  für die Zehnte Regel in der Kategorie &amp;quot;Safe synthesis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*SS  - Safe Synthesis&lt;br /&gt;
*CP  - Coding Practice&lt;br /&gt;
*CDC - Clock domain Crossing&lt;br /&gt;
*DR  - Code Reviews&lt;br /&gt;
&lt;br /&gt;
Jeder Regel ist ein Schweregrad (severity) zugeordnet:&lt;br /&gt;
&lt;br /&gt;
*Note&lt;br /&gt;
*warning&lt;br /&gt;
*Error&lt;br /&gt;
&lt;br /&gt;
Ja nach Risikograd des designs kann die Einhaltung der Regeln auf einzelne Schweregrade beschrebkt sein. Es ist bei einigen Regeln angegeben das in Einzelfällen Verletzung der Regel in der Schwere herabgestuft (von Error auf Warning) werden kann, wenn diese Fälle entsprechend dokumentiert und begründet werden. &lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
Dieser Abschnitt (der eine einzelnen Regel enthält - Anm.d. Autors) behandelt potentialle Probleme in Designs mit mehreren Takt-Domainen und asynchronen Taktübergängen&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat oder in dem interne Takte generiert werden ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Fehlerhafte Taktübergänge führen zur Metastabilität und unbestimmten Schaltungsverhalten, die stark nachteilige Einfluß auf den Betrieb des Gerät haben. Diese Richtlinien muß hier erwähnt werden, auch wenn die Analyse von Taktübergänge fern des Fokus von VHDL-Code-Style-check-tools und  diesem Dokument ist.&lt;br /&gt;
&lt;br /&gt;
Beim Design-Review muß nach möglichen Taktübergängen gesucht werden und wenn aufgefunden nachgewiesen werden das diese korrekt einsynchronisiert werden. Fehlverhalten durch inkorrekt ausgeführte Taktübergänge sind mit Testläufen an realer Hardware nur extrem schwierig einzugrenzen, deshalb ist die Designanalyse äußerst wichtig. Es ist oft unmöglich das Fehlverhalten fürs Debugging konsistent zu reproduzieren. Erschwerend kommt der Einfluß von Umgebungseinflußen während des Betriebes hinzu: kapazitive Last, Temperatur des Die&#039;s, Masseprellen. Im schlimmsten Fall zeigt sich der Fehler nie unter normalen Testbedingungen aber unter realen Einsatzbedingungen (Flug).&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
Kombinatorische Rückkopplungen verursachen race-conditions und führen so zu nicht vorhersehbaren Verhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel f. Verletzung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
fred_s &amp;lt;= gated_in_s OR pulse_r;  --comb. loop at fred_s&lt;br /&gt;
&lt;br /&gt;
P_GATED_IN: PROCESS(en_i, fred_s, pulse_r)&lt;br /&gt;
BEGIN&lt;br /&gt;
gated_in_s &amp;lt;= fred_s AND en_i;&lt;br /&gt;
IF (en_i = &#039;0&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= NOT(fred_s);&lt;br /&gt;
ELSIF (pulse_r &amp;lt;= &#039;1&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= &#039;0&#039;;&lt;br /&gt;
END IF;&lt;br /&gt;
END PROCESS P_GATED_IN;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt das eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufrieden stellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher biten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Alle Register in den design sollten einen expliziten Reset haben. Ein Reset-Signal wird benutzt um ein Geröt in einen determinierten Zustand zu versetzen. Dieses vom system initierte &amp;quot;Error recovery&amp;quot; Kommando wird als letzte Rettungsmöglochkeit für nicht antwortende systzem benutzt. (&amp;quot;is used as the last resort recovery mechanism for a &lt;br /&gt;
non-responsive device.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Ausnahmen bspw. synchronizer flops und scan chains sind möglich, sollten aber in jedem einzelnen Fall dokumentiert und begründet (&amp;quot;justify&amp;quot;) werden. Mehrdimensionale signal/register die als memory implementiert sind, sind von dieser Warning ausgenommen.&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und Latches die nur unbenutzte Logik treiben, müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
Unbenutzte Register, Latches und sonstige Logik sind einfach toter Code. Toter Code  kann nachteilig sein wenn das Design wieder benutzt wird und der tote Code während der Portierung unbeabichtigt aktiv wird. Die Auswirkungen von totem Code bei der Erstellung von Sicherheitskritische Design ist nicht vorhersehbar und kann sich auch deutlich je nach verwendeten Synthese tool, Release-Version und soga Computersystemen unterscheiden. Damit ist eine konsistente Abschätzung der Folgen nicht möglich.&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide tiefe kombinatorische Veschaltungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Die Ermittlung des kritischen Pfades ist schwieriger wenn der Pfad viele Hierachie-Ebenen durchquert. Lange kombinatorische Pfad - auch snake paths genannt- können Syntheseprobleme verursachen. Das Projekt-Team sollte eine Obergrenze für die Anzahl von Hierarchie-Ebenen die ein Pfad durchqueren kann festlegen. Jeder längere Pfad soll als Regelverletzung gemeldet werden und an einer passenden Stelle durch Einfügen eines Register verkürzt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anm. des Autors: Die Regel lautet im Original &amp;quot;Avoid Snake Paths&amp;quot;; allerdings ist im deutschen Sprachgebrauch Schlangenpfad oder ähnliches völlig ungebräuchlich und wurde nicht für die Überschrift übernommen.&lt;br /&gt;
&lt;br /&gt;
Kritischer Pfad ist der Pfad zwischen zwei Registern der die längsten Laufzeit aufweist.&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Statements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß- und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90301</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90301"/>
		<updated>2015-11-15T19:19:06Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Taktübergange - Clock Domain Crossing (CDC) */  Begründung ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-11-09, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie bei &amp;quot;richtigen&amp;quot; Programmiersprachen, wie C, existieren auch für [[VHDL]] Richtlinien, um gut les- und wartbaren Code zu schreiben, der zu stabilen und funktionssicheren Designs führt. Vieles davon ist Geschmackssache, mit der DO-254 gibt es jedoch einen anerkannten Standard, der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält, sondern auch Methoden zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSMs empfiehlt.&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliches zur DO-254==&lt;br /&gt;
Die DO-254 ist die bekannteste Spezifikation zur Zertifizierung komplexer digitaler Schaltungen im Bereich der sogenannten Avionik (Fluggeräte). An solche Schaltungen werden üblicherweise höhere Sicherheitsanforderungen gestellt, als bspw. in der Consumer-Elektronik. Die Aufwände und Kosten für Simulation, Reviews, etc. steigen daher im Vergleich zu Designs ohne besondere Sicherheitsanforderungen auch um 50% und mehr. &lt;br /&gt;
&lt;br /&gt;
Im Umfeld der DO-254 sind aber auch weniger teure &amp;quot;Ratschläge&amp;quot; für &amp;quot;saubere&amp;quot; Designs entstanden, die außerhalb des Avionikumfeldes nützlich sein können.&lt;br /&gt;
&lt;br /&gt;
Das Grundthema der DO-254 ist die Qualitätssicherung, d.h. die Frage, wie man eine Entwicklung gestalten sollte, sodass das Produkt am Ende des Entwicklungsprozesses das Vertrauen in dessen Funktion rechtfertigt. Deshalb finden sich in der DO auch weniger technische Ratschläge oder Designspezifikationen, sondern vermehrt Methoden und Prozessbeschreibungen, die - in der Entwicklung und Verifikation sinngemäß angewandt - zu einem definierten und akzeptierten Grad an Vertrauen in die Funktionsfähigkeit der Produktes führen.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 beginnt mit der Beschreibung, wie Anforderungen (die sogenannten &amp;quot;requirements&amp;quot;) erfasst, verfeinert und in einem Dokument festgehalten werden sollen. Alle weiteren im Entwicklungsprozess erstellten Dokumente wie Testspezifikation und -ergebnisse verweisen direkt auf diese Requirements.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschränkt sich auf die Darstellung der VHDL-Richtlinien wie von der DO-254 usergroup  erarbeitet.&lt;br /&gt;
&lt;br /&gt;
=Aufbau der Richtlinien=&lt;br /&gt;
&lt;br /&gt;
Die designrules sind in 4 Kategorien unterteilt, die Gruppe bestimmt den &lt;br /&gt;
Prefix der Regel. Beispielsweise  SS-10  für die Zehnte Regel in der Kategorie &amp;quot;Safe synthesis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*SS  - Safe Synthesis&lt;br /&gt;
*CP  - Coding Practice&lt;br /&gt;
*CDC - Clock domain Crossing&lt;br /&gt;
*DR  - Code Reviews&lt;br /&gt;
&lt;br /&gt;
Jeder Regel ist ein Schweregrad (severity) zugeordnet:&lt;br /&gt;
&lt;br /&gt;
*Note&lt;br /&gt;
*warning&lt;br /&gt;
*Error&lt;br /&gt;
&lt;br /&gt;
Ja nach Risikograd des designs kann die Einhaltung der Regeln auf einzelne Schweregrade beschrebkt sein. Es ist bei einigen Regeln angegeben das in Einzelfällen Verletzung der Regel in der Schwere herabgestuft (von Error auf Warning) werden kann, wenn diese Fälle entsprechend dokumentiert und begründet werden. &lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
Dieser Abschnitt (der eine einzelnen Regel enthält - Anm.d. Autors) behandelt potentialle Probleme in Designs mit mehreren Takt-Domainen und asynchronen Taktübergängen&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat oder in dem interne Takte generiert werden ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Fehlerhafte Taktübergänge führen zur Metastabilität und unbestimmten Schaltungsverhalten, die stark nachteilige Einfluß auf den Betrieb des Gerät haben. Diese Richtlinien muß hier erwähnt werden, auch wenn die Analyse von Taktübergänge fern des Fokus von VHDL-Code-Style-check-tools und  diesem Dokument ist.&lt;br /&gt;
&lt;br /&gt;
Beim Design-Review muß nach möglichen Taktübergängen gesucht werden und wenn aufgefunden nachgewiesen werden das diese korrekt einsynchronisiert werden. Fehlverhalten durch inkorrekt ausgeführte Taktübergänge sind mit Testläufen an realer Hardware nur extrem schwierig einzugrenzen, deshalb ist die Designanalyse äußerst wichtig. Es ist oft unmöglich das Fehlverhalten fürs Debugging konsistent zu reproduzieren. Erschwerend kommt der Einfluß von Umgebungseinflußen während des Betriebes hinzu: kapazitive Last, Temperatur des Die&#039;s, Masseprellen. Im schlimmsten Fall zeigt sich der Fehler nie unter normalen Testbedingungen aber unter realen Einsatzbedingungen (Flug).&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
Kombinatorische Rückkopplungen verursachen race-conditions und führen so zu nicht vorhersehbaren Verhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel f. Verletzung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
fred_s &amp;lt;= gated_in_s OR pulse_r;  --comb. loop at fred_s&lt;br /&gt;
&lt;br /&gt;
P_GATED_IN: PROCESS(en_i, fred_s, pulse_r)&lt;br /&gt;
BEGIN&lt;br /&gt;
gated_in_s &amp;lt;= fred_s AND en_i;&lt;br /&gt;
IF (en_i = &#039;0&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= NOT(fred_s);&lt;br /&gt;
ELSIF (pulse_r &amp;lt;= &#039;1&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= &#039;0&#039;;&lt;br /&gt;
END IF;&lt;br /&gt;
END PROCESS P_GATED_IN;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt das eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufrieden stellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher biten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Alle Register in den design sollten einen expliziten Reset haben. Ein Reset-Signal wird benutzt um ein Geröt in einen determinierten Zustand zu versetzen. Dieses vom system initierte &amp;quot;Error recovery&amp;quot; Kommando wird als letzte Rettungsmöglochkeit für nicht antwortende systzem benutzt. (&amp;quot;is used as the last resort recovery mechanism for a &lt;br /&gt;
non-responsive device.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Ausnahmen bspw. synchronizer flops und scan chains sind möglich, sollten aber in jedem einzelnen Fall dokumentiert und begründet (&amp;quot;justify&amp;quot;) werden. Mehrdimensionale signal/register die als memory implementiert sind, sind von dieser Warning ausgenommen.&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und Latches die nur unbenutzte Logik treiben, müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
Unbenutzte Register, Latches und sonstige Logik sind einfach toter Code. Toter Code  kann nachteilig sein wenn das Design wieder benutzt wird und der tote Code während der Portierung unbeabichtigt aktiv wird. Die Auswirkungen von totem Code bei der Erstellung von Sicherheitskritische Design ist nicht vorhersehbar und kann sich auch deutlich je nach verwendeten Synthese tool, Release-Version und soga Computersystemen unterscheiden. Damit ist eine konsistente Abschätzung der Folgen nicht möglich.&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide tiefe kombinatorische Veschaltungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Die Ermittlung des kritischen Pfades ist schwieriger wenn der Pfad viele Hierachie-Ebenen durchquert. Lange kombinatorische Pfad - auch snake paths genannt- können Syntheseprobleme verursachen. Das Projekt-Team sollte eine Obergrenze für die Anzahl von Hierarchie-Ebenen die ein Pfad durchqueren kann festlegen. Jeder längere Pfad soll als Regelverletzung gemeldet werden und an einer passenden Stelle durch Einfügen eines Register verkürzt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anm. des Autors: Die Regel lautet im Original &amp;quot;Avoid Snake Paths&amp;quot;; allerdings ist im deutschen Sprachgebrauch Schlangenpfad oder ähnliches völlig ungebräuchlich und wurde nicht für die Überschrift übernommen.&lt;br /&gt;
&lt;br /&gt;
Kritischer Pfad ist der Pfad zwischen zwei Registern der die längsten Laufzeit aufweist.&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Statements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß- und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90293</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90293"/>
		<updated>2015-11-14T08:52:47Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Vermeide Schlangengleiche Verdrahtungen (SS19) */  Erläuterung ergänst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-11-09, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie bei &amp;quot;richtigen&amp;quot; Programmiersprachen, wie C, existieren auch für [[VHDL]] Richtlinien, um gut les- und wartbaren Code zu schreiben, der zu stabilen und funktionssicheren Designs führt. Vieles davon ist Geschmackssache, mit der DO-254 gibt es jedoch einen anerkannten Standard, der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält, sondern auch Methoden zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSMs empfiehlt.&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliches zur DO-254==&lt;br /&gt;
Die DO-254 ist die bekannteste Spezifikation zur Zertifizierung komplexer digitaler Schaltungen im Bereich der sogenannten Avionik (Fluggeräte). An solche Schaltungen werden üblicherweise höhere Sicherheitsanforderungen gestellt, als bspw. in der Consumer-Elektronik. Die Aufwände und Kosten für Simulation, Reviews, etc. steigen daher im Vergleich zu Designs ohne besondere Sicherheitsanforderungen auch um 50% und mehr. &lt;br /&gt;
&lt;br /&gt;
Im Umfeld der DO-254 sind aber auch weniger teure &amp;quot;Ratschläge&amp;quot; für &amp;quot;saubere&amp;quot; Designs entstanden, die außerhalb des Avionikumfeldes nützlich sein können.&lt;br /&gt;
&lt;br /&gt;
Das Grundthema der DO-254 ist die Qualitätssicherung, d.h. die Frage, wie man eine Entwicklung gestalten sollte, sodass das Produkt am Ende des Entwicklungsprozesses das Vertrauen in dessen Funktion rechtfertigt. Deshalb finden sich in der DO auch weniger technische Ratschläge oder Designspezifikationen, sondern vermehrt Methoden und Prozessbeschreibungen, die - in der Entwicklung und Verifikation sinngemäß angewandt - zu einem definierten und akzeptierten Grad an Vertrauen in die Funktionsfähigkeit der Produktes führen.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 beginnt mit der Beschreibung, wie Anforderungen (die sogenannten &amp;quot;requirements&amp;quot;) erfasst, verfeinert und in einem Dokument festgehalten werden sollen. Alle weiteren im Entwicklungsprozess erstellten Dokumente wie Testspezifikation und -ergebnisse verweisen direkt auf diese Requirements.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschränkt sich auf die Darstellung der VHDL-Richtlinien wie von der DO-254 usergroup  erarbeitet.&lt;br /&gt;
&lt;br /&gt;
=Aufbau der Richtlinien=&lt;br /&gt;
&lt;br /&gt;
Die designrules sind in 4 Kategorien unterteilt, die Gruppe bestimmt den &lt;br /&gt;
Prefix der Regel. Beispielsweise  SS-10  für die Zehnte Regel in der Kategorie &amp;quot;Safe synthesis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*SS  - Safe Synthesis&lt;br /&gt;
*CP  - Coding Practice&lt;br /&gt;
*CDC - Clock domain Crossing&lt;br /&gt;
*DR  - Code Reviews&lt;br /&gt;
&lt;br /&gt;
Jeder Regel ist ein Schweregrad (severity) zugeordnet:&lt;br /&gt;
&lt;br /&gt;
*Note&lt;br /&gt;
*warning&lt;br /&gt;
*Error&lt;br /&gt;
&lt;br /&gt;
Ja nach Risikograd des designs kann die Einhaltung der Regeln auf einzelne Schweregrade beschrebkt sein. Es ist bei einigen Regeln angegeben das in Einzelfällen Verletzung der Regel in der Schwere herabgestuft (von Error auf Warning) werden kann, wenn diese Fälle entsprechend dokumentiert und begründet werden. &lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
Kombinatorische Rückkopplungen verursachen race-conditions und führen so zu nicht vorhersehbaren Verhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel f. Verletzung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
fred_s &amp;lt;= gated_in_s OR pulse_r;  --comb. loop at fred_s&lt;br /&gt;
&lt;br /&gt;
P_GATED_IN: PROCESS(en_i, fred_s, pulse_r)&lt;br /&gt;
BEGIN&lt;br /&gt;
gated_in_s &amp;lt;= fred_s AND en_i;&lt;br /&gt;
IF (en_i = &#039;0&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= NOT(fred_s);&lt;br /&gt;
ELSIF (pulse_r &amp;lt;= &#039;1&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= &#039;0&#039;;&lt;br /&gt;
END IF;&lt;br /&gt;
END PROCESS P_GATED_IN;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt das eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufrieden stellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher biten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Alle Register in den design sollten einen expliziten Reset haben. Ein Reset-Signal wird benutzt um ein Geröt in einen determinierten Zustand zu versetzen. Dieses vom system initierte &amp;quot;Error recovery&amp;quot; Kommando wird als letzte Rettungsmöglochkeit für nicht antwortende systzem benutzt. (&amp;quot;is used as the last resort recovery mechanism for a &lt;br /&gt;
non-responsive device.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Ausnahmen bspw. synchronizer flops und scan chains sind möglich, sollten aber in jedem einzelnen Fall dokumentiert und begründet (&amp;quot;justify&amp;quot;) werden. Mehrdimensionale signal/register die als memory implementiert sind, sind von dieser Warning ausgenommen.&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und Latches die nur unbenutzte Logik treiben, müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
Unbenutzte Register, Latches und sonstige Logik sind einfach toter Code. Toter Code  kann nachteilig sein wenn das Design wieder benutzt wird und der tote Code während der Portierung unbeabichtigt aktiv wird. Die Auswirkungen von totem Code bei der Erstellung von Sicherheitskritische Design ist nicht vorhersehbar und kann sich auch deutlich je nach verwendeten Synthese tool, Release-Version und soga Computersystemen unterscheiden. Damit ist eine konsistente Abschätzung der Folgen nicht möglich.&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide tiefe kombinatorische Veschaltungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Die Ermittlung des kritischen Pfades ist schwieriger wenn der Pfad viele Hierachie-Ebenen durchquert. Lange kombinatorische Pfad - auch snake paths genannt- können Syntheseprobleme verursachen. Das Projekt-Team sollte eine Obergrenze für die Anzahl von Hierarchie-Ebenen die ein Pfad durchqueren kann festlegen. Jeder längere Pfad soll als Regelverletzung gemeldet werden und an einer passenden Stelle durch Einfügen eines Register verkürzt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anm. des Autors: Die Regel lautet im Original &amp;quot;Avoid Snake Paths&amp;quot;; allerdings ist im deutschen Sprachgebrauch Schlangenpfad oder ähnliches völlig ungebräuchlich und wurde nicht für die Überschrift übernommen.&lt;br /&gt;
&lt;br /&gt;
Kritischer Pfad ist der Pfad zwischen zwei Registern der die längsten Laufzeit aufweist.&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Statements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß- und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90279</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90279"/>
		<updated>2015-11-12T07:14:03Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Vermeide Logik ohne Treiber oder Nutzung (SS17) */ Begründung ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-11-09, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie bei &amp;quot;richtigen&amp;quot; Programmiersprachen, wie C, existieren auch für [[VHDL]] Richtlinien, um gut les- und wartbaren Code zu schreiben, der zu stabilen und funktionssicheren Designs führt. Vieles davon ist Geschmackssache, mit der DO-254 gibt es jedoch einen anerkannten Standard, der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält, sondern auch Methoden zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSMs empfiehlt.&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliches zur DO-254==&lt;br /&gt;
Die DO-254 ist die bekannteste Spezifikation zur Zertifizierung komplexer digitaler Schaltungen im Bereich der sogenannten Avionik (Fluggeräte). An solche Schaltungen werden üblicherweise höhere Sicherheitsanforderungen gestellt, als bspw. in der Consumer-Elektronik. Die Aufwände und Kosten für Simulation, Reviews, etc. steigen daher im Vergleich zu Designs ohne besondere Sicherheitsanforderungen auch um 50% und mehr. &lt;br /&gt;
&lt;br /&gt;
Im Umfeld der DO-254 sind aber auch weniger teure &amp;quot;Ratschläge&amp;quot; für &amp;quot;saubere&amp;quot; Designs entstanden, die außerhalb des Avionikumfeldes nützlich sein können.&lt;br /&gt;
&lt;br /&gt;
Das Grundthema der DO-254 ist die Qualitätssicherung, d.h. die Frage, wie man eine Entwicklung gestalten sollte, sodass das Produkt am Ende des Entwicklungsprozesses das Vertrauen in dessen Funktion rechtfertigt. Deshalb finden sich in der DO auch weniger technische Ratschläge oder Designspezifikationen, sondern vermehrt Methoden und Prozessbeschreibungen, die - in der Entwicklung und Verifikation sinngemäß angewandt - zu einem definierten und akzeptierten Grad an Vertrauen in die Funktionsfähigkeit der Produktes führen.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 beginnt mit der Beschreibung, wie Anforderungen (die sogenannten &amp;quot;requirements&amp;quot;) erfasst, verfeinert und in einem Dokument festgehalten werden sollen. Alle weiteren im Entwicklungsprozess erstellten Dokumente wie Testspezifikation und -ergebnisse verweisen direkt auf diese Requirements.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschränkt sich auf die Darstellung der VHDL-Richtlinien wie von der DO-254 usergroup  erarbeitet.&lt;br /&gt;
&lt;br /&gt;
=Aufbau der Richtlinien=&lt;br /&gt;
&lt;br /&gt;
Die designrules sind in 4 Kategorien unterteilt, die Gruppe bestimmt den &lt;br /&gt;
Prefix der Regel. Beispielsweise  SS-10  für die Zehnte Regel in der Kategorie &amp;quot;Safe synthesis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*SS  - Safe Synthesis&lt;br /&gt;
*CP  - Coding Practice&lt;br /&gt;
*CDC - Clock domain Crossing&lt;br /&gt;
*DR  - Code Reviews&lt;br /&gt;
&lt;br /&gt;
Jeder Regel ist ein Schweregrad (severity) zugeordnet:&lt;br /&gt;
&lt;br /&gt;
*Note&lt;br /&gt;
*warning&lt;br /&gt;
*Error&lt;br /&gt;
&lt;br /&gt;
Ja nach Risikograd des designs kann die Einhaltung der Regeln auf einzelne Schweregrade beschrebkt sein. Es ist bei einigen Regeln angegeben das in Einzelfällen Verletzung der Regel in der Schwere herabgestuft (von Error auf Warning) werden kann, wenn diese Fälle entsprechend dokumentiert und begründet werden. &lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
Kombinatorische Rückkopplungen verursachen race-conditions und führen so zu nicht vorhersehbaren Verhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel f. Verletzung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
fred_s &amp;lt;= gated_in_s OR pulse_r;  --comb. loop at fred_s&lt;br /&gt;
&lt;br /&gt;
P_GATED_IN: PROCESS(en_i, fred_s, pulse_r)&lt;br /&gt;
BEGIN&lt;br /&gt;
gated_in_s &amp;lt;= fred_s AND en_i;&lt;br /&gt;
IF (en_i = &#039;0&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= NOT(fred_s);&lt;br /&gt;
ELSIF (pulse_r &amp;lt;= &#039;1&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= &#039;0&#039;;&lt;br /&gt;
END IF;&lt;br /&gt;
END PROCESS P_GATED_IN;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt das eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufrieden stellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher biten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Alle Register in den design sollten einen expliziten Reset haben. Ein Reset-Signal wird benutzt um ein Geröt in einen determinierten Zustand zu versetzen. Dieses vom system initierte &amp;quot;Error recovery&amp;quot; Kommando wird als letzte Rettungsmöglochkeit für nicht antwortende systzem benutzt. (&amp;quot;is used as the last resort recovery mechanism for a &lt;br /&gt;
non-responsive device.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Ausnahmen bspw. synchronizer flops und scan chains sind möglich, sollten aber in jedem einzelnen Fall dokumentiert und begründet (&amp;quot;justify&amp;quot;) werden. Mehrdimensionale signal/register die als memory implementiert sind, sind von dieser Warning ausgenommen.&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und Latches die nur unbenutzte Logik treiben, müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
Unbenutzte Register, Latches und sonstige Logik sind einfach toter Code. Toter Code  kann nachteilig sein wenn das Design wieder benutzt wird und der tote Code während der Portierung unbeabichtigt aktiv wird. Die Auswirkungen von totem Code bei der Erstellung von Sicherheitskritische Design ist nicht vorhersehbar und kann sich auch deutlich je nach verwendeten Synthese tool, Release-Version und soga Computersystemen unterscheiden. Damit ist eine konsistente Abschätzung der Folgen nicht möglich.&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Statements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß- und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90256</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90256"/>
		<updated>2015-11-11T06:50:32Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Vermeide Kombinatorische Rückkoppelungen (SS3) */  *Beispiel u. Begründung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-11-09, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie bei &amp;quot;richtigen&amp;quot; Programmiersprachen, wie C, existieren auch für [[VHDL]] Richtlinien, um gut les- und wartbaren Code zu schreiben, der zu stabilen und funktionssicheren Designs führt. Vieles davon ist Geschmackssache, mit der DO-254 gibt es jedoch einen anerkannten Standard, der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält, sondern auch Methoden zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSMs empfiehlt.&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliches zur DO-254==&lt;br /&gt;
Die DO-254 ist die bekannteste Spezifikation zur Zertifizierung komplexer digitaler Schaltungen im Bereich der sogenannten Avionik (Fluggeräte). An solche Schaltungen werden üblicherweise höhere Sicherheitsanforderungen gestellt, als bspw. in der Consumer-Elektronik. Die Aufwände und Kosten für Simulation, Reviews, etc. steigen daher im Vergleich zu Designs ohne besondere Sicherheitsanforderungen auch um 50% und mehr. &lt;br /&gt;
&lt;br /&gt;
Im Umfeld der DO-254 sind aber auch weniger teure &amp;quot;Ratschläge&amp;quot; für &amp;quot;saubere&amp;quot; Designs entstanden, die außerhalb des Avionikumfeldes nützlich sein können.&lt;br /&gt;
&lt;br /&gt;
Das Grundthema der DO-254 ist die Qualitätssicherung, d.h. die Frage, wie man eine Entwicklung gestalten sollte, sodass das Produkt am Ende des Entwicklungsprozesses das Vertrauen in dessen Funktion rechtfertigt. Deshalb finden sich in der DO auch weniger technische Ratschläge oder Designspezifikationen, sondern vermehrt Methoden und Prozessbeschreibungen, die - in der Entwicklung und Verifikation sinngemäß angewandt - zu einem definierten und akzeptierten Grad an Vertrauen in die Funktionsfähigkeit der Produktes führen.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 beginnt mit der Beschreibung, wie Anforderungen (die sogenannten &amp;quot;requirements&amp;quot;) erfasst, verfeinert und in einem Dokument festgehalten werden sollen. Alle weiteren im Entwicklungsprozess erstellten Dokumente wie Testspezifikation und -ergebnisse verweisen direkt auf diese Requirements.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschränkt sich auf die Darstellung der VHDL-Richtlinien wie von der DO-254 usergroup  erarbeitet.&lt;br /&gt;
&lt;br /&gt;
=Aufbau der Richtlinien=&lt;br /&gt;
&lt;br /&gt;
Die designrules sind in 4 Kategorien unterteilt, die Gruppe bestimmt den &lt;br /&gt;
Prefix der Regel. Beispielsweise  SS-10  für die Zehnte Regel in der Kategorie &amp;quot;Safe synthesis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*SS  - Safe Synthesis&lt;br /&gt;
*CP  - Coding Practice&lt;br /&gt;
*CDC - Clock domain Crossing&lt;br /&gt;
*DR  - Code Reviews&lt;br /&gt;
&lt;br /&gt;
Jeder Regel ist ein Schweregrad (severity) zugeordnet:&lt;br /&gt;
&lt;br /&gt;
*Note&lt;br /&gt;
*warning&lt;br /&gt;
*Error&lt;br /&gt;
&lt;br /&gt;
Ja nach Risikograd des designs kann die Einhaltung der Regeln auf einzelne Schweregrade beschrebkt sein. Es ist bei einigen Regeln angegeben das in Einzelfällen Verletzung der Regel in der Schwere herabgestuft (von Error auf Warning) werden kann, wenn diese Fälle entsprechend dokumentiert und begründet werden. &lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
Kombinatorische Rückkopplungen verursachen race-conditions und führen so zu nicht vorhersehbaren Verhalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel f. Verletzung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
fred_s &amp;lt;= gated_in_s OR pulse_r;  --comb. loop at fred_s&lt;br /&gt;
&lt;br /&gt;
P_GATED_IN: PROCESS(en_i, fred_s, pulse_r)&lt;br /&gt;
BEGIN&lt;br /&gt;
gated_in_s &amp;lt;= fred_s AND en_i;&lt;br /&gt;
IF (en_i = &#039;0&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= NOT(fred_s);&lt;br /&gt;
ELSIF (pulse_r &amp;lt;= &#039;1&#039;) THEN&lt;br /&gt;
  gated_in_s &amp;lt;= &#039;0&#039;;&lt;br /&gt;
END IF;&lt;br /&gt;
END PROCESS P_GATED_IN;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt das eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufrieden stellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher biten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Alle Register in den design sollten einen expliziten Reset haben. Ein Reset-Signal wird benutzt um ein Geröt in einen determinierten Zustand zu versetzen. Dieses vom system initierte &amp;quot;Error recovery&amp;quot; Kommando wird als letzte Rettungsmöglochkeit für nicht antwortende systzem benutzt. (&amp;quot;is used as the last resort recovery mechanism for a &lt;br /&gt;
non-responsive device.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Ausnahmen bspw. synchronizer flops und scan chains sind möglich, sollten aber in jedem einzelnen Fall dokumentiert und begründet (&amp;quot;justify&amp;quot;) werden. Mehrdimensionale signal/register die als memory implementiert sind, sind von dieser Warning ausgenommen.&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Statements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß- und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:VHDL_Code_Style_und_DO-254&amp;diff=90251</id>
		<title>Diskussion:VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:VHDL_Code_Style_und_DO-254&amp;diff=90251"/>
		<updated>2015-11-10T19:06:01Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Danke!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lemma ==&lt;br /&gt;
Habe mir mal erlaubt, das Ganze flüssiger zu machen. Ich hoffe der Tenor bleibt erhalten und wird deutlicher. [[Spezial:Beiträge/87.178.122.136|87.178.122.136]] 02:18, 10. Nov. 2015 (CET)&lt;br /&gt;
:Vielen Dank, es ist Dir wirklich flüssiger gelungen. Manchmal steckt man quasi im Englischen Duktus fest, leider gibt es zuwenig deutsche Fachliteratur die man hier als Formulierungsvorlage benutzen könnte. MfG, --[[Benutzer:Fpgakuechle|Fpgakuechle]] ([[Benutzer Diskussion:Fpgakuechle|Diskussion]]) 20:06, 10. Nov. 2015 (CET)&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90229</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90229"/>
		<updated>2015-11-09T22:27:11Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Mehr Einordnung; Einleitung SS-14 detailierter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-11-09, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie für &amp;quot;richtige Programmiersprachen wie C&amp;quot; gibt es auch für VHDL Richtlinien um gut les- und wartbaren&lt;br /&gt;
Code zu schreiben der zu stabilenen und sicheren Designs führt. Viel davon ist Geschmackssache, mit der DO-254 gibt es&lt;br /&gt;
einen anerkannten Standard der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält sondern auch Methodiken zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSM enthält.&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliches zur DO-254==&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik. An diese werden deutlich höhere Sicherheitsanforderungen gestellt als bspw. Consumer-Elektronik. Die Aufwände und Kosten für Simulation, Reviews, etc. steigt um ca 50% im Vergleich zu Designs ohne besondere Sichherheitsanforderungen. Im Umfeld der DO-254 sind aber auch weniger teure &amp;quot;Ratschläge&amp;quot; für &amp;quot;saubere&amp;quot; Designs entstanden.&lt;br /&gt;
&lt;br /&gt;
Grundidee der DO-254 ist Qualitätssicherung - wie gestaltet man die Entwicklung so das das Produkt &lt;br /&gt;
an Ende des Entwicklungsprozesses das Vertrauen in diesen Funktion gerechtfertigt. Deshalb finden sich in der DO auch kaum technische Ratschläge oder Designspezifikationen sondern Methoden und Prozessbeschreibungen die angewandt in der Entwicklung und Verifikation zu einem aktzeptierten Grad an Vertrauen in die Funktionsfähigkeit der Produktes führen.&lt;br /&gt;
&lt;br /&gt;
Die DO beginnt mit der Beschreibung wie Anforderungen (requirements) erfasst, verfeinert und in einem Dokument festgehalten werden. Alle weiteren im Entwicklungsprozess erstellten Dokumente wie Testspezifikation und -ergebnisse verweisen direkt auf diese Requirements.&lt;br /&gt;
Dieser Artikel beschränkt sich auf die Darstellung der VHDL-Richtlinien wie von der DO-254 usergroup  erarbeitet.&lt;br /&gt;
&lt;br /&gt;
=Aufbau der Richtlinien=&lt;br /&gt;
&lt;br /&gt;
Die designrules sind in 4 Kategorien unterteilt, die Gruppe bestimmt den &lt;br /&gt;
Prefix der Regel. Beispielsweise  SS-10  für die Zehnte Regel in der Kategorie &amp;quot;Safe synthesis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*SS  - Safe Synthesis&lt;br /&gt;
*CP  - Coding Practice&lt;br /&gt;
*CDC - Clock domain Crossing&lt;br /&gt;
*DR  - Code Reviews&lt;br /&gt;
&lt;br /&gt;
Jeder Regel ist ein Schweregrad (severity) zugeordnet:&lt;br /&gt;
&lt;br /&gt;
*Note&lt;br /&gt;
*warning&lt;br /&gt;
*Error&lt;br /&gt;
&lt;br /&gt;
Ja nach Risikograd des designs kann die Einhaltung der Regeln auf einzelne Schweregrade beschrebkt sein. Es ist bei einigen Regeln angegeben das in Einzelfällen Verletzung der Regel in der Schwere herabgestuft (von Error auf Warning) werden kann, wenn diese Fälle entsprechend dokumentiert und begründet werden. &lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt das eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufrieden stellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher biten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Alle Register in den design sollten einen expliziten Reset haben. Ein Reset-Signal wird benutzt um ein Geröt in einen determinierten Zustand zu versetzen. Dieses vom system initierte &amp;quot;Error recovery&amp;quot; Kommando wird als letzte Rettungsmöglochkeit für nicht antwortende systzem benutzt. (&amp;quot;is used as the last resort recovery mechanism for a &lt;br /&gt;
non-responsive device.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Ausnahmen bspw. synchronizer flops und scan chains sind möglich, sollten aber in jedem einzelnen Fall dokumentiert und begründet (&amp;quot;justify&amp;quot;) werden. Mehrdimensionale signal/register die als memory implementiert sind, sind von dieser Warning ausgenommen.&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Statements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß- und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90226</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90226"/>
		<updated>2015-11-08T21:17:42Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Vermeide Register ohne Reset (SS14) */ Ausnahmen und Behandlung dieser  ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie für &amp;quot;richtige Programmiersprachen wie C&amp;quot; gibt es auch für VHDL Richtlinien um gut les- und wartbaren&lt;br /&gt;
Code zu schreiben der zu stabilenen und sicheren Designs führt. Viel davon ist Geschmackssache, mit der DO-254 gibt es&lt;br /&gt;
einen anerkannten Standard der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält sondern auch Methodiken zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSM enthält.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik. An diese werden deutlich höhere Sicherheitsanforderungen gestellt als bspw. Consumer-Elektronik. Die Aufwände und Kosten für Simulation, Reviews, etc. steigt um ca 50% im Vergleich zu Designs ohne besondere Sichherheitsanforderungen. Im Umfeld der DO-254 sind aber auch weniger teure &amp;quot;Ratschläge&amp;quot; für &amp;quot;saubere&amp;quot; Designs entstanden.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt das eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufrieden stellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher biten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
Ausnahmen bspw. synchronizer flops und scan chains sind möglich, sollten aber in jedem einzelnen Fall dokumentiert und begründet (&amp;quot;justify&amp;quot;) werden. Mehrdimensionale signal/register die als memory implementiert sind, sind von dieser Warning ausgenommen.&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Statements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß- und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90225</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90225"/>
		<updated>2015-11-07T16:35:39Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie für &amp;quot;richtige Programmiersprachen wie C&amp;quot; gibt es auch für VHDL Richtlinien um gut les- und wartbaren&lt;br /&gt;
Code zu schreiben der zu stabilenen und sicheren Designs führt. Viel davon ist Geschmackssache, mit der DO-254 gibt es&lt;br /&gt;
einen anerkannten Standard der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält sondern auch Methodiken zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSM enthält.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik. An diese werden deutlich höhere Sicherheitsanforderungen gestellt als bspw. Consumer-Elektronik. Die Aufwände und Kosten für Simulation, Reviews, etc. steigt um ca 50% im Vergleich zu Designs ohne besondere Sichherheitsanforderungen. Im Umfeld der DO-254 sind aber auch weniger teure &amp;quot;Ratschläge&amp;quot; für &amp;quot;saubere&amp;quot; Designs entstanden.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt das eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufrieden stellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher biten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Statements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß- und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90221</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90221"/>
		<updated>2015-11-06T22:06:23Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Checkliste für FPGA (VHDL)-Designs (nach DO-254) */  Verdeutlichung DO-254 ist für Designs mit erhöhten Sicherheitsstandards&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie für &amp;quot;richtige Programmiersprachen wie C&amp;quot; gibt es auch für VHDL Richtlinien um gut les- und wartbaren&lt;br /&gt;
Code zu schreiben der zu stabilenen und sicheren Designs führt. Viel davon ist Geschmackssache, mit der DO-254 gibt es&lt;br /&gt;
einen anerkannten Standard der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält sondern auch Methodiken zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSM enthält.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik. An diese werden deutlich höhere Sicherheitsanforderungen gestellt als bspw. Consumer-Elektronik. Die Aufwände und Kosten für Simulation, Reviews, etc. steigt um ca 50% im Vergleich zu Designs ohne besondere Sichherheitsanforderungen. Im Umfeld der DO-254 sind aber auch weniger teure &amp;quot;Ratschläge&amp;quot; für &amp;quot;saubere&amp;quot; Designs entstanden.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt das eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufrieden stellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher biten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Staements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Scheregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90220</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=90220"/>
		<updated>2015-11-06T21:45:39Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Vermeide mehrfache Wellenformen (SS5) */  Ausführlich, Hinweis auf Überstzungshürden; missmatch Simu und Synthese&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie für &amp;quot;richtige Programmiersprachen wie C&amp;quot; gibt es auch für VHDL Richtlinien um gut les- und wartbaren&lt;br /&gt;
Code zu schreiben der zu stabilenen und sicheren Designs führt. Viel davon ist Geschmackssache, mit der DO-254 gibt es&lt;br /&gt;
einen anerkannten Standard der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält sondern auch Methodiken zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSM enthält.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik.&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signalkurven - Avoid Multiple Waveforms (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite einer Signalzuweisung stehen. Beispiel Fehler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
In der Erklärung wird ausgeführt das eine Signalkurve (&amp;quot;waveform&amp;quot;) aus einer Wertzuweisung (&amp;quot;assignment Value expression&amp;quot;) und einer optionalen Verzögerung (&amp;quot;assignment delay expression&amp;quot;) besteht. Mehrfache Signalkurven sind nicht synthetisierbar und daher stimmt Simulation und synthetisierte Hardware für diese nicht überein.&lt;br /&gt;
Leider kennt der Autor keine ihn zufrieden stellende Übersetzung für &amp;quot;multiple waveform&amp;quot;. &amp;quot;Waveform&amp;quot; kann hier Signalform, Signalkurve heißen , was &amp;quot;multiple&amp;quot; am besten wiedergibt ist weitaus unklarer. Wörterbücher biten &amp;quot;mehrfach&amp;quot;, &amp;quot;mannigfaltig&amp;quot;, &amp;quot;vielwertig an.&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Staements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Scheregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88332</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88332"/>
		<updated>2015-04-19T15:45:10Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Stelle sicher das die Zustandsübergänge sicher sind (CP6) */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie für &amp;quot;richtige Programmiersprachen wie C&amp;quot; gibt es auch für VHDL Richtlinien um gut les- und wartbaren&lt;br /&gt;
Code zu schreiben der zu stabilenen und sicheren Designs führt. Viel davon ist Geschmackssache, mit der DO-254 gibt es&lt;br /&gt;
einen anerkannten Standard der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält sondern auch Methodiken zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSM enthält.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik.&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= ABRT;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Wellenformen (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite nur eine Wellenform haben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Staements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Scheregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88331</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88331"/>
		<updated>2015-04-19T15:43:51Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Stelle sicher das die Zustandsübergänge sicher sind (CP6) */ +bsp&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie für &amp;quot;richtige Programmiersprachen wie C&amp;quot; gibt es auch für VHDL Richtlinien um gut les- und wartbaren&lt;br /&gt;
Code zu schreiben der zu stabilenen und sicheren Designs führt. Viel davon ist Geschmackssache, mit der DO-254 gibt es&lt;br /&gt;
einen anerkannten Standard der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält sondern auch Methodiken zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSM enthält.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik.&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
TYPE T_STATE_TYPE is (NOP, --default and reset state&lt;br /&gt;
                       START_TR,&lt;br /&gt;
                       BRST_CONT,&lt;br /&gt;
                       BRST_END&lt;br /&gt;
                       -- FGH --auskommentierter Zustand &lt;br /&gt;
                       );&lt;br /&gt;
-- ..&lt;br /&gt;
&lt;br /&gt;
CASE state_q IS&lt;br /&gt;
WHEN NOP =&amp;gt;&lt;br /&gt;
 IF (tr_req = &#039;1&#039; AND rnw = &#039;1&#039; ) THEN&lt;br /&gt;
   next_state &amp;lt;= START_TR;&lt;br /&gt;
  END IF;&lt;br /&gt;
  --...&lt;br /&gt;
  WHEN BRST_CONT  =&amp;gt;      --Fehler: kein hinführender Übergang&lt;br /&gt;
     next_state  &amp;lt;= BRST_END;&lt;br /&gt;
&lt;br /&gt;
  WHEN BRST_END  =&amp;gt;      --Fehler: kein verlassender Übergang&lt;br /&gt;
     IF tr_req = &#039;0&#039; THEN&lt;br /&gt;
       status  &amp;lt;= BRST_END;&lt;br /&gt;
     END IF;  &lt;br /&gt;
&lt;br /&gt;
   WHEN OTHERS =&amp;gt;&lt;br /&gt;
     next_state &amp;lt;= FGH;  --Fehler FGH ist nicht definiert&lt;br /&gt;
&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Wellenformen (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite nur eine Wellenform haben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Staements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Scheregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88315</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88315"/>
		<updated>2015-04-17T05:11:01Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Vermeide vectorlängenabhängige Zuweisungen (CP4) */  typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie für &amp;quot;richtige Programmiersprachen wie C&amp;quot; gibt es auch für VHDL Richtlinien um gut les- und wartbaren&lt;br /&gt;
Code zu schreiben der zu stabilenen und sicheren Designs führt. Viel davon ist Geschmackssache, mit der DO-254 gibt es&lt;br /&gt;
einen anerkannten Standard der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält sondern auch Methodiken zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSM enthält.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik.&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Wellenformen (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite nur eine Wellenform haben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Staements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Scheregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88286</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88286"/>
		<updated>2015-04-13T05:57:27Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Einleitung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Wie für &amp;quot;richtige Programmiersprachen wie C&amp;quot; gibt es auch für VHDL Richtlinien um gut les- und wartbaren&lt;br /&gt;
Code zu schreiben der zu stabilenen und sicheren Designs führt. Viel davon ist Geschmackssache, mit der DO-254 gibt es&lt;br /&gt;
einen anerkannten Standard der nicht nur &amp;quot;Schönheitsregeln&amp;quot; wie Namenskonventionen enthält sondern auch Methodiken zur&lt;br /&gt;
sicheren Umsetzung von Taktübergängen und FSM enthält.&lt;br /&gt;
&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik.&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0)&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Wellenformen (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite nur eine Wellenform haben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Staements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Scheregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Platzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88285</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88285"/>
		<updated>2015-04-13T05:16:51Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: +Kat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik.&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0)&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollten nicht hart codiert sein, außer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Reset-Zustand haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte) Zustände sollen in einen definierten Zustand übergehen. In diesem Zustand soll die fehlerursache angemessen bearbeitet werden&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen-Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig ist (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwendete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll:&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt,&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion,&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein,&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten,&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Wellenformen (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite nur eine Wellenform haben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
&#039;&#039;*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*&#039;&#039;Stelle sicher das alle VHDL Konstanten initialisiert werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*&#039;&#039;Takt-Signale sollen nicht in einem Logik-pfad den Daten-Eingang eines FlipFlops treiben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*&#039;&#039;Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*&#039;&#039;Datensignale sollten nicht in einen Logik-Pfad benutzt werden, der den CLK-Eingang eines Registers treibt.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Takte (SS11) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Taktsignale.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*&#039;&#039;Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*&#039;&#039;Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*&#039;&#039;Alle Register sollten eine reset-Steuerleitung haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*&#039;&#039;Resets sollten synchron freigegeben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*&#039;&#039;Verwende keine Register Initialisierung.&#039;&#039;&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logik ohne Treiber oder Nutzung (SS17) === &lt;br /&gt;
*&#039;&#039;a) Jedes Register oder Latch muss benutzt und getrieben werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) Register und latches die nur unebenutzte Logik treiben müssen untersucht werden.&#039;&#039;&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*&#039;&#039;Jedes Register soll über seine Eingänge steuerbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*&#039;&#039;Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*&#039;&#039;Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe gestattet.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*&#039;&#039;Benutze die selbe Multi-Bit Vektor Indizierung (&amp;quot;downto&amp;quot; vers. &amp;quot;to&amp;quot;) im gesamten Design einheitlich.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Staements (DR1) ===&lt;br /&gt;
*&#039;&#039;Case-Konstrukte, Always und initial blocks sollen Labels haben.&#039;&#039;&lt;br /&gt;
*Scheregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*&#039;&#039;Namen sollen nicht allein durch Groß und Kleinschreibung unterscheidbar sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*&#039;&#039;Der selbe Name soll nicht für verschiedenen Typen von Identifiers benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Deklaration.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*&#039;&#039;Eine Zeile pro Anweisung.&#039;&#039;&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*&#039;&#039;Code soll einheitlich eingerückt sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und Dateien sollen nicht nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File Header sicher.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Paltzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=88229</id>
		<title>Benutzer:Fpgakuechle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Fpgakuechle&amp;diff=88229"/>
		<updated>2015-04-07T20:08:53Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Erstellte Artikel */ +1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomen est omen - meine Spezialität sind FPGA-Designs.&lt;br /&gt;
&lt;br /&gt;
=Erstellte Artikel=&lt;br /&gt;
*[[Raspberry als Universalprogrammer]]&lt;br /&gt;
*[[Hardwarenahe Programmierung am Raspberry Pi]]&lt;br /&gt;
*[[Eigenbau ADC am Raspberry Pi]]&lt;br /&gt;
*[[Durchblicker]] - FPGA Projekt: Interner Logicanalyzer mit Ausgabe an VGA&lt;br /&gt;
*[[PiBla]] - FPGA Projekt: Nachbau des 8 bit controllers Picoblaze als Register-Transfer Level&lt;br /&gt;
*[[Retrocomputing auf FPGA]]&lt;br /&gt;
*[[TTL74185]] - FPGA benchmark, Untersuchung wie gut verschiedenen Beschreibungsformen synthetisierbar sind&lt;br /&gt;
*[[VHDL Code Style und DO-254]] Beispiel für FPGA (VHDL) - Codierrichtlinien aus dem Avionik Umfeld&lt;br /&gt;
&lt;br /&gt;
===Von mir begonnene, inzwischen in der Community stark überarbeitete Artikel===&lt;br /&gt;
*[[Taktung FPGA/CPLD]] - Darstellung der Taktverteilung/-domain/-qualität in FPGA&#039;s&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88228</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88228"/>
		<updated>2015-04-07T19:50:09Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Formatierung,typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik.&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein Signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden&#039;&#039;.&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
&lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&#039;&#039;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*&#039;&#039;Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
Statt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
 data &amp;lt;= &amp;quot;00000000&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
besser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
data &amp;lt;= (others =&amp;gt; &#039;0)&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*&#039;&#039;a: In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: der FSM Zustand sollte hard codiert sein, aüßer unvermeidbar.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*&#039;&#039;a: Ein Zustandsautomat sollte einen definierten Zustandsautomat haben.&#039;&#039;&lt;br /&gt;
*&#039;&#039;b: Alle ungenutzen (illegale oder undefinierte Zustände sollen) in einen definierten Zustand übergehen.&#039;&#039;&lt;br /&gt;
*&#039;&#039;c: Es sollen keine unerreichbaren und keine Sackgassen Zustände in einem Zustandsautomaten geben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*&#039;&#039;Bit-breiten an beiden Seiten einer Zuweisung, Vergleich oder Assoziation sollten übereinstimmen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig (CP8)===&lt;br /&gt;
*&#039;&#039;Die sensetivity list sollte nur im process verwednete Signale enthalten.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
&#039;&#039;Jedes Unterprogramm soll&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur einen Entrittspunkt&#039;&#039; &lt;br /&gt;
*&#039;&#039;keine Rekursion&#039;&#039;&lt;br /&gt;
*&#039;&#039;nur Zugriff auf lokale Variablen/Signale haben&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*&#039;&#039;Jedem Objekt (Signal, Variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*&#039;&#039;Jeder Eingang sollte von einem Anschluss, Signal oder Konstante getrieben werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
*&#039;&#039;Design Ausgänge sollten verbunden sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*&#039;&#039;Objekte sollte vor der Benutzung deklariert werden&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*&#039;&#039;Alle deklarierten Objekte sollten benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*&#039;&#039;Für jedes Design das mehrere zueinander asynchrone Takte hat ist eine umfassende Analyse der Taktübergänge durchzuführen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordentliche Case-Anweisungen sicher (SS2)===&lt;br /&gt;
&#039;&#039;Case statements sollen:&#039;&#039;&lt;br /&gt;
*&#039;&#039;a) Vollständig sein&#039;&#039;&lt;br /&gt;
*&#039;&#039;b) keine doppelten oder überlappenden Anweisungen enthalten&#039;&#039;&lt;br /&gt;
*&#039;&#039;c) keine nichterreichbare Anweisungen enthalten&#039;&#039;&lt;br /&gt;
*&#039;&#039;d) immer eine &amp;quot;when others&amp;quot; Regel enthalten&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*&#039;&#039;In einem kombinatorischen Prozess ist kein Lesen und Zuweisen desselben Signals zulässig.&#039;&#039;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
===Vermeide mehrfache Wellenformen (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite nur eine Wellenform haben.&lt;br /&gt;
&lt;br /&gt;
write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*Stelle sicher das alle VHDL Konstanten initialisiert werden.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*Takt-Signale sollen nicht in einem Logik-pfad das den D-Eingang eines FF treiben.&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*Datensignale sollten nicht in einen logik-pfad benutzt werden das den CLK-Eingang eines Registers treibt.&lt;br /&gt;
*Schweregrad:Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern genrierte Takte (SS11) ===&lt;br /&gt;
*Vermeide intern generierte Taktsignale.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&lt;br /&gt;
*Schweregrad:Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*Alle Register sollten eine reset-Steuerleitung haben.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*Resets sollten synchron freigegeben werden.&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*Verwende keine register initialisierung.&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logic ohne Treiber oder Nutzen (SS17) === &lt;br /&gt;
*a) Jedes Register und latch muss benutzt und getrieben werden.&lt;br /&gt;
*b) Register und latches die nur unebenutzte Logik treiben müßen untersucht werden.&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*Jedes Register soll über seine Eingänge steuerbar sein.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe zu gestatten.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*Benutze die selbe multibit Vektor indizierung (downt/to) im gesamten design konsequent&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Staements (DR1) ===&lt;br /&gt;
*case- Konstrukte, Always und initial blocks sollen labels haben.&lt;br /&gt;
*Scheregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*Name sollen nicht allein an Groß und Kleinschreibung unterscheidbar&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*Der selbe Name soll nicht für verschiedenen typen von identifiers benutzt werden&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*Eine Zeile für eine Deklaration&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*eine Zeile für eine Anweisung&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*Code soll einheitlich eingerückt sein&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und datein sollen nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File header sicher&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Paltzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88227</id>
		<title>VHDL Code Style und DO-254</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Code_Style_und_DO-254&amp;diff=88227"/>
		<updated>2015-04-07T19:35:58Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Erstfassung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-04-07, vollständig aber Codebeispiele fehlen und Einführung ist ein bisserl knapp&lt;br /&gt;
&lt;br /&gt;
=Checkliste für FPGA (VHDL)-Designs (nach DO-254)=&lt;br /&gt;
Die DO-254 ist ein Standard zur Zertifizierung komplexer digitaler Schaltungen für Fluggerät - Avionik.&lt;br /&gt;
Die DO-254 usergroup hat in diesem Zusammenhang folgende Regel erarbeitet.&lt;br /&gt;
&lt;br /&gt;
==VHDL Schreibstil - Coding Practice (CP)==&lt;br /&gt;
===Vermeide Fehler bei Typ_Deklarationen (CP1)===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Kontrolliere den Code auf inkorrekten Gebrauch von Typen, nichtpassende Begrenzungen oder Randbedingungen&#039;&#039;&lt;br /&gt;
*Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide doppelte Signalzuweisungen (CP2)===&lt;br /&gt;
*&#039;&#039;Ein signal soll innerhalb eines Statementsbereich nur einmal zugewiesen werden&#039;&#039;.&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
IF reset = 1 then&lt;br /&gt;
  ausgang &amp;lt;= &#039;1&#039; ;&lt;br /&gt;
  blablup &amp;lt;= blupbla;&lt;br /&gt;
  ausgang &amp;lt;= &#039;0&#039;;&lt;br /&gt;
else &lt;br /&gt;
===Vermeide numerischen Werte mitten im Code (CP3)===&lt;br /&gt;
*&amp;quot;Für Re-Use und einfacher Portierbarkeit sollten keine hart-codierte Zahlenwerte benutzt werden.&amp;quot;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide vectorlängenabhängige Zuweisungen (CP4)===&lt;br /&gt;
*Für Zuweisung während Reset keine hart-codierten Zahlenwerte verwenden&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
Statt &amp;quot;data&amp;quot; &amp;lt;= &amp;quot;00000000&amp;quot;; besser &amp;quot;data &amp;lt;= (others =&amp;gt; &#039;0)&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das alle FSM einheitlichen codiert sind (CP5)===&lt;br /&gt;
*a:&amp;quot; In einem Design sollte ein einheitlichen Stil für alle Zustandsautomaten verwendet werden.&lt;br /&gt;
*b: der FSM Zustand sollte hard codiert sein, aüßer unvermeidbar.&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Zustandsübergänge sicher sind (CP6)===&lt;br /&gt;
*a: Ein Zustandsautomat sollte einen definierten Zustandsautomat haben.&lt;br /&gt;
*b: Alle ungenutzen (illegale oder undefinierte Zustände sollen) in einen definierten Zustand übergehen.&lt;br /&gt;
*c: Es sollen keine unerreichbaren und keine Sackgassen Zustände in einem Zustandsautomaten geben.&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide unstimmige Intervallgrenzen (missmatching ranges) (CP7)===&lt;br /&gt;
*Bit breiten an beiden seiten eines Zuweisung, Vergleich oder assoziation sollten übereinstimmen.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Stelle sicher das die Sensitivity list vollständig (CP8)===&lt;br /&gt;
*Die sensetivity list sollte nur im process verwednete Signale enthalten.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
 &lt;br /&gt;
===Stelle sicher das Unterprogramme ordentlich sind (CP9)===&lt;br /&gt;
Jedes Unterprogramm soll&lt;br /&gt;
*nur einen Entrittspunkt &lt;br /&gt;
*keine Rekursion&lt;br /&gt;
*nur Zugriff auf lokale variablen/Signale haben&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Weise Werte vor Nutzung zu (CP10)===&lt;br /&gt;
*Jedem Objekt (signal, variable, Anschluß) sollte eine Wert zugewiesen werden bevor es benutzt wird.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Eingänge (CP11)===&lt;br /&gt;
*Jeder Eingang sollte von einem Anschluß, sognal oder constant getrieben werden.&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide offene Ausgänge (CP12)===&lt;br /&gt;
&amp;quot;Design Ausgänge sollten verbunden sein&amp;quot;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
===Deklariere Objekte vor Nutzung (CP13)===&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&amp;quot;Objekte sollte vor der Benutzung deklariert werden&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vermeide Ungenutzte Deklarationen (CP14)===&lt;br /&gt;
*alle deklarierten Objekte sollten benutzt werden.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Taktübergange - Clock Domain Crossing (CDC)==&lt;br /&gt;
===Analysiere Mehrfache asynchrone Takte (CDC-1)===&lt;br /&gt;
*Jedes Design das mehrere zueinander asynchrone Takte eine umfassende Analyse der taktübergänge sollte durchgeführt halten.&lt;br /&gt;
&lt;br /&gt;
==Sichere Synthese - Safe Synthesis (SS)==&lt;br /&gt;
===Vermeide implizierte Logik (SS1)===&lt;br /&gt;
*Erlaube keinen Code der feed-throughs, Schieberegister und interne Tristate-Treiber impliziert.&lt;br /&gt;
&lt;br /&gt;
===Stelle ordebtlich Case-Anweisungen sicher (SS2)===&lt;br /&gt;
Case statements sollen:&lt;br /&gt;
*a) Vollständig sein&lt;br /&gt;
*b) keine doppelten oder überlappenden Anweisungen enthalten&lt;br /&gt;
*c) keine nichterreichbare Anweisungen enthalten&lt;br /&gt;
*d) immer eine &amp;quot;when others&amp;quot; Regel enthalten&lt;br /&gt;
&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide Kombinatorische Rückkoppelungen (SS3)===&lt;br /&gt;
*In einem kombinatorischen prozess ist kein lesen und Zuweisen desselben Signals zulässig.&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide automatische Einführung von latches (SS4) ===&lt;br /&gt;
*Der Codierstil sollte den automatischen Einbau von Latches verhindern.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
===Vermeide mehrfache Wellenformen (SS5) ===&lt;br /&gt;
*Nur eine Waveform soll auf der rechte Seite nur eine Wellenform haben.&lt;br /&gt;
&lt;br /&gt;
write &amp;lt;= &#039;1&#039; after clk_prd, &#039;0&#039; after 8*clk_prd;&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
===Vermeide mehrfache Signaltreiber (SS6) ===&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
*Ein Signal/Variable soll nur in einem einzigen sequentiellen Block zugewiesen werden.&lt;br /&gt;
=== Vermeide uninitialisierte VHDL Konstante (SS7) ===&lt;br /&gt;
*Stelle sicher das alle VHDL Konstanten initialisiert werden.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide die Nutzung des Taktes als Data (SS8)===&lt;br /&gt;
*Takt-Signale sollen nicht in einem Logik-pfad das den D-Eingang eines FF treiben.&lt;br /&gt;
*Schweregrad: Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemeinsame genutzte Takt und Resetsignal (SS9) ===&lt;br /&gt;
*Ein Signal sollte nicht sowohl als Takt und auch als Resetsignal benutzt werden.&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide geschaltetet Takte (SS10) ===&lt;br /&gt;
*Datensignale sollten nicht in einen logik-pfad benutzt werden das den CLK-Eingang eines Registers treibt.&lt;br /&gt;
*Schweregrad:Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern genrierte Takte (SS11) ===&lt;br /&gt;
*Vermeide intern generierte Taktsignale.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide intern generierte Reset (SS12) ===&lt;br /&gt;
*Vermeide intern generierte Reset, außer sie sind ordentlich isoliert.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Resets unterschiedlicher Polarität (SS13) ===&lt;br /&gt;
*Ein und dasselbe Resetsignal sollte nicht mit unterschiedlicher Polarität oder Stil benutzt werden.&lt;br /&gt;
*Schweregrad:Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Register ohne Reset (SS14) ===&lt;br /&gt;
*Alle Register sollten eine reset-Steuerleitung haben.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide asynchrone deaktivierten Reset (SS15) ===&lt;br /&gt;
*Resets sollten synchron freigegeben werden.&lt;br /&gt;
*Schweregrad:Fehler&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Zuweisung bei der Initialisierung (SS16) ===&lt;br /&gt;
*Verwende keine register initialisierung.&lt;br /&gt;
*Schwerergrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Logic ohne Treiber oder Nutzen (SS17) === &lt;br /&gt;
*a) Jedes Register und latch muss benutzt und getrieben werden.&lt;br /&gt;
*b) Register und latches die nur unebenutzte Logik treiben müßen untersucht werden.&lt;br /&gt;
Schweregrad:Error&lt;br /&gt;
&lt;br /&gt;
=== Stelle sicher das Register steuerbar bleiben (SS18) ===&lt;br /&gt;
*Jedes Register soll über seine Eingänge steuerbar sein.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Schlangengleiche Verdrahtungen (SS19) ===&lt;br /&gt;
*Kombinatorische Pfade sollen nicht tiefer als eine vorgegebenes maximale Logiktiefe sein.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle Grenze für Verschachtelungen sicher (SS20) ===&lt;br /&gt;
*Bedingte Verzweigungen sind nur bis zu einer maximalen Verschachtelungstiefe zu gestatten.&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle stets gleiche Richtung der Vektorindizierung sicher (SS21) ===&lt;br /&gt;
*Benutze die selbe multibit Vektor indizierung (downt/to) im gesamten design konsequent&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code-Durchsichten - Design Reviews (DR)==&lt;br /&gt;
=== Verwende Labels für Staements (DR1) ===&lt;br /&gt;
*case- Konstrukte, Always und initial blocks sollen labels haben.&lt;br /&gt;
*Scheregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide gemischte Groß-/Kleinschreibung zur Unterscheidung (DR2)===&lt;br /&gt;
*Name sollen nicht allein an Groß und Kleinschreibung unterscheidbar&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle eindeutige Namensräume sicher (DR3)===&lt;br /&gt;
*Der selbe Name soll nicht für verschiedenen typen von identifiers benutzt werden&lt;br /&gt;
*Schweregrad: Error&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Deklarations Stil&amp;quot; (DR4)===&lt;br /&gt;
*Eine Zeile für eine Deklaration&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Nutze &amp;quot;Trennenden Statement Stil&amp;quot; (DR5)===&lt;br /&gt;
*eine Zeile für eine Anweisung&lt;br /&gt;
*Schweregrad:Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Einrückungen sicher (DR6)===&lt;br /&gt;
*Code soll einheitlich eingerückt sein&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide Tabulatoren (DR7) ===&lt;br /&gt;
*&#039;&#039;Tabulatoren sollen nicht benutzt werden.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Vermeide lange Files (DR8)===&lt;br /&gt;
*&#039;&#039;Das Design soll in Unterdesigns gegliedert sein und datein sollen nach Belieben lang sein.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle über Hierarchien einheitliche Signalnamen sicher (DR9)===&lt;br /&gt;
*&#039;&#039;Signale und Busse sollen über das gesamte Design einheitliche Namen haben.&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle einheitlichen Datei-Header sicher (DR10) ===&lt;br /&gt;
*&#039;&#039;Stelle einheitliche File header sicher&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ausreichende Kommentardichte sicher (DR11) ===&lt;br /&gt;
*&#039;&#039;Code soll durch inline Kommantare ausreichend dokumentiert sein&#039;&#039;&lt;br /&gt;
*Schweregrad: Warning&lt;br /&gt;
&lt;br /&gt;
=== Stelle ordentliche Paltzierung von Kommentaren sicher (DR12) ===&lt;br /&gt;
*&#039;&#039;Kommentare sollten so platziert sein das sie das Verständniss unterstützen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=== Stelle Firmenspezifische Namensstandard sicher (DR13) ===&lt;br /&gt;
*&#039;&#039;Jede Firma oder project soll ihre eigenen Codestandards definieren und durchsetzen.&#039;&#039;&lt;br /&gt;
*Schweregrad: Note&lt;br /&gt;
&lt;br /&gt;
=Literatur=&lt;br /&gt;
*[DOUG] DO-254 User Group  Position Paper DO254-UG-001 „Best PracticeVHDL Coding Standards for DO-254 Programs, modified 2010-Sep-13 &lt;br /&gt;
*[Fulton] Randall Fulton, Ray Vandermolen „Airborne Electronic Hardware Design Assurance - A practitioners  Guide to RTCA/DO-254“, CRC Press 2015&lt;br /&gt;
*[Synopsys] Synopsys Inc. White paper „Understanding DO-254 Compliance for the verification of Airborne Digital Hardware“&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87889</id>
		<title>Xilinx Microblaze MCS Workflow</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87889"/>
		<updated>2015-03-12T22:01:47Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Erstellung Board support package */ Kurz und knackig&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-Feb-27 -&amp;gt; Material,Tips zur Fehlersuch und Screenshots sammeln&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt wie der 32bit Softcore &amp;quot;microblaze MCS&amp;quot; in FPGA verwendet wird.&lt;br /&gt;
Verwendet wird dabei die kostenfrei verfügbare &amp;quot;leichtgewichtige&amp;quot; MicroBlaze-mcs  (µB-MCS) Variante aus dem coregenerator (ab ISE 13.4 (ab 01/2013) und Vivado) und nicht die kostenpflichtige MicroBlaze (ohne -MCS) Variante.&lt;br /&gt;
&lt;br /&gt;
=MicroBlaze und MicroBlaze MCS=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ablauf=&lt;br /&gt;
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:&lt;br /&gt;
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und FPGA ohne microblaze-Core implementieren&lt;br /&gt;
*Generierung des Softcore im CoreGenerator&lt;br /&gt;
*Instanziierung Core, Script für bm referenz ausführen und FPGA mit microblaze-Core implementieren&lt;br /&gt;
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)&lt;br /&gt;
*Erstellung und Kompilierung des Programms&lt;br /&gt;
*Zusammenfügen programm-binarie mit FPGA-bitstream file&lt;br /&gt;
&lt;br /&gt;
=Benötigte Software=&lt;br /&gt;
Es wird von Xilinx die FPGA Implementierungssoftware und das Software Development Kit (SDK)benötigt. Nutzer der FPGA&#039;s vor der 7Serie (bspw Spartan3-Großfamilie, Spartan-6, Virtex5/6) muüßen installieren:&lt;br /&gt;
*ISE Design Suite: WebPack edition&lt;br /&gt;
*ISE Design Suite: Embedded edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )&lt;br /&gt;
&lt;br /&gt;
Nutzer der neueren 7er Reihe dagegen benötigen:&lt;br /&gt;
*Vivado Design Suite Webpack edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)&lt;br /&gt;
&lt;br /&gt;
=Beispiel=&lt;br /&gt;
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- (FIT) und ein programmierbarer Zähler (PIT) generiert.&lt;br /&gt;
[[Datei:Mcs block.png|thumb|center|400px|Blockdiagramm Beispiel]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Core ist ein weitere Zähler -&#039;&#039;heartbeat&#039;&#039;- im Design. Die drei Ausgangsporst sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr 8 wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. Damit lassen sich 3 Implementierungsziele detektieren.&lt;br /&gt;
*Nix blinkt -&amp;gt; Totalversagen&lt;br /&gt;
*LED Nr. 8 blinkt -&amp;gt; FPGA erfolgreich geladen und gestartet&lt;br /&gt;
*LED 8 und 7 blinken: -&amp;gt; microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.&lt;br /&gt;
*Aktivität auf allen 8 LED&#039;s -&amp;gt; Perfekt&lt;br /&gt;
&lt;br /&gt;
=FPGA-Implementierung und SoftCore-Generierung=&lt;br /&gt;
==FPGA-Gerüst==&lt;br /&gt;
Es ist Empfehlenswert zuerst ein &amp;quot;Basis-FPGA&amp;quot; ohne µB fertigzustellen und zu testen. Hier wurde das zum Starterkit gehörige Demo adaptiert und somit war schon mal die Pinzuordnung und das Taktsystem fehlerfrei. Eine heartbeat-LED die im Sekundentakt blinkt grenzt den Fehler deutlich ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CoreGen==&lt;br /&gt;
CoreGen starten (beispw. Programme -&amp;gt; Xilinx -&amp;gt; ISE 14.7 -&amp;gt; ISE Design tools -&amp;gt; 64bit tools -&amp;gt; coregen). Project für den benutzen FPGA aufsetzen (hier im Beispiel S3AN-700; package: FGG484; speedgrade 4; Verilog)&lt;br /&gt;
&lt;br /&gt;
Im IP Catalog findet sich der MCE unter embedded Processing -&amp;gt; processors -&amp;gt; microblaze MCE :&lt;br /&gt;
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zum Screenshot sollte man den Speicher auf mindestens 8 kByte setzen. Die Angabe der Taktfrequenz ist nur für die Berechnung des Baudraten-Teilers für die UART wichtig. Benutzt man die UART nicht, ist dieser Wert  (theoretisch?) für den Core bedeutungslos. Das Place&amp;amp;Route für den FPGA richtet sich nach der Taktvorgabe aus dem ucf-file.&lt;br /&gt;
Die in den Karteikarten gezeigten Kürzel stehen für die einzigen &amp;quot;Peripherie-controllern&amp;quot; die für dem µB-MCS generiert&lt;br /&gt;
werden können. Mit dem weiterhin kostenpflichten Platform Studio sind weitere Cores einfach hinzufügbar. Aber beim MCS muß man nicht komplett darauf verzichten da an dem IO-Bus selbtgeschriebene Komponenten angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
*UART: feste Baudrate, Interrupt für RX&lt;br /&gt;
*FIT:  Fixed length timer -4 möglich&lt;br /&gt;
*PIT: programmable Timer - 4 möglich&lt;br /&gt;
*GPO: Generalpurpose Output-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*GPI: Generalpurpose Input-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*INT: External Interrupt Sources&lt;br /&gt;
&lt;br /&gt;
Für die Treiber kann auch ein toggle output signal generiert werden das immer beim Erreichen der &#039;0&#039; invertiert wird.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]&lt;br /&gt;
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]&lt;br /&gt;
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]&lt;br /&gt;
Mit&lt;br /&gt;
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]&lt;br /&gt;
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]&lt;br /&gt;
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
==Vorbereitung Synthese mit MCS core==&lt;br /&gt;
&lt;br /&gt;
==Top-Level==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
wire heartbeat_s;&lt;br /&gt;
  &lt;br /&gt;
  wire  [7:0] GPO1_s;   //display data&lt;br /&gt;
  wire  [3:0] GPO2_s;   //display control&lt;br /&gt;
  wire  [6:0] GPO3_s;   // led&#039;s&lt;br /&gt;
  wire  [7:0] GPI1_s;  //switches&lt;br /&gt;
  &lt;br /&gt;
  wire FIT1_Toggle_s;&lt;br /&gt;
  &lt;br /&gt;
MikroBlaze_mcs microblaze_s3an_disp (&lt;br /&gt;
  .Clk(clk),                       // input Clk&lt;br /&gt;
  .Reset(rst),                     // input Reset&lt;br /&gt;
  .FIT1_Toggle(FIT1_Toggle_s),       // output fixed timer toggler (every 25M ticks)&lt;br /&gt;
  .FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt&lt;br /&gt;
  .FIT2_Toggle(/*FIT2_Toggle*/),       // UNUSED - output FIT2_Toggle&lt;br /&gt;
  .PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt&lt;br /&gt;
  .PIT1_Toggle(/*PIT1_Toggle*/),       // UNUSED - output PIT1_Toggle&lt;br /&gt;
  .GPO1(GPO1_s),                       // output [7 : 0] GPO1&lt;br /&gt;
  .GPO2(GPO2_s),                       // output [3 : 0] GPO2&lt;br /&gt;
  .GPO3(GPO3_s),                       // output [6 : 0] GPO3  &lt;br /&gt;
  .GPI1(GPI1_s),                       // input  [7 : 0] GPI1&lt;br /&gt;
  .GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt&lt;br /&gt;
  .INTC_IRQ(/*INTC_IRQ*/)              // UNUSED - output INTC_IRQ&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(posedge clk)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
 assign LCD_DB = GPO1_s[7:0];&lt;br /&gt;
 assign LCD_RW = GPO2_s[0];&lt;br /&gt;
 assign LCD_RS = GPO2_s[1];&lt;br /&gt;
 assign LCD_E  = GPO2_s[2];&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
heartbeat heartbeat(&lt;br /&gt;
   .clk(clk),&lt;br /&gt;
   .rst(rst),&lt;br /&gt;
   .heartbeat_o(heartbeat_s)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign LED[7] = heartbeat_s;  &lt;br /&gt;
assign LED[6] = FIT1_Toggle_s; &lt;br /&gt;
assign LED[5:0] = GPO3_s[5:0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FPGA Implementierung ==&lt;br /&gt;
Am besten den FPGA mit den µB-MCS &#039;&#039;&#039;vor&#039;&#039;&#039; der Vorbereitung des SDK komplett implementieren und auf das Board laden. Es müßen die LED&#039;s 7 und 8 mit jeweils eigene Frequenz blinken. Wenn nicht, dann ist bei der Generierung und Instanziierung des Cores ein Fehler unterlaufen.&lt;br /&gt;
&lt;br /&gt;
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (&#039;&#039;ISE:View-&amp;gt;Panels-&amp;gt;Tcl Console&#039;&#039;) dann erscheint unten eine schmale Zeile in der Tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.&lt;br /&gt;
&lt;br /&gt;
Jetzt das vom &#039;&#039;coregen&#039;&#039; erzeugte tcl Script starten: &#039;&#039;source ../core/microblaze_mcs_setup.tcl&#039;&#039; . Dieses script fügt eine Option für das tool &#039;&#039;ngdbuild&#039;&#039; (Process &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot;) bei der Implementierung&lt;br /&gt;
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot; im Process-Fenster und &amp;quot;process properties&amp;quot; auswählen. Es findet sich jetzt in der Zeile &amp;quot;Other ... options&amp;quot; ein Eintrag beginnend mit &amp;quot;-bm&amp;quot; der auf eine ebenfalls von coregen erzeugtes *.bmm Datei zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.&lt;br /&gt;
Der Teil ganz links ist der in ersten &#039;&#039;CoreGen&#039;&#039;-Fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst&lt;br /&gt;
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den &amp;quot;Process Properties&amp;quot; läuft zwar der Schritt Translate und alle Folgenden&lt;br /&gt;
durch, aber es wird Probleme bei &amp;quot;Vereinigung von Programm-binarie und FPGA bitfile&amp;quot; geben -&amp;gt; die FPGA logic wird zwar funktionieren, aber es wird kein Programm &lt;br /&gt;
auf dem Softcore laufen.&lt;br /&gt;
&lt;br /&gt;
=Generierung Compilerumgebung und microblaze-programm=&lt;br /&gt;
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, &lt;br /&gt;
das findet sich im Ordner EDK (Embedded Development Kit):&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]&lt;br /&gt;
&lt;br /&gt;
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.&lt;br /&gt;
&lt;br /&gt;
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er &lt;br /&gt;
das fenster &amp;quot;project explorer&amp;quot; überdeckt. Jetzt müßen wir nacheinander 3 verschieden &amp;quot;typen&amp;quot; von &amp;quot;projekten&amp;quot; anlegen:&lt;br /&gt;
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.&lt;br /&gt;
 Diese benötigt die Infos aus dem Coregenlauf&lt;br /&gt;
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem&lt;br /&gt;
*C/C++projekt die leere C-datei für das eigentliche Programm&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sdk project wizards.png|thumb|center|400px|New -&amp;gt; Projects]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Platform Specification==&lt;br /&gt;
File -&amp;gt; new -&amp;gt; project -&amp;gt; Xilinx -&amp;gt; Hardware Platform Specification&lt;br /&gt;
&lt;br /&gt;
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit&lt;br /&gt;
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf&lt;br /&gt;
anzugeben, es findet sich daher in dem Verzeichniss Core.&lt;br /&gt;
&lt;br /&gt;
==Erstellung Hardware project==&lt;br /&gt;
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]&lt;br /&gt;
==Erstellung Board support package==&lt;br /&gt;
Nachdem die Infodateien für die Hardware des µB-MCE System generiert worden, werden nun dazu passende Header Dateien und Bibliotheken&lt;br /&gt;
generiert. Die erstellten Dateien werden auch als &amp;quot;Board support package&amp;quot; bezeichnet. Dazu wird das Menü File -&amp;gt; New -&amp;gt; &amp;quot;Board Support package&amp;quot; audgewählt, dem Namen des support packages sollte man eine Endung wie _BSP anhängen. Im Feld &amp;quot;Target Hardware&amp;quot; trägt man die gerade erstellte Plattform ein, als Betriebssystem &amp;quot;OS&amp;quot; ist standalone eingetragen.&lt;br /&gt;
[[Datei:Ss sdk file new board support package.png|thumb|400px|center|Aufsetzen board support package]]&lt;br /&gt;
&lt;br /&gt;
==Erstellung Programm==&lt;br /&gt;
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;xparameters.h&amp;gt;&lt;br /&gt;
#include &amp;lt;xiomodule.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_DELAY 100000&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	//instantiate IOs&lt;br /&gt;
	XIOModule GPIO;&lt;br /&gt;
&lt;br /&gt;
	volatile u32 i = 0;&lt;br /&gt;
&lt;br /&gt;
	//initialize IOs&lt;br /&gt;
	XIOModule_Initialize(&amp;amp;GPIO, XPAR_IOMODULE_0_DEVICE_ID);&lt;br /&gt;
	XIOModule_Start(&amp;amp;GPIO);&lt;br /&gt;
&lt;br /&gt;
	//LED&lt;br /&gt;
	bool led_on = false;&lt;br /&gt;
	int run = 1;&lt;br /&gt;
&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		if (led_on) {XIOModule_DiscreteWrite(&amp;amp;GPIO, 3,run);&lt;br /&gt;
		             if (run == 0x20) run = 1; else run *= 2;}&lt;br /&gt;
		led_on = !led_on;&lt;br /&gt;
		for(i=0;i &amp;lt; LED_DELAY; ++i);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==&lt;br /&gt;
Im Menu &amp;quot;Xilinx Tools&amp;quot; den Punkt &amp;quot;Programm FPGA&amp;quot; auswählen und &lt;br /&gt;
[[Datei:Program FPGA.png|thumb|400px|center|Menu SDK program FPGA]]&lt;br /&gt;
&lt;br /&gt;
anschließend das (beim CoreGen) angelegte *.bmm file, das compilierte Programm (*.elf) und das *.bit File des in der ISE generierten FPGA&#039;s auswählen und den Button &amp;quot;Program&amp;quot; drücken.&lt;br /&gt;
[[Datei:Program FPGA files.png|thumb|400px|center|Auswahl *.bmm *.bit *.elf for programming]]&lt;br /&gt;
&lt;br /&gt;
Jetzt wird mittels der Information über die genutztem BRAM-Blöcke aus der *.bmm-Datei im *.bit-File die Bereiche die die Initdaten für die BRAM-Speicherblöcke enthält mit dem Binary des Programms ausgetauscht und anschließend das FPGA programmiert.&lt;br /&gt;
&lt;br /&gt;
=Fehlersuche=&lt;br /&gt;
Wenn möglich auch die beiden Zwischenergebnisse (&amp;quot;Gesamtdesign ohne MCS-Core instanziierung&amp;quot; und &amp;quot;Mit Core aber ohne Programm&amp;quot; am Board testen. Nur so lassen sich Fehler auf die Schritte im workflow zurückführen. &lt;br /&gt;
&lt;br /&gt;
Bei Änderungen am Core versagt gelegentlich das automatische Update von BPS etc.. Deshalb bei Coreänderungen die obsoleten Projekte (Hardware project, BSP und C-projekt) löschen und den workflow ab Schritt &amp;quot;tcl.script&amp;quot; wiederholen.&lt;br /&gt;
&lt;br /&gt;
Fehlermeldungen in die Eingabemaske von google kopieren und nach Antworten bei Xilinx oder Internetforen suchen. Das führt bei den&lt;br /&gt;
oft verwirrenden Fehlermeldungen schnell zum Erfolg. So weist diese Meldung über Memory leaks:&lt;br /&gt;
[[Datei:Ss more ngdbuilt error.png|400px|thumb|center|ngdbuil error]]&lt;br /&gt;
eigentlich darauf hin, das der Instanzname des MCS-cores nicht stimmt. Der &amp;quot;Answer record&amp;quot; bei Xilinx http://www.xilinx.com/support/answers/51538.html erklärt wie man den korrekten Namen findet und in das BMM-file einträgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Literatur =&lt;br /&gt;
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. &lt;br /&gt;
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.&lt;br /&gt;
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html&lt;br /&gt;
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity&lt;br /&gt;
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_4/ds865_microblaze_mcs.pdf - XILINX DS865, die offizielle Beschreibung des Cores&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/pg116-microblaze-mcs.pdf - XILINX PG116, die offizielle Anleitung für Vivado&lt;br /&gt;
*http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx14_5/pg048-microblaze-mcs.pdf - Xilinx PG048, die offizielle Anleitung für Vivado&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Ss_sdk_file_new_board_support_package.png&amp;diff=87888</id>
		<title>Datei:Ss sdk file new board support package.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Ss_sdk_file_new_board_support_package.png&amp;diff=87888"/>
		<updated>2015-03-12T21:45:43Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Screenshoot Xilinx SDK - board support package Lizenz: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshoot Xilinx SDK - board support package Lizenz: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87887</id>
		<title>Xilinx Microblaze MCS Workflow</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87887"/>
		<updated>2015-03-12T21:27:50Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* CoreGen */ Typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-Feb-27 -&amp;gt; Material,Tips zur Fehlersuch und Screenshots sammeln&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt wie der 32bit Softcore &amp;quot;microblaze MCS&amp;quot; in FPGA verwendet wird.&lt;br /&gt;
Verwendet wird dabei die kostenfrei verfügbare &amp;quot;leichtgewichtige&amp;quot; MicroBlaze-mcs  (µB-MCS) Variante aus dem coregenerator (ab ISE 13.4 (ab 01/2013) und Vivado) und nicht die kostenpflichtige MicroBlaze (ohne -MCS) Variante.&lt;br /&gt;
&lt;br /&gt;
=MicroBlaze und MicroBlaze MCS=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ablauf=&lt;br /&gt;
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:&lt;br /&gt;
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und FPGA ohne microblaze-Core implementieren&lt;br /&gt;
*Generierung des Softcore im CoreGenerator&lt;br /&gt;
*Instanziierung Core, Script für bm referenz ausführen und FPGA mit microblaze-Core implementieren&lt;br /&gt;
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)&lt;br /&gt;
*Erstellung und Kompilierung des Programms&lt;br /&gt;
*Zusammenfügen programm-binarie mit FPGA-bitstream file&lt;br /&gt;
&lt;br /&gt;
=Benötigte Software=&lt;br /&gt;
Es wird von Xilinx die FPGA Implementierungssoftware und das Software Development Kit (SDK)benötigt. Nutzer der FPGA&#039;s vor der 7Serie (bspw Spartan3-Großfamilie, Spartan-6, Virtex5/6) muüßen installieren:&lt;br /&gt;
*ISE Design Suite: WebPack edition&lt;br /&gt;
*ISE Design Suite: Embedded edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )&lt;br /&gt;
&lt;br /&gt;
Nutzer der neueren 7er Reihe dagegen benötigen:&lt;br /&gt;
*Vivado Design Suite Webpack edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)&lt;br /&gt;
&lt;br /&gt;
=Beispiel=&lt;br /&gt;
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- (FIT) und ein programmierbarer Zähler (PIT) generiert.&lt;br /&gt;
[[Datei:Mcs block.png|thumb|center|400px|Blockdiagramm Beispiel]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Core ist ein weitere Zähler -&#039;&#039;heartbeat&#039;&#039;- im Design. Die drei Ausgangsporst sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr 8 wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. Damit lassen sich 3 Implementierungsziele detektieren.&lt;br /&gt;
*Nix blinkt -&amp;gt; Totalversagen&lt;br /&gt;
*LED Nr. 8 blinkt -&amp;gt; FPGA erfolgreich geladen und gestartet&lt;br /&gt;
*LED 8 und 7 blinken: -&amp;gt; microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.&lt;br /&gt;
*Aktivität auf allen 8 LED&#039;s -&amp;gt; Perfekt&lt;br /&gt;
&lt;br /&gt;
=FPGA-Implementierung und SoftCore-Generierung=&lt;br /&gt;
==FPGA-Gerüst==&lt;br /&gt;
Es ist Empfehlenswert zuerst ein &amp;quot;Basis-FPGA&amp;quot; ohne µB fertigzustellen und zu testen. Hier wurde das zum Starterkit gehörige Demo adaptiert und somit war schon mal die Pinzuordnung und das Taktsystem fehlerfrei. Eine heartbeat-LED die im Sekundentakt blinkt grenzt den Fehler deutlich ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CoreGen==&lt;br /&gt;
CoreGen starten (beispw. Programme -&amp;gt; Xilinx -&amp;gt; ISE 14.7 -&amp;gt; ISE Design tools -&amp;gt; 64bit tools -&amp;gt; coregen). Project für den benutzen FPGA aufsetzen (hier im Beispiel S3AN-700; package: FGG484; speedgrade 4; Verilog)&lt;br /&gt;
&lt;br /&gt;
Im IP Catalog findet sich der MCE unter embedded Processing -&amp;gt; processors -&amp;gt; microblaze MCE :&lt;br /&gt;
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zum Screenshot sollte man den Speicher auf mindestens 8 kByte setzen. Die Angabe der Taktfrequenz ist nur für die Berechnung des Baudraten-Teilers für die UART wichtig. Benutzt man die UART nicht, ist dieser Wert  (theoretisch?) für den Core bedeutungslos. Das Place&amp;amp;Route für den FPGA richtet sich nach der Taktvorgabe aus dem ucf-file.&lt;br /&gt;
Die in den Karteikarten gezeigten Kürzel stehen für die einzigen &amp;quot;Peripherie-controllern&amp;quot; die für dem µB-MCS generiert&lt;br /&gt;
werden können. Mit dem weiterhin kostenpflichten Platform Studio sind weitere Cores einfach hinzufügbar. Aber beim MCS muß man nicht komplett darauf verzichten da an dem IO-Bus selbtgeschriebene Komponenten angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
*UART: feste Baudrate, Interrupt für RX&lt;br /&gt;
*FIT:  Fixed length timer -4 möglich&lt;br /&gt;
*PIT: programmable Timer - 4 möglich&lt;br /&gt;
*GPO: Generalpurpose Output-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*GPI: Generalpurpose Input-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*INT: External Interrupt Sources&lt;br /&gt;
&lt;br /&gt;
Für die Treiber kann auch ein toggle output signal generiert werden das immer beim Erreichen der &#039;0&#039; invertiert wird.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]&lt;br /&gt;
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]&lt;br /&gt;
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]&lt;br /&gt;
Mit&lt;br /&gt;
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]&lt;br /&gt;
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]&lt;br /&gt;
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
==Vorbereitung Synthese mit MCS core==&lt;br /&gt;
&lt;br /&gt;
==Top-Level==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
wire heartbeat_s;&lt;br /&gt;
  &lt;br /&gt;
  wire  [7:0] GPO1_s;   //display data&lt;br /&gt;
  wire  [3:0] GPO2_s;   //display control&lt;br /&gt;
  wire  [6:0] GPO3_s;   // led&#039;s&lt;br /&gt;
  wire  [7:0] GPI1_s;  //switches&lt;br /&gt;
  &lt;br /&gt;
  wire FIT1_Toggle_s;&lt;br /&gt;
  &lt;br /&gt;
MikroBlaze_mcs microblaze_s3an_disp (&lt;br /&gt;
  .Clk(clk),                       // input Clk&lt;br /&gt;
  .Reset(rst),                     // input Reset&lt;br /&gt;
  .FIT1_Toggle(FIT1_Toggle_s),       // output fixed timer toggler (every 25M ticks)&lt;br /&gt;
  .FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt&lt;br /&gt;
  .FIT2_Toggle(/*FIT2_Toggle*/),       // UNUSED - output FIT2_Toggle&lt;br /&gt;
  .PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt&lt;br /&gt;
  .PIT1_Toggle(/*PIT1_Toggle*/),       // UNUSED - output PIT1_Toggle&lt;br /&gt;
  .GPO1(GPO1_s),                       // output [7 : 0] GPO1&lt;br /&gt;
  .GPO2(GPO2_s),                       // output [3 : 0] GPO2&lt;br /&gt;
  .GPO3(GPO3_s),                       // output [6 : 0] GPO3  &lt;br /&gt;
  .GPI1(GPI1_s),                       // input  [7 : 0] GPI1&lt;br /&gt;
  .GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt&lt;br /&gt;
  .INTC_IRQ(/*INTC_IRQ*/)              // UNUSED - output INTC_IRQ&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(posedge clk)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
 assign LCD_DB = GPO1_s[7:0];&lt;br /&gt;
 assign LCD_RW = GPO2_s[0];&lt;br /&gt;
 assign LCD_RS = GPO2_s[1];&lt;br /&gt;
 assign LCD_E  = GPO2_s[2];&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
heartbeat heartbeat(&lt;br /&gt;
   .clk(clk),&lt;br /&gt;
   .rst(rst),&lt;br /&gt;
   .heartbeat_o(heartbeat_s)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign LED[7] = heartbeat_s;  &lt;br /&gt;
assign LED[6] = FIT1_Toggle_s; &lt;br /&gt;
assign LED[5:0] = GPO3_s[5:0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FPGA Implementierung ==&lt;br /&gt;
Am besten den FPGA mit den µB-MCS &#039;&#039;&#039;vor&#039;&#039;&#039; der Vorbereitung des SDK komplett implementieren und auf das Board laden. Es müßen die LED&#039;s 7 und 8 mit jeweils eigene Frequenz blinken. Wenn nicht, dann ist bei der Generierung und Instanziierung des Cores ein Fehler unterlaufen.&lt;br /&gt;
&lt;br /&gt;
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (&#039;&#039;ISE:View-&amp;gt;Panels-&amp;gt;Tcl Console&#039;&#039;) dann erscheint unten eine schmale Zeile in der Tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.&lt;br /&gt;
&lt;br /&gt;
Jetzt das vom &#039;&#039;coregen&#039;&#039; erzeugte tcl Script starten: &#039;&#039;source ../core/microblaze_mcs_setup.tcl&#039;&#039; . Dieses script fügt eine Option für das tool &#039;&#039;ngdbuild&#039;&#039; (Process &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot;) bei der Implementierung&lt;br /&gt;
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot; im Process-Fenster und &amp;quot;process properties&amp;quot; auswählen. Es findet sich jetzt in der Zeile &amp;quot;Other ... options&amp;quot; ein Eintrag beginnend mit &amp;quot;-bm&amp;quot; der auf eine ebenfalls von coregen erzeugtes *.bmm Datei zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.&lt;br /&gt;
Der Teil ganz links ist der in ersten &#039;&#039;CoreGen&#039;&#039;-Fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst&lt;br /&gt;
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den &amp;quot;Process Properties&amp;quot; läuft zwar der Schritt Translate und alle Folgenden&lt;br /&gt;
durch, aber es wird Probleme bei &amp;quot;Vereinigung von Programm-binarie und FPGA bitfile&amp;quot; geben -&amp;gt; die FPGA logic wird zwar funktionieren, aber es wird kein Programm &lt;br /&gt;
auf dem Softcore laufen.&lt;br /&gt;
&lt;br /&gt;
=Generierung Compilerumgebung und microblaze-programm=&lt;br /&gt;
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, &lt;br /&gt;
das findet sich im Ordner EDK (Embedded Development Kit):&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]&lt;br /&gt;
&lt;br /&gt;
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.&lt;br /&gt;
&lt;br /&gt;
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er &lt;br /&gt;
das fenster &amp;quot;project explorer&amp;quot; überdeckt. Jetzt müßen wir nacheinander 3 verschieden &amp;quot;typen&amp;quot; von &amp;quot;projekten&amp;quot; anlegen:&lt;br /&gt;
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.&lt;br /&gt;
 Diese benötigt die Infos aus dem Coregenlauf&lt;br /&gt;
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem&lt;br /&gt;
*C/C++projekt die leere C-datei für das eigentliche Programm&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sdk project wizards.png|thumb|center|400px|New -&amp;gt; Projects]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Platform Specification==&lt;br /&gt;
File -&amp;gt; new -&amp;gt; project -&amp;gt; Xilinx -&amp;gt; Hardware Platform Specification&lt;br /&gt;
&lt;br /&gt;
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit&lt;br /&gt;
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf&lt;br /&gt;
anzugeben, es findet sich daher in dem Verzeichniss Core.&lt;br /&gt;
&lt;br /&gt;
==Erstellung Hardware project==&lt;br /&gt;
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]&lt;br /&gt;
==Erstellung Board support package==&lt;br /&gt;
==Erstellung Programm==&lt;br /&gt;
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;xparameters.h&amp;gt;&lt;br /&gt;
#include &amp;lt;xiomodule.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_DELAY 100000&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	//instantiate IOs&lt;br /&gt;
	XIOModule GPIO;&lt;br /&gt;
&lt;br /&gt;
	volatile u32 i = 0;&lt;br /&gt;
&lt;br /&gt;
	//initialize IOs&lt;br /&gt;
	XIOModule_Initialize(&amp;amp;GPIO, XPAR_IOMODULE_0_DEVICE_ID);&lt;br /&gt;
	XIOModule_Start(&amp;amp;GPIO);&lt;br /&gt;
&lt;br /&gt;
	//LED&lt;br /&gt;
	bool led_on = false;&lt;br /&gt;
	int run = 1;&lt;br /&gt;
&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		if (led_on) {XIOModule_DiscreteWrite(&amp;amp;GPIO, 3,run);&lt;br /&gt;
		             if (run == 0x20) run = 1; else run *= 2;}&lt;br /&gt;
		led_on = !led_on;&lt;br /&gt;
		for(i=0;i &amp;lt; LED_DELAY; ++i);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==&lt;br /&gt;
Im Menu &amp;quot;Xilinx Tools&amp;quot; den Punkt &amp;quot;Programm FPGA&amp;quot; auswählen und &lt;br /&gt;
[[Datei:Program FPGA.png|thumb|400px|center|Menu SDK program FPGA]]&lt;br /&gt;
&lt;br /&gt;
anschließend das (beim CoreGen) angelegte *.bmm file, das compilierte Programm (*.elf) und das *.bit File des in der ISE generierten FPGA&#039;s auswählen und den Button &amp;quot;Program&amp;quot; drücken.&lt;br /&gt;
[[Datei:Program FPGA files.png|thumb|400px|center|Auswahl *.bmm *.bit *.elf for programming]]&lt;br /&gt;
&lt;br /&gt;
Jetzt wird mittels der Information über die genutztem BRAM-Blöcke aus der *.bmm-Datei im *.bit-File die Bereiche die die Initdaten für die BRAM-Speicherblöcke enthält mit dem Binary des Programms ausgetauscht und anschließend das FPGA programmiert.&lt;br /&gt;
&lt;br /&gt;
=Fehlersuche=&lt;br /&gt;
Wenn möglich auch die beiden Zwischenergebnisse (&amp;quot;Gesamtdesign ohne MCS-Core instanziierung&amp;quot; und &amp;quot;Mit Core aber ohne Programm&amp;quot; am Board testen. Nur so lassen sich Fehler auf die Schritte im workflow zurückführen. &lt;br /&gt;
&lt;br /&gt;
Bei Änderungen am Core versagt gelegentlich das automatische Update von BPS etc.. Deshalb bei Coreänderungen die obsoleten Projekte (Hardware project, BSP und C-projekt) löschen und den workflow ab Schritt &amp;quot;tcl.script&amp;quot; wiederholen.&lt;br /&gt;
&lt;br /&gt;
Fehlermeldungen in die Eingabemaske von google kopieren und nach Antworten bei Xilinx oder Internetforen suchen. Das führt bei den&lt;br /&gt;
oft verwirrenden Fehlermeldungen schnell zum Erfolg. So weist diese Meldung über Memory leaks:&lt;br /&gt;
[[Datei:Ss more ngdbuilt error.png|400px|thumb|center|ngdbuil error]]&lt;br /&gt;
eigentlich darauf hin, das der Instanzname des MCS-cores nicht stimmt. Der &amp;quot;Answer record&amp;quot; bei Xilinx http://www.xilinx.com/support/answers/51538.html erklärt wie man den korrekten Namen findet und in das BMM-file einträgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Literatur =&lt;br /&gt;
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. &lt;br /&gt;
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.&lt;br /&gt;
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html&lt;br /&gt;
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity&lt;br /&gt;
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_4/ds865_microblaze_mcs.pdf - XILINX DS865, die offizielle Beschreibung des Cores&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/pg116-microblaze-mcs.pdf - XILINX PG116, die offizielle Anleitung für Vivado&lt;br /&gt;
*http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx14_5/pg048-microblaze-mcs.pdf - Xilinx PG048, die offizielle Anleitung für Vivado&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87886</id>
		<title>Xilinx Microblaze MCS Workflow</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87886"/>
		<updated>2015-03-12T21:11:22Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei */  +screenshots&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-Feb-27 -&amp;gt; Material,Tips zur Fehlersuch und Screenshots sammeln&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt wie der 32bit Softcore &amp;quot;microblaze MCS&amp;quot; in FPGA verwendet wird.&lt;br /&gt;
Verwendet wird dabei die kostenfrei verfügbare &amp;quot;leichtgewichtige&amp;quot; MicroBlaze-mcs  (µB-MCS) Variante aus dem coregenerator (ab ISE 13.4 (ab 01/2013) und Vivado) und nicht die kostenpflichtige MicroBlaze (ohne -MCS) Variante.&lt;br /&gt;
&lt;br /&gt;
=MicroBlaze und MicroBlaze MCS=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ablauf=&lt;br /&gt;
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:&lt;br /&gt;
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und FPGA ohne microblaze-Core implementieren&lt;br /&gt;
*Generierung des Softcore im CoreGenerator&lt;br /&gt;
*Instanziierung Core, Script für bm referenz ausführen und FPGA mit microblaze-Core implementieren&lt;br /&gt;
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)&lt;br /&gt;
*Erstellung und Kompilierung des Programms&lt;br /&gt;
*Zusammenfügen programm-binarie mit FPGA-bitstream file&lt;br /&gt;
&lt;br /&gt;
=Benötigte Software=&lt;br /&gt;
Es wird von Xilinx die FPGA Implementierungssoftware und das Software Development Kit (SDK)benötigt. Nutzer der FPGA&#039;s vor der 7Serie (bspw Spartan3-Großfamilie, Spartan-6, Virtex5/6) muüßen installieren:&lt;br /&gt;
*ISE Design Suite: WebPack edition&lt;br /&gt;
*ISE Design Suite: Embedded edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )&lt;br /&gt;
&lt;br /&gt;
Nutzer der neueren 7er Reihe dagegen benötigen:&lt;br /&gt;
*Vivado Design Suite Webpack edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)&lt;br /&gt;
&lt;br /&gt;
=Beispiel=&lt;br /&gt;
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- (FIT) und ein programmierbarer Zähler (PIT) generiert.&lt;br /&gt;
[[Datei:Mcs block.png|thumb|center|400px|Blockdiagramm Beispiel]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Core ist ein weitere Zähler -&#039;&#039;heartbeat&#039;&#039;- im Design. Die drei Ausgangsporst sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr 8 wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. Damit lassen sich 3 Implementierungsziele detektieren.&lt;br /&gt;
*Nix blinkt -&amp;gt; Totalversagen&lt;br /&gt;
*LED Nr. 8 blinkt -&amp;gt; FPGA erfolgreich geladen und gestartet&lt;br /&gt;
*LED 8 und 7 blinken: -&amp;gt; microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.&lt;br /&gt;
*Aktivität auf allen 8 LED&#039;s -&amp;gt; Perfekt&lt;br /&gt;
&lt;br /&gt;
=FPGA-Implementierung und SoftCore-Generierung=&lt;br /&gt;
==FPGA-Gerüst==&lt;br /&gt;
Es ist Empfehlenswert zuerst ein &amp;quot;Basis-FPGA&amp;quot; ohne µB fertigzustellen und zu testen. Hier wurde das zum Starterkit gehörige Demo adaptiert und somit war schon mal die Pinzuordnung und das Taktsystem fehlerfrei. Eine heartbeat-LED die im Sekundentakt blinkt grenzt den Fehler deutlich ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CoreGen==&lt;br /&gt;
Coregen starten (beispw. Programme -&amp;gt; Xilinx -&amp;gt; ISE 14.7 -&amp;gt; ISE Design tools -&amp;gt; 64bit tools -&amp;gt; coregen) Project für den benutzen FPGA aufsetzen (hier im beispiel S3AN-700; package: FGG484; speedgrade 4 Verilog)&lt;br /&gt;
&lt;br /&gt;
IM IP catalog findet sich der MCE unter embedded Processing -&amp;gt; processors -&amp;gt; microblaze MCE :&lt;br /&gt;
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zum Screenshot sollte man den Speicher auf mindestens 8 kByte setzen. Die Angabe der Taktfrequenz ist für die Berechnung des Baudraten-teilers für die UART wichtig. Benutzt man die UART nicht, ist dieser Wert  (theoretisch?) für den Core bedeutungslos. Das Place&amp;amp;Route für den FPGA richtet sich nach der Taktvorgabe aus dem ucf-file.&lt;br /&gt;
Die in den Karteikarten gezeigten Kürzel stehen für die einzigen &amp;quot;Peripheriecontrollern&amp;quot; die für dem µB-MCS generiert&lt;br /&gt;
werden können. Mit dem weiterhin kostenpflichten Platform Studio sind weitere Cores einfach hinzufügbar. Aber beim MCS muß man nicht komplett darauf verzichten da an dem IO-Bus selbtgeschriebene Komponenten angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
*UART: feste Baudrate, Interrupt für RX&lt;br /&gt;
*FIT:  Fixed length timer -4 möglich&lt;br /&gt;
*PIT: programmable Timer - 4? möglich&lt;br /&gt;
*GPO: Generalpurpose Output-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*GPI: Generalpurpose Input-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*INT: External Interrupt Sources&lt;br /&gt;
&lt;br /&gt;
Für die Treiber kann auch ein toggle output signal geriert werden das immer beim Erreichen der O invertiert wird.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]&lt;br /&gt;
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]&lt;br /&gt;
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]&lt;br /&gt;
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]&lt;br /&gt;
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]&lt;br /&gt;
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
==Vorbereitung Synthese mit MCS core==&lt;br /&gt;
&lt;br /&gt;
==Top-Level==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
wire heartbeat_s;&lt;br /&gt;
  &lt;br /&gt;
  wire  [7:0] GPO1_s;   //display data&lt;br /&gt;
  wire  [3:0] GPO2_s;   //display control&lt;br /&gt;
  wire  [6:0] GPO3_s;   // led&#039;s&lt;br /&gt;
  wire  [7:0] GPI1_s;  //switches&lt;br /&gt;
  &lt;br /&gt;
  wire FIT1_Toggle_s;&lt;br /&gt;
  &lt;br /&gt;
MikroBlaze_mcs microblaze_s3an_disp (&lt;br /&gt;
  .Clk(clk),                       // input Clk&lt;br /&gt;
  .Reset(rst),                     // input Reset&lt;br /&gt;
  .FIT1_Toggle(FIT1_Toggle_s),       // output fixed timer toggler (every 25M ticks)&lt;br /&gt;
  .FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt&lt;br /&gt;
  .FIT2_Toggle(/*FIT2_Toggle*/),       // UNUSED - output FIT2_Toggle&lt;br /&gt;
  .PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt&lt;br /&gt;
  .PIT1_Toggle(/*PIT1_Toggle*/),       // UNUSED - output PIT1_Toggle&lt;br /&gt;
  .GPO1(GPO1_s),                       // output [7 : 0] GPO1&lt;br /&gt;
  .GPO2(GPO2_s),                       // output [3 : 0] GPO2&lt;br /&gt;
  .GPO3(GPO3_s),                       // output [6 : 0] GPO3  &lt;br /&gt;
  .GPI1(GPI1_s),                       // input  [7 : 0] GPI1&lt;br /&gt;
  .GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt&lt;br /&gt;
  .INTC_IRQ(/*INTC_IRQ*/)              // UNUSED - output INTC_IRQ&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(posedge clk)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
 assign LCD_DB = GPO1_s[7:0];&lt;br /&gt;
 assign LCD_RW = GPO2_s[0];&lt;br /&gt;
 assign LCD_RS = GPO2_s[1];&lt;br /&gt;
 assign LCD_E  = GPO2_s[2];&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
heartbeat heartbeat(&lt;br /&gt;
   .clk(clk),&lt;br /&gt;
   .rst(rst),&lt;br /&gt;
   .heartbeat_o(heartbeat_s)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign LED[7] = heartbeat_s;  &lt;br /&gt;
assign LED[6] = FIT1_Toggle_s; &lt;br /&gt;
assign LED[5:0] = GPO3_s[5:0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FPGA Implementierung ==&lt;br /&gt;
Am besten den FPGA mit den µB-MCS &#039;&#039;&#039;vor&#039;&#039;&#039; der Vorbereitung des SDK komplett implementieren und auf das Board laden. Es müßen die LED&#039;s 7 und 8 mit jeweils eigene Frequenz blinken. Wenn nicht, dann ist bei der Generierung und Instanziierung des Cores ein Fehler unterlaufen.&lt;br /&gt;
&lt;br /&gt;
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (&#039;&#039;ISE:View-&amp;gt;Panels-&amp;gt;Tcl Console&#039;&#039;) dann erscheint unten eine schmale Zeile in der Tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.&lt;br /&gt;
&lt;br /&gt;
Jetzt das vom &#039;&#039;coregen&#039;&#039; erzeugte tcl Script starten: &#039;&#039;source ../core/microblaze_mcs_setup.tcl&#039;&#039; . Dieses script fügt eine Option für das tool &#039;&#039;ngdbuild&#039;&#039; (Process &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot;) bei der Implementierung&lt;br /&gt;
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot; im Process-Fenster und &amp;quot;process properties&amp;quot; auswählen. Es findet sich jetzt in der Zeile &amp;quot;Other ... options&amp;quot; ein Eintrag beginnend mit &amp;quot;-bm&amp;quot; der auf eine ebenfalls von coregen erzeugtes *.bmm Datei zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.&lt;br /&gt;
Der Teil ganz links ist der in ersten &#039;&#039;CoreGen&#039;&#039;-Fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst&lt;br /&gt;
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den &amp;quot;Process Properties&amp;quot; läuft zwar der Schritt Translate und alle Folgenden&lt;br /&gt;
durch, aber es wird Probleme bei &amp;quot;Vereinigung von Programm-binarie und FPGA bitfile&amp;quot; geben -&amp;gt; die FPGA logic wird zwar funktionieren, aber es wird kein Programm &lt;br /&gt;
auf dem Softcore laufen.&lt;br /&gt;
&lt;br /&gt;
=Generierung Compilerumgebung und microblaze-programm=&lt;br /&gt;
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, &lt;br /&gt;
das findet sich im Ordner EDK (Embedded Development Kit):&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]&lt;br /&gt;
&lt;br /&gt;
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.&lt;br /&gt;
&lt;br /&gt;
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er &lt;br /&gt;
das fenster &amp;quot;project explorer&amp;quot; überdeckt. Jetzt müßen wir nacheinander 3 verschieden &amp;quot;typen&amp;quot; von &amp;quot;projekten&amp;quot; anlegen:&lt;br /&gt;
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.&lt;br /&gt;
 Diese benötigt die Infos aus dem Coregenlauf&lt;br /&gt;
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem&lt;br /&gt;
*C/C++projekt die leere C-datei für das eigentliche Programm&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sdk project wizards.png|thumb|center|400px|New -&amp;gt; Projects]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Platform Specification==&lt;br /&gt;
File -&amp;gt; new -&amp;gt; project -&amp;gt; Xilinx -&amp;gt; Hardware Platform Specification&lt;br /&gt;
&lt;br /&gt;
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit&lt;br /&gt;
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf&lt;br /&gt;
anzugeben, es findet sich daher in dem Verzeichniss Core.&lt;br /&gt;
&lt;br /&gt;
==Erstellung Hardware project==&lt;br /&gt;
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]&lt;br /&gt;
==Erstellung Board support package==&lt;br /&gt;
==Erstellung Programm==&lt;br /&gt;
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;xparameters.h&amp;gt;&lt;br /&gt;
#include &amp;lt;xiomodule.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_DELAY 100000&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	//instantiate IOs&lt;br /&gt;
	XIOModule GPIO;&lt;br /&gt;
&lt;br /&gt;
	volatile u32 i = 0;&lt;br /&gt;
&lt;br /&gt;
	//initialize IOs&lt;br /&gt;
	XIOModule_Initialize(&amp;amp;GPIO, XPAR_IOMODULE_0_DEVICE_ID);&lt;br /&gt;
	XIOModule_Start(&amp;amp;GPIO);&lt;br /&gt;
&lt;br /&gt;
	//LED&lt;br /&gt;
	bool led_on = false;&lt;br /&gt;
	int run = 1;&lt;br /&gt;
&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		if (led_on) {XIOModule_DiscreteWrite(&amp;amp;GPIO, 3,run);&lt;br /&gt;
		             if (run == 0x20) run = 1; else run *= 2;}&lt;br /&gt;
		led_on = !led_on;&lt;br /&gt;
		for(i=0;i &amp;lt; LED_DELAY; ++i);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==&lt;br /&gt;
Im Menu &amp;quot;Xilinx Tools&amp;quot; den Punkt &amp;quot;Programm FPGA&amp;quot; auswählen und &lt;br /&gt;
[[Datei:Program FPGA.png|thumb|400px|center|Menu SDK program FPGA]]&lt;br /&gt;
&lt;br /&gt;
anschließend das (beim CoreGen) angelegte *.bmm file, das compilierte Programm (*.elf) und das *.bit File des in der ISE generierten FPGA&#039;s auswählen und den Button &amp;quot;Program&amp;quot; drücken.&lt;br /&gt;
[[Datei:Program FPGA files.png|thumb|400px|center|Auswahl *.bmm *.bit *.elf for programming]]&lt;br /&gt;
&lt;br /&gt;
Jetzt wird mittels der Information über die genutztem BRAM-Blöcke aus der *.bmm-Datei im *.bit-File die Bereiche die die Initdaten für die BRAM-Speicherblöcke enthält mit dem Binary des Programms ausgetauscht und anschließend das FPGA programmiert.&lt;br /&gt;
&lt;br /&gt;
=Fehlersuche=&lt;br /&gt;
Wenn möglich auch die beiden Zwischenergebnisse (&amp;quot;Gesamtdesign ohne MCS-Core instanziierung&amp;quot; und &amp;quot;Mit Core aber ohne Programm&amp;quot; am Board testen. Nur so lassen sich Fehler auf die Schritte im workflow zurückführen. &lt;br /&gt;
&lt;br /&gt;
Bei Änderungen am Core versagt gelegentlich das automatische Update von BPS etc.. Deshalb bei Coreänderungen die obsoleten Projekte (Hardware project, BSP und C-projekt) löschen und den workflow ab Schritt &amp;quot;tcl.script&amp;quot; wiederholen.&lt;br /&gt;
&lt;br /&gt;
Fehlermeldungen in die Eingabemaske von google kopieren und nach Antworten bei Xilinx oder Internetforen suchen. Das führt bei den&lt;br /&gt;
oft verwirrenden Fehlermeldungen schnell zum Erfolg. So weist diese Meldung über Memory leaks:&lt;br /&gt;
[[Datei:Ss more ngdbuilt error.png|400px|thumb|center|ngdbuil error]]&lt;br /&gt;
eigentlich darauf hin, das der Instanzname des MCS-cores nicht stimmt. Der &amp;quot;Answer record&amp;quot; bei Xilinx http://www.xilinx.com/support/answers/51538.html erklärt wie man den korrekten Namen findet und in das BMM-file einträgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Literatur =&lt;br /&gt;
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. &lt;br /&gt;
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.&lt;br /&gt;
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html&lt;br /&gt;
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity&lt;br /&gt;
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_4/ds865_microblaze_mcs.pdf - XILINX DS865, die offizielle Beschreibung des Cores&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/pg116-microblaze-mcs.pdf - XILINX PG116, die offizielle Anleitung für Vivado&lt;br /&gt;
*http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx14_5/pg048-microblaze-mcs.pdf - Xilinx PG048, die offizielle Anleitung für Vivado&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Program_FPGA_files.png&amp;diff=87885</id>
		<title>Datei:Program FPGA files.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Program_FPGA_files.png&amp;diff=87885"/>
		<updated>2015-03-12T21:07:00Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Screenshoot Xilinx SDK - Program FPGA menu: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshoot Xilinx SDK - Program FPGA menu: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Program_FPGA.png&amp;diff=87884</id>
		<title>Datei:Program FPGA.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Program_FPGA.png&amp;diff=87884"/>
		<updated>2015-03-12T21:03:28Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Screenshoot Xilinx SDK - Program FPGA menu: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshoot Xilinx SDK - Program FPGA menu: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87839</id>
		<title>Xilinx Microblaze MCS Workflow</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87839"/>
		<updated>2015-03-09T20:38:00Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* FPGA Implementierung */ Kloankram&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-Feb-27 -&amp;gt; Material,Tips zur Fehlersuch und Screenshots sammeln&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt wie der 32bit Softcore &amp;quot;microblaze MCS&amp;quot; in FPGA verwendet wird.&lt;br /&gt;
Verwendet wird dabei die kostenfrei verfügbare &amp;quot;leichtgewichtige&amp;quot; MicroBlaze-mcs  (µB-MCS) Variante aus dem coregenerator (ab ISE 13.4 (ab 01/2013) und Vivado) und nicht die kostenpflichtige MicroBlaze (ohne -MCS) Variante.&lt;br /&gt;
&lt;br /&gt;
=MicroBlaze und MicroBlaze MCS=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ablauf=&lt;br /&gt;
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:&lt;br /&gt;
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und FPGA ohne microblaze-Core implementieren&lt;br /&gt;
*Generierung des Softcore im CoreGenerator&lt;br /&gt;
*Instanziierung Core, Script für bm referenz ausführen und FPGA mit microblaze-Core implementieren&lt;br /&gt;
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)&lt;br /&gt;
*Erstellung und Kompilierung des Programms&lt;br /&gt;
*Zusammenfügen programm-binarie mit FPGA-bitstream file&lt;br /&gt;
&lt;br /&gt;
=Benötigte Software=&lt;br /&gt;
Es wird von Xilinx die FPGA Implementierungssoftware und das Software Development Kit (SDK)benötigt. Nutzer der FPGA&#039;s vor der 7Serie (bspw Spartan3-Großfamilie, Spartan-6, Virtex5/6) muüßen installieren:&lt;br /&gt;
*ISE Design Suite: WebPack edition&lt;br /&gt;
*ISE Design Suite: Embedded edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )&lt;br /&gt;
&lt;br /&gt;
Nutzer der neueren 7er Reihe dagegen benötigen:&lt;br /&gt;
*Vivado Design Suite Webpack edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)&lt;br /&gt;
&lt;br /&gt;
=Beispiel=&lt;br /&gt;
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- (FIT) und ein programmierbarer Zähler (PIT) generiert.&lt;br /&gt;
[[Datei:Mcs block.png|thumb|center|400px|Blockdiagramm Beispiel]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Core ist ein weitere Zähler -&#039;&#039;heartbeat&#039;&#039;- im Design. Die drei Ausgangsporst sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr 8 wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. Damit lassen sich 3 Implementierungsziele detektieren.&lt;br /&gt;
*Nix blinkt -&amp;gt; Totalversagen&lt;br /&gt;
*LED Nr. 8 blinkt -&amp;gt; FPGA erfolgreich geladen und gestartet&lt;br /&gt;
*LED 8 und 7 blinken: -&amp;gt; microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.&lt;br /&gt;
*Aktivität auf allen 8 LED&#039;s -&amp;gt; Perfekt&lt;br /&gt;
&lt;br /&gt;
=FPGA-Implementierung und SoftCore-Generierung=&lt;br /&gt;
==FPGA-Gerüst==&lt;br /&gt;
Es ist Empfehlenswert zuerst ein &amp;quot;Basis-FPGA&amp;quot; ohne µB fertigzustellen und zu testen. Hier wurde das zum Starterkit gehörige Demo adaptiert und somit war schon mal die Pinzuordnung und das Taktsystem fehlerfrei. Eine heartbeat-LED die im Sekundentakt blinkt grenzt den Fehler deutlich ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CoreGen==&lt;br /&gt;
Coregen starten (beispw. Programme -&amp;gt; Xilinx -&amp;gt; ISE 14.7 -&amp;gt; ISE Design tools -&amp;gt; 64bit tools -&amp;gt; coregen) Project für den benutzen FPGA aufsetzen (hier im beispiel S3AN-700; package: FGG484; speedgrade 4 Verilog)&lt;br /&gt;
&lt;br /&gt;
IM IP catalog findet sich der MCE unter embedded Processing -&amp;gt; processors -&amp;gt; microblaze MCE :&lt;br /&gt;
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zum Screenshot sollte man den Speicher auf mindestens 8 kByte setzen. Die Angabe der Taktfrequenz ist für die Berechnung des Baudraten-teilers für die UART wichtig. Benutzt man die UART nicht, ist dieser Wert  (theoretisch?) für den Core bedeutungslos. Das Place&amp;amp;Route für den FPGA richtet sich nach der Taktvorgabe aus dem ucf-file.&lt;br /&gt;
Die in den Karteikarten gezeigten Kürzel stehen für die einzigen &amp;quot;Peripheriecontrollern&amp;quot; die für dem µB-MCS generiert&lt;br /&gt;
werden können. Mit dem weiterhin kostenpflichten Platform Studio sind weitere Cores einfach hinzufügbar. Aber beim MCS muß man nicht komplett darauf verzichten da an dem IO-Bus selbtgeschriebene Komponenten angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
*UART: feste Baudrate, Interrupt für RX&lt;br /&gt;
*FIT:  Fixed length timer -4 möglich&lt;br /&gt;
*PIT: programmable Timer - 4? möglich&lt;br /&gt;
*GPO: Generalpurpose Output-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*GPI: Generalpurpose Input-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*INT: External Interrupt Sources&lt;br /&gt;
&lt;br /&gt;
Für die Treiber kann auch ein toggle output signal geriert werden das immer beim Erreichen der O invertiert wird.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]&lt;br /&gt;
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]&lt;br /&gt;
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]&lt;br /&gt;
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]&lt;br /&gt;
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]&lt;br /&gt;
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
==Vorbereitung Synthese mit MCS core==&lt;br /&gt;
&lt;br /&gt;
==Top-Level==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
wire heartbeat_s;&lt;br /&gt;
  &lt;br /&gt;
  wire  [7:0] GPO1_s;   //display data&lt;br /&gt;
  wire  [3:0] GPO2_s;   //display control&lt;br /&gt;
  wire  [6:0] GPO3_s;   // led&#039;s&lt;br /&gt;
  wire  [7:0] GPI1_s;  //switches&lt;br /&gt;
  &lt;br /&gt;
  wire FIT1_Toggle_s;&lt;br /&gt;
  &lt;br /&gt;
MikroBlaze_mcs microblaze_s3an_disp (&lt;br /&gt;
  .Clk(clk),                       // input Clk&lt;br /&gt;
  .Reset(rst),                     // input Reset&lt;br /&gt;
  .FIT1_Toggle(FIT1_Toggle_s),       // output fixed timer toggler (every 25M ticks)&lt;br /&gt;
  .FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt&lt;br /&gt;
  .FIT2_Toggle(/*FIT2_Toggle*/),       // UNUSED - output FIT2_Toggle&lt;br /&gt;
  .PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt&lt;br /&gt;
  .PIT1_Toggle(/*PIT1_Toggle*/),       // UNUSED - output PIT1_Toggle&lt;br /&gt;
  .GPO1(GPO1_s),                       // output [7 : 0] GPO1&lt;br /&gt;
  .GPO2(GPO2_s),                       // output [3 : 0] GPO2&lt;br /&gt;
  .GPO3(GPO3_s),                       // output [6 : 0] GPO3  &lt;br /&gt;
  .GPI1(GPI1_s),                       // input  [7 : 0] GPI1&lt;br /&gt;
  .GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt&lt;br /&gt;
  .INTC_IRQ(/*INTC_IRQ*/)              // UNUSED - output INTC_IRQ&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(posedge clk)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
 assign LCD_DB = GPO1_s[7:0];&lt;br /&gt;
 assign LCD_RW = GPO2_s[0];&lt;br /&gt;
 assign LCD_RS = GPO2_s[1];&lt;br /&gt;
 assign LCD_E  = GPO2_s[2];&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
heartbeat heartbeat(&lt;br /&gt;
   .clk(clk),&lt;br /&gt;
   .rst(rst),&lt;br /&gt;
   .heartbeat_o(heartbeat_s)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign LED[7] = heartbeat_s;  &lt;br /&gt;
assign LED[6] = FIT1_Toggle_s; &lt;br /&gt;
assign LED[5:0] = GPO3_s[5:0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FPGA Implementierung ==&lt;br /&gt;
Am besten den FPGA mit den µB-MCS &#039;&#039;&#039;vor&#039;&#039;&#039; der Vorbereitung des SDK komplett implementieren und auf das Board laden. Es müßen die LED&#039;s 7 und 8 mit jeweils eigene Frequenz blinken. Wenn nicht, dann ist bei der Generierung und Instanziierung des Cores ein Fehler unterlaufen.&lt;br /&gt;
&lt;br /&gt;
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (&#039;&#039;ISE:View-&amp;gt;Panels-&amp;gt;Tcl Console&#039;&#039;) dann erscheint unten eine schmale Zeile in der Tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.&lt;br /&gt;
&lt;br /&gt;
Jetzt das vom &#039;&#039;coregen&#039;&#039; erzeugte tcl Script starten: &#039;&#039;source ../core/microblaze_mcs_setup.tcl&#039;&#039; . Dieses script fügt eine Option für das tool &#039;&#039;ngdbuild&#039;&#039; (Process &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot;) bei der Implementierung&lt;br /&gt;
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot; im Process-Fenster und &amp;quot;process properties&amp;quot; auswählen. Es findet sich jetzt in der Zeile &amp;quot;Other ... options&amp;quot; ein Eintrag beginnend mit &amp;quot;-bm&amp;quot; der auf eine ebenfalls von coregen erzeugtes *.bmm Datei zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.&lt;br /&gt;
Der Teil ganz links ist der in ersten &#039;&#039;CoreGen&#039;&#039;-Fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst&lt;br /&gt;
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den &amp;quot;Process Properties&amp;quot; läuft zwar der Schritt Translate und alle Folgenden&lt;br /&gt;
durch, aber es wird Probleme bei &amp;quot;Vereinigung von Programm-binarie und FPGA bitfile&amp;quot; geben -&amp;gt; die FPGA logic wird zwar funktionieren, aber es wird kein Programm &lt;br /&gt;
auf dem Softcore laufen.&lt;br /&gt;
&lt;br /&gt;
=Generierung Compilerumgebung und microblaze-programm=&lt;br /&gt;
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, &lt;br /&gt;
das findet sich im Ordner EDK (Embedded Development Kit):&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]&lt;br /&gt;
&lt;br /&gt;
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.&lt;br /&gt;
&lt;br /&gt;
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er &lt;br /&gt;
das fenster &amp;quot;project explorer&amp;quot; überdeckt. Jetzt müßen wir nacheinander 3 verschieden &amp;quot;typen&amp;quot; von &amp;quot;projekten&amp;quot; anlegen:&lt;br /&gt;
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.&lt;br /&gt;
 Diese benötigt die Infos aus dem Coregenlauf&lt;br /&gt;
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem&lt;br /&gt;
*C/C++projekt die leere C-datei für das eigentliche Programm&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sdk project wizards.png|thumb|center|400px|New -&amp;gt; Projects]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Platform Specification==&lt;br /&gt;
File -&amp;gt; new -&amp;gt; project -&amp;gt; Xilinx -&amp;gt; Hardware Platform Specification&lt;br /&gt;
&lt;br /&gt;
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit&lt;br /&gt;
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf&lt;br /&gt;
anzugeben, es findet sich daher in dem Verzeichniss Core.&lt;br /&gt;
&lt;br /&gt;
==Erstellung Hardware project==&lt;br /&gt;
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]&lt;br /&gt;
==Erstellung Board support package==&lt;br /&gt;
==Erstellung Programm==&lt;br /&gt;
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;xparameters.h&amp;gt;&lt;br /&gt;
#include &amp;lt;xiomodule.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_DELAY 100000&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	//instantiate IOs&lt;br /&gt;
	XIOModule GPIO;&lt;br /&gt;
&lt;br /&gt;
	volatile u32 i = 0;&lt;br /&gt;
&lt;br /&gt;
	//initialize IOs&lt;br /&gt;
	XIOModule_Initialize(&amp;amp;GPIO, XPAR_IOMODULE_0_DEVICE_ID);&lt;br /&gt;
	XIOModule_Start(&amp;amp;GPIO);&lt;br /&gt;
&lt;br /&gt;
	//LED&lt;br /&gt;
	bool led_on = false;&lt;br /&gt;
	int run = 1;&lt;br /&gt;
&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		if (led_on) {XIOModule_DiscreteWrite(&amp;amp;GPIO, 3,run);&lt;br /&gt;
		             if (run == 0x20) run = 1; else run *= 2;}&lt;br /&gt;
		led_on = !led_on;&lt;br /&gt;
		for(i=0;i &amp;lt; LED_DELAY; ++i);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==&lt;br /&gt;
=Fehlersuche=&lt;br /&gt;
Wenn möglich auch die beiden Zwischenergebnisse (&amp;quot;Gesamtdesign ohne MCS-Core instanziierung&amp;quot; und &amp;quot;Mit Core aber ohne Programm&amp;quot; am Board testen. Nur so lassen sich Fehler auf die Schritte im workflow zurückführen. &lt;br /&gt;
&lt;br /&gt;
Bei Änderungen am Core versagt gelegentlich das automatische Update von BPS etc.. Deshalb bei Coreänderungen die obsoleten Projekte (Hardware project, BSP und C-projekt) löschen und den workflow ab Schritt &amp;quot;tcl.script&amp;quot; wiederholen.&lt;br /&gt;
&lt;br /&gt;
Fehlermeldungen in die Eingabemaske von google kopieren und nach Antworten bei Xilinx oder Internetforen suchen. Das führt bei den&lt;br /&gt;
oft verwirrenden Fehlermeldungen schnell zum Erfolg. So weist diese Meldung über Memory leaks:&lt;br /&gt;
[[Datei:Ss more ngdbuilt error.png|400px|thumb|center|ngdbuil error]]&lt;br /&gt;
eigentlich darauf hin, das der Instanzname des MCS-cores nicht stimmt. Der &amp;quot;Answer record&amp;quot; bei Xilinx http://www.xilinx.com/support/answers/51538.html erklärt wie man den korrekten Namen findet und in das BMM-file einträgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Literatur =&lt;br /&gt;
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. &lt;br /&gt;
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.&lt;br /&gt;
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html&lt;br /&gt;
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity&lt;br /&gt;
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_4/ds865_microblaze_mcs.pdf - XILINX DS865, die offizielle Beschreibung des Cores&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/pg116-microblaze-mcs.pdf - XILINX PG116, die offizielle Anleitung für Vivado&lt;br /&gt;
*http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx14_5/pg048-microblaze-mcs.pdf - Xilinx PG048, die offizielle Anleitung für Vivado&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87768</id>
		<title>Xilinx Microblaze MCS Workflow</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87768"/>
		<updated>2015-03-07T21:52:50Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Peripherie&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-Feb-27 -&amp;gt; Material,Tips zur Fehlersuch und Screenshots sammeln&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt wie der 32bit Softcore &amp;quot;microblaze MCS&amp;quot; in FPGA verwendet wird.&lt;br /&gt;
Verwendet wird dabei die kostenfrei verfügbare &amp;quot;leichtgewichtige&amp;quot; MicroBlaze-mcs  (µB-MCS) Variante aus dem coregenerator (ab ISE 13.4 (ab 01/2013) und Vivado) und nicht die kostenpflichtige MicroBlaze (ohne -MCS) Variante.&lt;br /&gt;
&lt;br /&gt;
=MicroBlaze und MicroBlaze MCS=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ablauf=&lt;br /&gt;
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:&lt;br /&gt;
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und FPGA ohne microblaze-Core implementieren&lt;br /&gt;
*Generierung des Softcore im CoreGenerator&lt;br /&gt;
*Instanziierung Core, Script für bm referenz ausführen und FPGA mit microblaze-Core implementieren&lt;br /&gt;
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)&lt;br /&gt;
*Erstellung und Kompilierung des Programms&lt;br /&gt;
*Zusammenfügen programm-binarie mit FPGA-bitstream file&lt;br /&gt;
&lt;br /&gt;
=Benötigte Software=&lt;br /&gt;
Es wird von Xilinx die FPGA Implementierungssoftware und das Software Development Kit (SDK)benötigt. Nutzer der FPGA&#039;s vor der 7Serie (bspw Spartan3-Großfamilie, Spartan-6, Virtex5/6) muüßen installieren:&lt;br /&gt;
*ISE Design Suite: WebPack edition&lt;br /&gt;
*ISE Design Suite: Embedded edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )&lt;br /&gt;
&lt;br /&gt;
Nutzer der neueren 7er Reihe dagegen benötigen:&lt;br /&gt;
*Vivado Design Suite Webpack edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)&lt;br /&gt;
&lt;br /&gt;
=Beispiel=&lt;br /&gt;
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- (FIT) und ein programmierbarer Zähler (PIT) generiert.&lt;br /&gt;
[[Datei:Mcs block.png|thumb|center|400px|Blockdiagramm Beispiel]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Core ist ein weitere Zähler -&#039;&#039;heartbeat&#039;&#039;- im Design. Die drei Ausgangsporst sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr 8 wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. Damit lassen sich 3 Implementierungsziele detektieren.&lt;br /&gt;
*Nix blinkt -&amp;gt; Totalversagen&lt;br /&gt;
*LED Nr. 8 blinkt -&amp;gt; FPGA erfolgreich geladen und gestartet&lt;br /&gt;
*LED 8 und 7 blinken: -&amp;gt; microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.&lt;br /&gt;
*Aktivität auf allen 8 LED&#039;s -&amp;gt; Perfekt&lt;br /&gt;
&lt;br /&gt;
=FPGA-Implementierung und SoftCore-Generierung=&lt;br /&gt;
==FPGA-Gerüst==&lt;br /&gt;
Es ist Empfehlenswert zuerst ein &amp;quot;Basis-FPGA&amp;quot; ohne µB fertigzustellen und zu testen. Hier wurde das zum Starterkit gehörige Demo adaptiert und somit war schon mal die Pinzuordnung und das Taktsystem fehlerfrei. Eine heartbeat-LED die im Sekundentakt blinkt grenzt den Fehler deutlich ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CoreGen==&lt;br /&gt;
Coregen starten (beispw. Programme -&amp;gt; Xilinx -&amp;gt; ISE 14.7 -&amp;gt; ISE Design tools -&amp;gt; 64bit tools -&amp;gt; coregen) Project für den benutzen FPGA aufsetzen (hier im beispiel S3AN-700; package: FGG484; speedgrade 4 Verilog)&lt;br /&gt;
&lt;br /&gt;
IM IP catalog findet sich der MCE unter embedded Processing -&amp;gt; processors -&amp;gt; microblaze MCE :&lt;br /&gt;
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zum Screenshot sollte man den Speicher auf mindestens 8 kByte setzen. Die Angabe der Taktfrequenz ist für die Berechnung des Baudraten-teilers für die UART wichtig. Benutzt man die UART nicht, ist dieser Wert  (theoretisch?) für den Core bedeutungslos. Das Place&amp;amp;Route für den FPGA richtet sich nach der Taktvorgabe aus dem ucf-file.&lt;br /&gt;
Die in den Karteikarten gezeigten Kürzel stehen für die einzigen &amp;quot;Peripheriecontrollern&amp;quot; die für dem µB-MCS generiert&lt;br /&gt;
werden können. Mit dem weiterhin kostenpflichten Platform Studio sind weitere Cores einfach hinzufügbar. Aber beim MCS muß man nicht komplett darauf verzichten da an dem IO-Bus selbtgeschriebene Komponenten angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
*UART: feste Baudrate, Interrupt für RX&lt;br /&gt;
*FIT:  Fixed length timer -4 möglich&lt;br /&gt;
*PIT: programmable Timer - 4? möglich&lt;br /&gt;
*GPO: Generalpurpose Output-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*GPI: Generalpurpose Input-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar&lt;br /&gt;
*INT: External Interrupt Sources&lt;br /&gt;
&lt;br /&gt;
Für die Treiber kann auch ein toggle output signal geriert werden das immer beim Erreichen der O invertiert wird.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]&lt;br /&gt;
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]&lt;br /&gt;
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]&lt;br /&gt;
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]&lt;br /&gt;
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]&lt;br /&gt;
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
==Vorbereitung Synthese mit MCS core==&lt;br /&gt;
&lt;br /&gt;
==Top-Level==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
wire heartbeat_s;&lt;br /&gt;
  &lt;br /&gt;
  wire  [7:0] GPO1_s;   //display data&lt;br /&gt;
  wire  [3:0] GPO2_s;   //display control&lt;br /&gt;
  wire  [6:0] GPO3_s;   // led&#039;s&lt;br /&gt;
  wire  [7:0] GPI1_s;  //switches&lt;br /&gt;
  &lt;br /&gt;
  wire FIT1_Toggle_s;&lt;br /&gt;
  &lt;br /&gt;
MikroBlaze_mcs microblaze_s3an_disp (&lt;br /&gt;
  .Clk(clk),                       // input Clk&lt;br /&gt;
  .Reset(rst),                     // input Reset&lt;br /&gt;
  .FIT1_Toggle(FIT1_Toggle_s),       // output fixed timer toggler (every 25M ticks)&lt;br /&gt;
  .FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt&lt;br /&gt;
  .FIT2_Toggle(/*FIT2_Toggle*/),       // UNUSED - output FIT2_Toggle&lt;br /&gt;
  .PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt&lt;br /&gt;
  .PIT1_Toggle(/*PIT1_Toggle*/),       // UNUSED - output PIT1_Toggle&lt;br /&gt;
  .GPO1(GPO1_s),                       // output [7 : 0] GPO1&lt;br /&gt;
  .GPO2(GPO2_s),                       // output [3 : 0] GPO2&lt;br /&gt;
  .GPO3(GPO3_s),                       // output [6 : 0] GPO3  &lt;br /&gt;
  .GPI1(GPI1_s),                       // input  [7 : 0] GPI1&lt;br /&gt;
  .GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt&lt;br /&gt;
  .INTC_IRQ(/*INTC_IRQ*/)              // UNUSED - output INTC_IRQ&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(posedge clk)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
 assign LCD_DB = GPO1_s[7:0];&lt;br /&gt;
 assign LCD_RW = GPO2_s[0];&lt;br /&gt;
 assign LCD_RS = GPO2_s[1];&lt;br /&gt;
 assign LCD_E  = GPO2_s[2];&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
heartbeat heartbeat(&lt;br /&gt;
   .clk(clk),&lt;br /&gt;
   .rst(rst),&lt;br /&gt;
   .heartbeat_o(heartbeat_s)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign LED[7] = heartbeat_s;  &lt;br /&gt;
assign LED[6] = FIT1_Toggle_s; &lt;br /&gt;
assign LED[5:0] = GPO3_s[5:0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FPGA Implementierung ==&lt;br /&gt;
Am besten den FPGA mit den MCS &#039;&#039;&#039;vor&#039;&#039;&#039; der Vorbereitung des SDK komplett implementieren und auf das board laden. Es müßen die LED&#039;s 7 und 8 mit jeweils eigene Frequenz blinken. Wenn nicht, dann ist bei der Generierung und Instanziierung des Cores ein Fehler unterlaufen.&lt;br /&gt;
&lt;br /&gt;
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (ISE:View-&amp;gt;Panels_Tcl console) dann erscheint unten eine schmale Zeile in der tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.&lt;br /&gt;
&lt;br /&gt;
Jetzt das vom coregen erzeugte tcl script starten: source ../core/microblaze_mcs_setup.tcl . Dieses script fügt eine Option für das tool &#039;&#039;ngdbuild&#039;&#039; (für den Process &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot; bei der Implementierung&lt;br /&gt;
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf &amp;quot;Translate im Process-Fenster und &amp;quot;process properties&amp;quot; auswählen. Es findet sich jetzt in der Zeile &amp;quot;Other ... options&amp;quot; ein Eintrag beginnend mit &amp;quot;-bm&amp;quot; der auf ein ebenfalls von coregen erzeugtes .bmm file zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.&lt;br /&gt;
Der Teil ganz links ist der in ersten Coregen fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst&lt;br /&gt;
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den &amp;quot;Process Properties&amp;quot; läuft zwar der Schritt Translate und alle folgenden&lt;br /&gt;
durch, aber es wird Probleme bei &amp;quot;Vereinigung von Programm-binarie und FPGA bitfile geben -&amp;gt; die FPGA logic wird zwar funktionieren, aber es wird kein Programm &lt;br /&gt;
auf dem Softcore laufen.&lt;br /&gt;
&lt;br /&gt;
=Generierung Compilerumgebung und microblaze-programm=&lt;br /&gt;
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, &lt;br /&gt;
das findet sich im Ordner EDK (Embedded Development Kit):&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]&lt;br /&gt;
&lt;br /&gt;
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.&lt;br /&gt;
&lt;br /&gt;
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er &lt;br /&gt;
das fenster &amp;quot;project explorer&amp;quot; überdeckt. Jetzt müßen wir nacheinander 3 verschieden &amp;quot;typen&amp;quot; von &amp;quot;projekten&amp;quot; anlegen:&lt;br /&gt;
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.&lt;br /&gt;
 Diese benötigt die Infos aus dem Coregenlauf&lt;br /&gt;
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem&lt;br /&gt;
*C/C++projekt die leere C-datei für das eigentliche Programm&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sdk project wizards.png|thumb|center|400px|New -&amp;gt; Projects]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Platform Specification==&lt;br /&gt;
File -&amp;gt; new -&amp;gt; project -&amp;gt; Xilinx -&amp;gt; Hardware Platform Specification&lt;br /&gt;
&lt;br /&gt;
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit&lt;br /&gt;
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf&lt;br /&gt;
anzugeben, es findet sich daher in dem Verzeichniss Core.&lt;br /&gt;
&lt;br /&gt;
==Erstellung Hardware project==&lt;br /&gt;
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]&lt;br /&gt;
==Erstellung Board support package==&lt;br /&gt;
==Erstellung Programm==&lt;br /&gt;
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;xparameters.h&amp;gt;&lt;br /&gt;
#include &amp;lt;xiomodule.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_DELAY 100000&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	//instantiate IOs&lt;br /&gt;
	XIOModule GPIO;&lt;br /&gt;
&lt;br /&gt;
	volatile u32 i = 0;&lt;br /&gt;
&lt;br /&gt;
	//initialize IOs&lt;br /&gt;
	XIOModule_Initialize(&amp;amp;GPIO, XPAR_IOMODULE_0_DEVICE_ID);&lt;br /&gt;
	XIOModule_Start(&amp;amp;GPIO);&lt;br /&gt;
&lt;br /&gt;
	//LED&lt;br /&gt;
	bool led_on = false;&lt;br /&gt;
	int run = 1;&lt;br /&gt;
&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		if (led_on) {XIOModule_DiscreteWrite(&amp;amp;GPIO, 3,run);&lt;br /&gt;
		             if (run == 0x20) run = 1; else run *= 2;}&lt;br /&gt;
		led_on = !led_on;&lt;br /&gt;
		for(i=0;i &amp;lt; LED_DELAY; ++i);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==&lt;br /&gt;
=Fehlersuche=&lt;br /&gt;
Wenn möglich auch die beiden Zwischenergebnisse (&amp;quot;Gesamtdesign ohne MCS-Core instanziierung&amp;quot; und &amp;quot;Mit Core aber ohne Programm&amp;quot; am Board testen. Nur so lassen sich Fehler auf die Schritte im workflow zurückführen. &lt;br /&gt;
&lt;br /&gt;
Bei Änderungen am Core versagt gelegentlich das automatische Update von BPS etc.. Deshalb bei Coreänderungen die obsoleten Projekte (Hardware project, BSP und C-projekt) löschen und den workflow ab Schritt &amp;quot;tcl.script&amp;quot; wiederholen.&lt;br /&gt;
&lt;br /&gt;
Fehlermeldungen in die Eingabemaske von google kopieren und nach Antworten bei Xilinx oder Internetforen suchen. Das führt bei den&lt;br /&gt;
oft verwirrenden Fehlermeldungen schnell zum Erfolg. So weist diese Meldung über Memory leaks:&lt;br /&gt;
[[Datei:Ss more ngdbuilt error.png|400px|thumb|center|ngdbuil error]]&lt;br /&gt;
eigentlich darauf hin, das der Instanzname des MCS-cores nicht stimmt. Der &amp;quot;Answer record&amp;quot; bei Xilinx http://www.xilinx.com/support/answers/51538.html erklärt wie man den korrekten Namen findet und in das BMM-file einträgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Literatur =&lt;br /&gt;
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. &lt;br /&gt;
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.&lt;br /&gt;
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html&lt;br /&gt;
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity&lt;br /&gt;
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_4/ds865_microblaze_mcs.pdf - XILINX DS865, die offizielle Beschreibung des Cores&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/pg116-microblaze-mcs.pdf - XILINX PG116, die offizielle Anleitung für Vivado&lt;br /&gt;
*http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx14_5/pg048-microblaze-mcs.pdf - Xilinx PG048, die offizielle Anleitung für Vivado&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87765</id>
		<title>Xilinx Microblaze MCS Workflow</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87765"/>
		<updated>2015-03-07T18:26:46Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: /* SoftCore-Generierung und FPGA-Implementierung */  a biiserl drumherum vor der Core-genrierung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-Feb-27 -&amp;gt; Material,Tips zur Fehlersuch und Screenshots sammeln&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt wie der 32bit Softcore &amp;quot;microblaze MCS&amp;quot; in FPGA verwendet wird.&lt;br /&gt;
Verwendet wird dabei die kostenfrei verfügbare &amp;quot;leichtgewichtige&amp;quot; microblaze mcs Variante aus dem coregenerator (ab ISE 13.4 und Vivado) und nicht die kostenpflichtige EDK Variante.&lt;br /&gt;
&lt;br /&gt;
=Ablauf=&lt;br /&gt;
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:&lt;br /&gt;
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und FPGA ohne microblaze-Core implementieren&lt;br /&gt;
*Generierung des Softcore im CoreGenerator&lt;br /&gt;
*Instanziierung Core, Script für bm referenz ausführen und FPGA mit microblaze-Core implementieren&lt;br /&gt;
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)&lt;br /&gt;
*Erstellung und Kompilierung des Programms&lt;br /&gt;
*Zusammenfügen programm-binarie mit FPGA-bitstream file&lt;br /&gt;
&lt;br /&gt;
=Benötigte Software=&lt;br /&gt;
Es wird von Xilinx die FPGA Implementierungssoftware und das Software Development Kit (SDK)benötigt. Nutzer der FPGA&#039;s vor der 7Serie (bspw Spartan3-Großfamilie, Spartan-6, Virtex5/6) muüßen installieren:&lt;br /&gt;
*ISE Design Suite: WebPack edition&lt;br /&gt;
*ISE Design Suite: Embedded edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )&lt;br /&gt;
&lt;br /&gt;
Nutzer der neueren 7er Reihe dagegen benötigen:&lt;br /&gt;
*Vivado Design Suite Webpack edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)&lt;br /&gt;
&lt;br /&gt;
=Beispiel=&lt;br /&gt;
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- (FIT) und ein programmierbarer Zähler (PIT) generiert.&lt;br /&gt;
[[Datei:Mcs block.png|thumb|center|400px|Blockdiagramm Beispiel]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Core ist ein weitere Zähler -&#039;&#039;heartbeat&#039;&#039;- im Design. Die drei Ausgangsporst sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr 8 wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. Damit lassen sich 3 Implementierungsziele detektieren.&lt;br /&gt;
*Nix blinkt -&amp;gt; Totalversagen&lt;br /&gt;
*LED Nr. 8 blinkt -&amp;gt; FPGA erfolgreich geladen und gestartet&lt;br /&gt;
*LED 8 und 7 blinken: -&amp;gt; microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.&lt;br /&gt;
*Aktivität auf allen 8 LED&#039;s -&amp;gt; Perfekt&lt;br /&gt;
&lt;br /&gt;
=FPGA-Implementierung und SoftCore-Generierung=&lt;br /&gt;
==FPGA-Gerüst==&lt;br /&gt;
Es ist Empfehlenswert zuerst ein &amp;quot;Basis-FPGA&amp;quot; ohne µB fertigzustellen und zu testen. Hier wurde das zum Starterkit gehörige Demo&lt;br /&gt;
adaptiert und somit war schon mal die Pinzuordnung und das Taktsystem fehlerfrei. Eine heartbeat-LED die im Sekundentakt blinkt &lt;br /&gt;
grenzt den Fehler schon deutlich ein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CoreGen==&lt;br /&gt;
Coregen starten (beispw. Programme -&amp;gt; Xilinx -&amp;gt; ISE 14.7 -&amp;gt; ISE Design tools -&amp;gt; 64bit tools -&amp;gt; coregen) Project für den benutzen FPGA aufsetzen (hier im beispiel S3AN-700; package: FGG484; speedgrade 4 Verilog)&lt;br /&gt;
&lt;br /&gt;
IM IP catalog findet sich der MCE unter embedded Processing -&amp;gt; processors -&amp;gt; microblaze MCE :&lt;br /&gt;
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zum Screenshot sollte man den Speicher auf mindestens 8 kByte setzen. Die Angabe der Taktfrequenz ist für die Berechnung des Baudraten-teilers für die UART wichtig. benutzt man die UART nicht, ist dieser Wert  (theoretisch?) für den Core bedeutungslos. Das Place&amp;amp;Route für den FPGA richtet sich nach der Taktvorgabe aus dem ucf-file.&lt;br /&gt;
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]&lt;br /&gt;
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]&lt;br /&gt;
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]&lt;br /&gt;
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]&lt;br /&gt;
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]&lt;br /&gt;
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
==Vorbereitung Synthese mit MCS core==&lt;br /&gt;
&lt;br /&gt;
==Top-Level==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
wire heartbeat_s;&lt;br /&gt;
  &lt;br /&gt;
  wire  [7:0] GPO1_s;   //display data&lt;br /&gt;
  wire  [3:0] GPO2_s;   //display control&lt;br /&gt;
  wire  [6:0] GPO3_s;   // led&#039;s&lt;br /&gt;
  wire  [7:0] GPI1_s;  //switches&lt;br /&gt;
  &lt;br /&gt;
  wire FIT1_Toggle_s;&lt;br /&gt;
  &lt;br /&gt;
MikroBlaze_mcs microblaze_s3an_disp (&lt;br /&gt;
  .Clk(clk),                       // input Clk&lt;br /&gt;
  .Reset(rst),                     // input Reset&lt;br /&gt;
  .FIT1_Toggle(FIT1_Toggle_s),       // output fixed timer toggler (every 25M ticks)&lt;br /&gt;
  .FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt&lt;br /&gt;
  .FIT2_Toggle(/*FIT2_Toggle*/),       // UNUSED - output FIT2_Toggle&lt;br /&gt;
  .PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt&lt;br /&gt;
  .PIT1_Toggle(/*PIT1_Toggle*/),       // UNUSED - output PIT1_Toggle&lt;br /&gt;
  .GPO1(GPO1_s),                       // output [7 : 0] GPO1&lt;br /&gt;
  .GPO2(GPO2_s),                       // output [3 : 0] GPO2&lt;br /&gt;
  .GPO3(GPO3_s),                       // output [6 : 0] GPO3  &lt;br /&gt;
  .GPI1(GPI1_s),                       // input  [7 : 0] GPI1&lt;br /&gt;
  .GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt&lt;br /&gt;
  .INTC_IRQ(/*INTC_IRQ*/)              // UNUSED - output INTC_IRQ&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(posedge clk)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
 assign LCD_DB = GPO1_s[7:0];&lt;br /&gt;
 assign LCD_RW = GPO2_s[0];&lt;br /&gt;
 assign LCD_RS = GPO2_s[1];&lt;br /&gt;
 assign LCD_E  = GPO2_s[2];&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
heartbeat heartbeat(&lt;br /&gt;
   .clk(clk),&lt;br /&gt;
   .rst(rst),&lt;br /&gt;
   .heartbeat_o(heartbeat_s)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign LED[7] = heartbeat_s;  &lt;br /&gt;
assign LED[6] = FIT1_Toggle_s; &lt;br /&gt;
assign LED[5:0] = GPO3_s[5:0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FPGA Implementierung ==&lt;br /&gt;
Am besten den FPGA mit den MCS &#039;&#039;&#039;vor&#039;&#039;&#039; der Vorbereitung des SDK komplett implementieren und auf das board laden. Es müßen die LED&#039;s 7 und 8 mit jeweils eigene Frequenz blinken. Wenn nicht, dann ist bei der Generierung und Instanziierung des Cores ein Fehler unterlaufen.&lt;br /&gt;
&lt;br /&gt;
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (ISE:View-&amp;gt;Panels_Tcl console) dann erscheint unten eine schmale Zeile in der tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.&lt;br /&gt;
&lt;br /&gt;
Jetzt das vom coregen erzeugte tcl script starten: source ../core/microblaze_mcs_setup.tcl . Dieses script fügt eine Option für das tool &#039;&#039;ngdbuild&#039;&#039; (für den Process &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot; bei der Implementierung&lt;br /&gt;
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf &amp;quot;Translate im Process-Fenster und &amp;quot;process properties&amp;quot; auswählen. Es findet sich jetzt in der Zeile &amp;quot;Other ... options&amp;quot; ein Eintrag beginnend mit &amp;quot;-bm&amp;quot; der auf ein ebenfalls von coregen erzeugtes .bmm file zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.&lt;br /&gt;
Der Teil ganz links ist der in ersten Coregen fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst&lt;br /&gt;
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den &amp;quot;Process Properties&amp;quot; läuft zwar der Schritt Translate und alle folgenden&lt;br /&gt;
durch, aber es wird Probleme bei &amp;quot;Vereinigung von Programm-binarie und FPGA bitfile geben -&amp;gt; die FPGA logic wird zwar funktionieren, aber es wird kein Programm &lt;br /&gt;
auf dem Softcore laufen.&lt;br /&gt;
&lt;br /&gt;
=Generierung Compilerumgebung und microblaze-programm=&lt;br /&gt;
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, &lt;br /&gt;
das findet sich im Ordner EDK (Embedded Development Kit):&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]&lt;br /&gt;
&lt;br /&gt;
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.&lt;br /&gt;
&lt;br /&gt;
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er &lt;br /&gt;
das fenster &amp;quot;project explorer&amp;quot; überdeckt. Jetzt müßen wir nacheinander 3 verschieden &amp;quot;typen&amp;quot; von &amp;quot;projekten&amp;quot; anlegen:&lt;br /&gt;
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.&lt;br /&gt;
 Diese benötigt die Infos aus dem Coregenlauf&lt;br /&gt;
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem&lt;br /&gt;
*C/C++projekt die leere C-datei für das eigentliche Programm&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sdk project wizards.png|thumb|center|400px|New -&amp;gt; Projects]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Platform Specification==&lt;br /&gt;
File -&amp;gt; new -&amp;gt; project -&amp;gt; Xilinx -&amp;gt; Hardware Platform Specification&lt;br /&gt;
&lt;br /&gt;
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit&lt;br /&gt;
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf&lt;br /&gt;
anzugeben, es findet sich daher in dem Verzeichniss Core.&lt;br /&gt;
&lt;br /&gt;
==Erstellung Hardware project==&lt;br /&gt;
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]&lt;br /&gt;
==Erstellung Board support package==&lt;br /&gt;
==Erstellung Programm==&lt;br /&gt;
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;xparameters.h&amp;gt;&lt;br /&gt;
#include &amp;lt;xiomodule.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_DELAY 100000&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	//instantiate IOs&lt;br /&gt;
	XIOModule GPIO;&lt;br /&gt;
&lt;br /&gt;
	volatile u32 i = 0;&lt;br /&gt;
&lt;br /&gt;
	//initialize IOs&lt;br /&gt;
	XIOModule_Initialize(&amp;amp;GPIO, XPAR_IOMODULE_0_DEVICE_ID);&lt;br /&gt;
	XIOModule_Start(&amp;amp;GPIO);&lt;br /&gt;
&lt;br /&gt;
	//LED&lt;br /&gt;
	bool led_on = false;&lt;br /&gt;
	int run = 1;&lt;br /&gt;
&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		if (led_on) {XIOModule_DiscreteWrite(&amp;amp;GPIO, 3,run);&lt;br /&gt;
		             if (run == 0x20) run = 1; else run *= 2;}&lt;br /&gt;
		led_on = !led_on;&lt;br /&gt;
		for(i=0;i &amp;lt; LED_DELAY; ++i);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==&lt;br /&gt;
=Fehlersuche=&lt;br /&gt;
Wenn möglich auch die beiden Zwischenergebnisse (&amp;quot;Gesamtdesign ohne MCS-Core instanziierung&amp;quot; und &amp;quot;Mit Core aber ohne Programm&amp;quot; am Board testen. Nur so lassen sich Fehler auf die Schritte im workflow zurückführen. &lt;br /&gt;
&lt;br /&gt;
Bei Änderungen am Core versagt gelegentlich das automatische Update von BPS etc.. Deshalb bei Coreänderungen die obsoleten Projekte (Hardware project, BSP und C-projekt) löschen und den workflow ab Schritt &amp;quot;tcl.script&amp;quot; wiederholen.&lt;br /&gt;
&lt;br /&gt;
Fehlermeldungen in die Eingabemaske von google kopieren und nach Antworten bei Xilinx oder Internetforen suchen. Das führt bei den&lt;br /&gt;
oft verwirrenden Fehlermeldungen schnell zum Erfolg. So weist diese Meldung über Memory leaks:&lt;br /&gt;
[[Datei:Ss more ngdbuilt error.png|400px|thumb|center|ngdbuil error]]&lt;br /&gt;
eigentlich darauf hin, das der Instanzname des MCS-cores nicht stimmt. Der &amp;quot;Answer record&amp;quot; bei Xilinx http://www.xilinx.com/support/answers/51538.html erklärt wie man den korrekten Namen findet und in das BMM-file einträgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Literatur =&lt;br /&gt;
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. &lt;br /&gt;
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.&lt;br /&gt;
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html&lt;br /&gt;
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity&lt;br /&gt;
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_4/ds865_microblaze_mcs.pdf - XILINX DS865, die offizielle Beschreibung des Cores&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/pg116-microblaze-mcs.pdf - XILINX PG116, die offizielle Anleitung für Vivado&lt;br /&gt;
*http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx14_5/pg048-microblaze-mcs.pdf - Xilinx PG048, die offizielle Anleitung für Vivado&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87620</id>
		<title>Xilinx Microblaze MCS Workflow</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87620"/>
		<updated>2015-03-02T20:59:38Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Start coreGen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-Feb-27 -&amp;gt; Material,Tips zur Fehlersuch und Screenshots sammeln&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt wie der 32bit Softcore &amp;quot;microblaze MCS&amp;quot; in FPGA verwendet wird.&lt;br /&gt;
Verwendet wird dabei die kostenfrei verfügbare &amp;quot;leichtgewichtige&amp;quot; microblaze mcs Variante aus dem coregenerator (ab ISE 13.4 und Vivado) und nicht die kostenpflichtige EDK Variante.&lt;br /&gt;
&lt;br /&gt;
=Ablauf=&lt;br /&gt;
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:&lt;br /&gt;
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und FPGA ohne microblaze-Core implementieren&lt;br /&gt;
*Generierung des Softcore im CoreGenerator&lt;br /&gt;
*Instanziierung Core, Script für bm referenz ausführen und FPGA mit microblaze-Core implementieren&lt;br /&gt;
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)&lt;br /&gt;
*Erstellung und Kompilierung des Programms&lt;br /&gt;
*Zusammenfügen programm-binarie mit FPGA-bitstream file&lt;br /&gt;
&lt;br /&gt;
=Benötigte Software=&lt;br /&gt;
Es wird von Xilinx die FPGA Implementierungssoftware und das Software Development Kit (SDK)benötigt. Nutzer der FPGA&#039;s vor der 7Serie (bspw Spartan3-Großfamilie, Spartan-6, Virtex5/6) muüßen installieren:&lt;br /&gt;
*ISE Design Suite: WebPack edition&lt;br /&gt;
*ISE Design Suite: Embedded edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )&lt;br /&gt;
&lt;br /&gt;
Nutzer der neueren 7er Reihe dagegen benötigen:&lt;br /&gt;
*Vivado Design Suite Webpack edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)&lt;br /&gt;
&lt;br /&gt;
=Beispiel=&lt;br /&gt;
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- (FIT) und ein programmierbarer Zähler (PIT) generiert.&lt;br /&gt;
[[Datei:Mcs block.png|thumb|center|400px|Blockdiagramm Beispiel]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Core ist ein weitere Zähler -&#039;&#039;heartbeat&#039;&#039;- im Design. Die drei Ausgangsporst sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr 8 wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. Damit lassen sich 3 Implementierungsziele detektieren.&lt;br /&gt;
*Nix blinkt -&amp;gt; Totalversagen&lt;br /&gt;
*LED Nr. 8 blinkt -&amp;gt; FPGA erfolgreich geladen und gestartet&lt;br /&gt;
*LED 8 und 7 blinken: -&amp;gt; microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.&lt;br /&gt;
*Aktivität auf allen 8 LED&#039;s -&amp;gt; Perfekt&lt;br /&gt;
&lt;br /&gt;
=SoftCore-Generierung und FPGA-Implementierung=&lt;br /&gt;
==CoreGen==&lt;br /&gt;
Coregen starten (beispw. Programme -&amp;gt; Xilinx -&amp;gt; ISE 14.7 -&amp;gt; ISE Design tools -&amp;gt; 64bit tools -&amp;gt; coregen) Project für den benutzen FPGA aufsetzen (hier im beispiel S3AN-700; package: FGG484; speedgrade 4 Verilog)&lt;br /&gt;
&lt;br /&gt;
IM IP catalog findet sich der MCE unter embedded Processing -&amp;gt; processors -&amp;gt; microblaze MCE :&lt;br /&gt;
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]&lt;br /&gt;
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]&lt;br /&gt;
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]&lt;br /&gt;
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]&lt;br /&gt;
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]&lt;br /&gt;
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]&lt;br /&gt;
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
==Vorbereitung Synthese mit MCS core==&lt;br /&gt;
&lt;br /&gt;
==Top-Level==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
wire heartbeat_s;&lt;br /&gt;
  &lt;br /&gt;
  wire  [7:0] GPO1_s;   //display data&lt;br /&gt;
  wire  [3:0] GPO2_s;   //display control&lt;br /&gt;
  wire  [6:0] GPO3_s;   // led&#039;s&lt;br /&gt;
  wire  [7:0] GPI1_s;  //switches&lt;br /&gt;
  &lt;br /&gt;
  wire FIT1_Toggle_s;&lt;br /&gt;
  &lt;br /&gt;
MikroBlaze_mcs microblaze_s3an_disp (&lt;br /&gt;
  .Clk(clk),                       // input Clk&lt;br /&gt;
  .Reset(rst),                     // input Reset&lt;br /&gt;
  .FIT1_Toggle(FIT1_Toggle_s),       // output fixed timer toggler (every 25M ticks)&lt;br /&gt;
  .FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt&lt;br /&gt;
  .FIT2_Toggle(/*FIT2_Toggle*/),       // UNUSED - output FIT2_Toggle&lt;br /&gt;
  .PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt&lt;br /&gt;
  .PIT1_Toggle(/*PIT1_Toggle*/),       // UNUSED - output PIT1_Toggle&lt;br /&gt;
  .GPO1(GPO1_s),                       // output [7 : 0] GPO1&lt;br /&gt;
  .GPO2(GPO2_s),                       // output [3 : 0] GPO2&lt;br /&gt;
  .GPO3(GPO3_s),                       // output [6 : 0] GPO3  &lt;br /&gt;
  .GPI1(GPI1_s),                       // input  [7 : 0] GPI1&lt;br /&gt;
  .GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt&lt;br /&gt;
  .INTC_IRQ(/*INTC_IRQ*/)              // UNUSED - output INTC_IRQ&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(posedge clk)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
 assign LCD_DB = GPO1_s[7:0];&lt;br /&gt;
 assign LCD_RW = GPO2_s[0];&lt;br /&gt;
 assign LCD_RS = GPO2_s[1];&lt;br /&gt;
 assign LCD_E  = GPO2_s[2];&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
heartbeat heartbeat(&lt;br /&gt;
   .clk(clk),&lt;br /&gt;
   .rst(rst),&lt;br /&gt;
   .heartbeat_o(heartbeat_s)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign LED[7] = heartbeat_s;  &lt;br /&gt;
assign LED[6] = FIT1_Toggle_s; &lt;br /&gt;
assign LED[5:0] = GPO3_s[5:0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FPGA Implementierung ==&lt;br /&gt;
Am besten den FPGA mit den MCS &#039;&#039;&#039;vor&#039;&#039;&#039; der Vorbereitung des SDK komplett implementieren und auf das board laden. Es müßen die LED&#039;s 7 und 8 mit jeweils eigene Frequenz blinken. Wenn nicht, dann ist bei der Generierung und Instanziierung des Cores ein Fehler unterlaufen.&lt;br /&gt;
&lt;br /&gt;
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (ISE:View-&amp;gt;Panels_Tcl console) dann erscheint unten eine schmale Zeile in der tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.&lt;br /&gt;
&lt;br /&gt;
Jetzt das vom coregen erzeugte tcl script starten: source ../core/microblaze_mcs_setup.tcl . Dieses script fügt eine Option für das tool &#039;&#039;ngdbuild&#039;&#039; (für den Process &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot; bei der Implementierung&lt;br /&gt;
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf &amp;quot;Translate im Process-Fenster und &amp;quot;process properties&amp;quot; auswählen. Es findet sich jetzt in der Zeile &amp;quot;Other ... options&amp;quot; ein Eintrag beginnend mit &amp;quot;-bm&amp;quot; der auf ein ebenfalls von coregen erzeugtes .bmm file zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.&lt;br /&gt;
Der Teil ganz links ist der in ersten Coregen fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst&lt;br /&gt;
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den &amp;quot;Process Properties&amp;quot; läuft zwar der Schritt Translate und alle folgenden&lt;br /&gt;
durch, aber es wird Probleme bei &amp;quot;Vereinigung von Programm-binarie und FPGA bitfile geben -&amp;gt; die FPGA logic wird zwar funktionieren, aber es wird kein Programm &lt;br /&gt;
auf dem Softcore laufen.&lt;br /&gt;
&lt;br /&gt;
=Generierung Compilerumgebung und microblaze-programm=&lt;br /&gt;
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, &lt;br /&gt;
das findet sich im Ordner EDK (Embedded Development Kit):&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]&lt;br /&gt;
&lt;br /&gt;
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.&lt;br /&gt;
&lt;br /&gt;
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er &lt;br /&gt;
das fenster &amp;quot;project explorer&amp;quot; überdeckt. Jetzt müßen wir nacheinander 3 verschieden &amp;quot;typen&amp;quot; von &amp;quot;projekten&amp;quot; anlegen:&lt;br /&gt;
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.&lt;br /&gt;
 Diese benötigt die Infos aus dem Coregenlauf&lt;br /&gt;
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem&lt;br /&gt;
*C/C++projekt die leere C-datei für das eigentliche Programm&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sdk project wizards.png|thumb|center|400px|New -&amp;gt; Projects]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Platform Specification==&lt;br /&gt;
File -&amp;gt; new -&amp;gt; project -&amp;gt; Xilinx -&amp;gt; Hardware Platform Specification&lt;br /&gt;
&lt;br /&gt;
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit&lt;br /&gt;
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf&lt;br /&gt;
anzugeben, es findet sich daher in dem Verzeichniss Core.&lt;br /&gt;
&lt;br /&gt;
==Erstellung Hardware project==&lt;br /&gt;
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]&lt;br /&gt;
==Erstellung Board support package==&lt;br /&gt;
==Erstellung Programm==&lt;br /&gt;
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;xparameters.h&amp;gt;&lt;br /&gt;
#include &amp;lt;xiomodule.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_DELAY 100000&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	//instantiate IOs&lt;br /&gt;
	XIOModule GPIO;&lt;br /&gt;
&lt;br /&gt;
	volatile u32 i = 0;&lt;br /&gt;
&lt;br /&gt;
	//initialize IOs&lt;br /&gt;
	XIOModule_Initialize(&amp;amp;GPIO, XPAR_IOMODULE_0_DEVICE_ID);&lt;br /&gt;
	XIOModule_Start(&amp;amp;GPIO);&lt;br /&gt;
&lt;br /&gt;
	//LED&lt;br /&gt;
	bool led_on = false;&lt;br /&gt;
	int run = 1;&lt;br /&gt;
&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		if (led_on) {XIOModule_DiscreteWrite(&amp;amp;GPIO, 3,run);&lt;br /&gt;
		             if (run == 0x20) run = 1; else run *= 2;}&lt;br /&gt;
		led_on = !led_on;&lt;br /&gt;
		for(i=0;i &amp;lt; LED_DELAY; ++i);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==&lt;br /&gt;
=Fehlersuche=&lt;br /&gt;
Wenn möglich auch die beiden Zwischenergebnisse (&amp;quot;Gesamtdesign ohne MCS-Core instanziierung&amp;quot; und &amp;quot;Mit Core aber ohne Programm&amp;quot; am Board testen. Nur so lassen sich Fehler auf die Schritte im workflow zurückführen. &lt;br /&gt;
&lt;br /&gt;
Bei Änderungen am Core versagt gelegentlich das automatische Update von BPS etc.. Deshalb bei Coreänderungen die obsoleten Projekte (Hardware project, BSP und C-projekt) löschen und den workflow ab Schritt &amp;quot;tcl.script&amp;quot; wiederholen.&lt;br /&gt;
&lt;br /&gt;
Fehlermeldungen in die Eingabemaske von google kopieren und nach Antworten bei Xilinx oder Internetforen suchen. Das führt bei den&lt;br /&gt;
oft verwirrenden Fehlermeldungen schnell zum Erfolg. So weist diese Meldung über Memory leaks:&lt;br /&gt;
[[Datei:Ss more ngdbuilt error.png|400px|thumb|center|ngdbuil error]]&lt;br /&gt;
eigentlich darauf hin, das der Instanzname des MCS-cores nicht stimmt. Der &amp;quot;Answer record&amp;quot; bei Xilinx http://www.xilinx.com/support/answers/51538.html erklärt wie man den korrekten Namen findet und in das BMM-file einträgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Literatur =&lt;br /&gt;
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. &lt;br /&gt;
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.&lt;br /&gt;
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html&lt;br /&gt;
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity&lt;br /&gt;
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_4/ds865_microblaze_mcs.pdf - XILINX DS865, die offizielle Beschreibung des Cores&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/pg116-microblaze-mcs.pdf - XILINX PG116, die offizielle Anleitung für Vivado&lt;br /&gt;
*http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx14_5/pg048-microblaze-mcs.pdf - Xilinx PG048, die offizielle Anleitung für Vivado&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87607</id>
		<title>Xilinx Microblaze MCS Workflow</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87607"/>
		<updated>2015-03-01T21:56:36Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: +links zu Datenblatt, Implementierungsschritte genauer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-Feb-27 -&amp;gt; Material,Tips zur Fehlersuch und Screenshots sammeln&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt wie der 32bit Softcore &amp;quot;microblaze MCS&amp;quot; in FPGA verwendet wird.&lt;br /&gt;
Verwendet wird dabei die kostenfrei verfügbare &amp;quot;leichtgewichtige&amp;quot; microblaze mcs Variante aus dem coregenerator (ab ISE 13.4 und Vivado) und nicht die kostenpflichtige EDK Variante.&lt;br /&gt;
&lt;br /&gt;
=Ablauf=&lt;br /&gt;
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:&lt;br /&gt;
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und FPGA ohne microblaze-Core implementieren&lt;br /&gt;
*Generierung des Softcore im CoreGenerator&lt;br /&gt;
*Instanziierung Core, Script für bm referenz ausführen und FPGA mit microblaze-Core implementieren&lt;br /&gt;
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)&lt;br /&gt;
*Erstellung und Kompilierung des Programms&lt;br /&gt;
*Zusammenfügen programm-binarie mit FPGA-bitstream file&lt;br /&gt;
&lt;br /&gt;
=Benötigte Software=&lt;br /&gt;
Es wird von Xilinx die FPGA Implementierungssoftware und das Software Development Kit (SDK)benötigt. Nutzer der FPGA&#039;s vor der 7Serie (bspw Spartan3-Großfamilie, Spartan-6, Virtex5/6) muüßen installieren:&lt;br /&gt;
*ISE Design Suite: WebPack edition&lt;br /&gt;
*ISE Design Suite: Embedded edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )&lt;br /&gt;
&lt;br /&gt;
Nutzer der neueren 7er Reihe dagegen benötigen:&lt;br /&gt;
*Vivado Design Suite Webpack edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)&lt;br /&gt;
&lt;br /&gt;
=Beispiel=&lt;br /&gt;
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- (FIT) und ein programmierbarer Zähler (PIT) generiert.&lt;br /&gt;
[[Datei:Mcs block.png|thumb|center|400px|Blockdiagramm Beispiel]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Core ist ein weitere Zähler -&#039;&#039;heartbeat&#039;&#039;- im Design. Die drei Ausgangsporst sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr 8 wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. Damit lassen sich 3 Implementierungsziele detektieren.&lt;br /&gt;
*Nix blinkt -&amp;gt; Totalversagen&lt;br /&gt;
*LED Nr. 8 blinkt -&amp;gt; FPGA erfolgreich geladen und gestartet&lt;br /&gt;
*LED 8 und 7 blinken: -&amp;gt; microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.&lt;br /&gt;
*Aktivität auf allen 8 LED&#039;s -&amp;gt; Perfekt&lt;br /&gt;
&lt;br /&gt;
=SoftCore-Generierung und FPGA-Implementierung=&lt;br /&gt;
==CoreGen==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]&lt;br /&gt;
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]&lt;br /&gt;
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]&lt;br /&gt;
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]&lt;br /&gt;
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]&lt;br /&gt;
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]&lt;br /&gt;
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
==Vorbereitung Synthese mit MCS core==&lt;br /&gt;
&lt;br /&gt;
==Top-Level==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
wire heartbeat_s;&lt;br /&gt;
  &lt;br /&gt;
  wire  [7:0] GPO1_s;   //display data&lt;br /&gt;
  wire  [3:0] GPO2_s;   //display control&lt;br /&gt;
  wire  [6:0] GPO3_s;   // led&#039;s&lt;br /&gt;
  wire  [7:0] GPI1_s;  //switches&lt;br /&gt;
  &lt;br /&gt;
  wire FIT1_Toggle_s;&lt;br /&gt;
  &lt;br /&gt;
MikroBlaze_mcs microblaze_s3an_disp (&lt;br /&gt;
  .Clk(clk),                       // input Clk&lt;br /&gt;
  .Reset(rst),                     // input Reset&lt;br /&gt;
  .FIT1_Toggle(FIT1_Toggle_s),       // output fixed timer toggler (every 25M ticks)&lt;br /&gt;
  .FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt&lt;br /&gt;
  .FIT2_Toggle(/*FIT2_Toggle*/),       // UNUSED - output FIT2_Toggle&lt;br /&gt;
  .PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt&lt;br /&gt;
  .PIT1_Toggle(/*PIT1_Toggle*/),       // UNUSED - output PIT1_Toggle&lt;br /&gt;
  .GPO1(GPO1_s),                       // output [7 : 0] GPO1&lt;br /&gt;
  .GPO2(GPO2_s),                       // output [3 : 0] GPO2&lt;br /&gt;
  .GPO3(GPO3_s),                       // output [6 : 0] GPO3  &lt;br /&gt;
  .GPI1(GPI1_s),                       // input  [7 : 0] GPI1&lt;br /&gt;
  .GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt&lt;br /&gt;
  .INTC_IRQ(/*INTC_IRQ*/)              // UNUSED - output INTC_IRQ&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(posedge clk)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
 assign LCD_DB = GPO1_s[7:0];&lt;br /&gt;
 assign LCD_RW = GPO2_s[0];&lt;br /&gt;
 assign LCD_RS = GPO2_s[1];&lt;br /&gt;
 assign LCD_E  = GPO2_s[2];&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
heartbeat heartbeat(&lt;br /&gt;
   .clk(clk),&lt;br /&gt;
   .rst(rst),&lt;br /&gt;
   .heartbeat_o(heartbeat_s)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign LED[7] = heartbeat_s;  &lt;br /&gt;
assign LED[6] = FIT1_Toggle_s; &lt;br /&gt;
assign LED[5:0] = GPO3_s[5:0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FPGA Implementierung ==&lt;br /&gt;
Am besten den FPGA mit den MCS &#039;&#039;&#039;vor&#039;&#039;&#039; der Vorbereitung des SDK komplett implementieren und auf das board laden. Es müßen die LED&#039;s 7 und 8 mit jeweils eigene Frequenz blinken. Wenn nicht, dann ist bei der Generierung und Instanziierung des Cores ein Fehler unterlaufen.&lt;br /&gt;
&lt;br /&gt;
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (ISE:View-&amp;gt;Panels_Tcl console) dann erscheint unten eine schmale Zeile in der tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.&lt;br /&gt;
&lt;br /&gt;
Jetzt das vom coregen erzeugte tcl script starten: source ../core/microblaze_mcs_setup.tcl . Dieses script fügt eine Option für das tool &#039;&#039;ngdbuild&#039;&#039; (für den Process &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot; bei der Implementierung&lt;br /&gt;
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf &amp;quot;Translate im Process-Fenster und &amp;quot;process properties&amp;quot; auswählen. Es findet sich jetzt in der Zeile &amp;quot;Other ... options&amp;quot; ein Eintrag beginnend mit &amp;quot;-bm&amp;quot; der auf ein ebenfalls von coregen erzeugtes .bmm file zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.&lt;br /&gt;
Der Teil ganz links ist der in ersten Coregen fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst&lt;br /&gt;
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den &amp;quot;Process Properties&amp;quot; läuft zwar der Schritt Translate und alle folgenden&lt;br /&gt;
durch, aber es wird Probleme bei &amp;quot;Vereinigung von Programm-binarie und FPGA bitfile geben -&amp;gt; die FPGA logic wird zwar funktionieren, aber es wird kein Programm &lt;br /&gt;
auf dem Softcore laufen.&lt;br /&gt;
&lt;br /&gt;
=Generierung Compilerumgebung und microblaze-programm=&lt;br /&gt;
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, &lt;br /&gt;
das findet sich im Ordner EDK (Embedded Development Kit):&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]&lt;br /&gt;
&lt;br /&gt;
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.&lt;br /&gt;
&lt;br /&gt;
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er &lt;br /&gt;
das fenster &amp;quot;project explorer&amp;quot; überdeckt. Jetzt müßen wir nacheinander 3 verschieden &amp;quot;typen&amp;quot; von &amp;quot;projekten&amp;quot; anlegen:&lt;br /&gt;
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.&lt;br /&gt;
 Diese benötigt die Infos aus dem Coregenlauf&lt;br /&gt;
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem&lt;br /&gt;
*C/C++projekt die leere C-datei für das eigentliche Programm&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sdk project wizards.png|thumb|center|400px|New -&amp;gt; Projects]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Platform Specification==&lt;br /&gt;
File -&amp;gt; new -&amp;gt; project -&amp;gt; Xilinx -&amp;gt; Hardware Platform Specification&lt;br /&gt;
&lt;br /&gt;
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit&lt;br /&gt;
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf&lt;br /&gt;
anzugeben, es findet sich daher in dem Verzeichniss Core.&lt;br /&gt;
&lt;br /&gt;
==Erstellung Hardware project==&lt;br /&gt;
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]&lt;br /&gt;
==Erstellung Board support package==&lt;br /&gt;
==Erstellung Programm==&lt;br /&gt;
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;xparameters.h&amp;gt;&lt;br /&gt;
#include &amp;lt;xiomodule.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_DELAY 100000&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	//instantiate IOs&lt;br /&gt;
	XIOModule GPIO;&lt;br /&gt;
&lt;br /&gt;
	volatile u32 i = 0;&lt;br /&gt;
&lt;br /&gt;
	//initialize IOs&lt;br /&gt;
	XIOModule_Initialize(&amp;amp;GPIO, XPAR_IOMODULE_0_DEVICE_ID);&lt;br /&gt;
	XIOModule_Start(&amp;amp;GPIO);&lt;br /&gt;
&lt;br /&gt;
	//LED&lt;br /&gt;
	bool led_on = false;&lt;br /&gt;
	int run = 1;&lt;br /&gt;
&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		if (led_on) {XIOModule_DiscreteWrite(&amp;amp;GPIO, 3,run);&lt;br /&gt;
		             if (run == 0x20) run = 1; else run *= 2;}&lt;br /&gt;
		led_on = !led_on;&lt;br /&gt;
		for(i=0;i &amp;lt; LED_DELAY; ++i);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==&lt;br /&gt;
=Fehlersuche=&lt;br /&gt;
Wenn möglich auch die beiden Zwischenergebnisse (&amp;quot;Gesamtdesign ohne MCS-Core instanziierung&amp;quot; und &amp;quot;Mit Core aber ohne Programm&amp;quot; am Board testen. Nur so lassen sich Fehler auf die Schritte im workflow zurückführen. &lt;br /&gt;
&lt;br /&gt;
Bei Änderungen am Core versagt gelegentlich das automatische Update von BPS etc.. Deshalb bei Coreänderungen die obsoleten Projekte (Hardware project, BSP und C-projekt) löschen und den workflow ab Schritt &amp;quot;tcl.script&amp;quot; wiederholen.&lt;br /&gt;
&lt;br /&gt;
Fehlermeldungen in die Eingabemaske von google kopieren und nach Antworten bei Xilinx oder Internetforen suchen. Das führt bei den&lt;br /&gt;
oft verwirrenden Fehlermeldungen schnell zum Erfolg. So weist diese Meldung über Memory leaks:&lt;br /&gt;
[[Datei:Ss more ngdbuilt error.png|400px|thumb|center|ngdbuil error]]&lt;br /&gt;
eigentlich darauf hin, das der Instanzname des MCS-cores nicht stimmt. Der &amp;quot;Answer record&amp;quot; bei Xilinx http://www.xilinx.com/support/answers/51538.html erklärt wie man den korrekten Namen findet und in das BMM-file einträgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Literatur =&lt;br /&gt;
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. &lt;br /&gt;
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.&lt;br /&gt;
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html&lt;br /&gt;
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity&lt;br /&gt;
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_4/ds865_microblaze_mcs.pdf - XILINX DS865, die offizielle Beschreibung des Cores&lt;br /&gt;
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/pg116-microblaze-mcs.pdf - XILINX PG116, die offizielle Anleitung für Vivado&lt;br /&gt;
*http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx14_5/pg048-microblaze-mcs.pdf - Xilinx PG048, die offizielle Anleitung für Vivado&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87588</id>
		<title>Xilinx Microblaze MCS Workflow</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87588"/>
		<updated>2015-02-27T21:06:47Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: +Blockbild und tips zur fehlersuche&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-Feb-27 -&amp;gt; Material,Tips zur Fehlersuch und Screenshots sammeln&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt wie der 32bit Softcore &amp;quot;microblaze MCS&amp;quot; in FPGA verwendet wird.&lt;br /&gt;
Verwendet wird dabei die kostenfrei verfügbare &amp;quot;leichtgewichtige&amp;quot; microblaze mcs Variante aus dem coregenerator (ab ISE 13.4 und Vivado) und nicht die kostenpflichtige EDK Variante.&lt;br /&gt;
&lt;br /&gt;
=Ablauf=&lt;br /&gt;
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:&lt;br /&gt;
*Generierung des Softcore im CoreGenerator&lt;br /&gt;
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und Instanziierung Core&lt;br /&gt;
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)&lt;br /&gt;
*erstellung und Kompilierung des Programms&lt;br /&gt;
*Zusammenfügen programm-binarie mit FPGA-bitstream file&lt;br /&gt;
&lt;br /&gt;
=Benötigte Software=&lt;br /&gt;
Es wird von Xilinx die FPGA Implementierungssoftware und das Software Development Kit (SDK)benötigt. Nutzer der FPGA&#039;s vor der 7Serie (bspw Spartan3-Großfamilie, Spartan-6, Virtex5/6) muüßen installieren:&lt;br /&gt;
*ISE Design Suite: WebPack edition&lt;br /&gt;
*ISE Design Suite: Embedded edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )&lt;br /&gt;
&lt;br /&gt;
Nutzer der neueren 7er Reihe dagegen benötigen:&lt;br /&gt;
*Vivado Design Suite Webpack edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)&lt;br /&gt;
&lt;br /&gt;
=Beispiel=&lt;br /&gt;
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- (FIT) und ein programmierbarer Zähler (PIT) generiert.&lt;br /&gt;
[[Datei:Mcs block.png|thumb|center|400px|Blockdiagramm Beispiel]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Core ist ein weitere Zähler -&#039;&#039;heartbeat&#039;&#039;- im Design. Die drei Ausgangsporst sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr 8 wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. Damit lassen sich 3 Implementierungsziele detektieren.&lt;br /&gt;
*Nix blinkt -&amp;gt; Totalversagen&lt;br /&gt;
*LED Nr. 8 blinkt -&amp;gt; FPGA erfolgreich geladen und gestartet&lt;br /&gt;
*LED 8 und 7 blinken: -&amp;gt; microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.&lt;br /&gt;
*Aktivität auf allen 8 LED&#039;s -&amp;gt; Perfekt&lt;br /&gt;
&lt;br /&gt;
=SoftCore-Generierung und FPGA-Implementierung=&lt;br /&gt;
==CoreGen==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]&lt;br /&gt;
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]&lt;br /&gt;
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]&lt;br /&gt;
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]&lt;br /&gt;
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]&lt;br /&gt;
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]&lt;br /&gt;
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
==Vorbereitung Synthese mit MCS core==&lt;br /&gt;
&lt;br /&gt;
==Top-Level==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
wire heartbeat_s;&lt;br /&gt;
  &lt;br /&gt;
  wire  [7:0] GPO1_s;   //display data&lt;br /&gt;
  wire  [3:0] GPO2_s;   //display control&lt;br /&gt;
  wire  [6:0] GPO3_s;   // led&#039;s&lt;br /&gt;
  wire  [7:0] GPI1_s;  //switches&lt;br /&gt;
  &lt;br /&gt;
  wire FIT1_Toggle_s;&lt;br /&gt;
  &lt;br /&gt;
MikroBlaze_mcs microblaze_s3an_disp (&lt;br /&gt;
  .Clk(clk),                       // input Clk&lt;br /&gt;
  .Reset(rst),                     // input Reset&lt;br /&gt;
  .FIT1_Toggle(FIT1_Toggle_s),       // output fixed timer toggler (every 25M ticks)&lt;br /&gt;
  .FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt&lt;br /&gt;
  .FIT2_Toggle(/*FIT2_Toggle*/),       // UNUSED - output FIT2_Toggle&lt;br /&gt;
  .PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt&lt;br /&gt;
  .PIT1_Toggle(/*PIT1_Toggle*/),       // UNUSED - output PIT1_Toggle&lt;br /&gt;
  .GPO1(GPO1_s),                       // output [7 : 0] GPO1&lt;br /&gt;
  .GPO2(GPO2_s),                       // output [3 : 0] GPO2&lt;br /&gt;
  .GPO3(GPO3_s),                       // output [6 : 0] GPO3  &lt;br /&gt;
  .GPI1(GPI1_s),                       // input  [7 : 0] GPI1&lt;br /&gt;
  .GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt&lt;br /&gt;
  .INTC_IRQ(/*INTC_IRQ*/)              // UNUSED - output INTC_IRQ&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(posedge clk)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
 assign LCD_DB = GPO1_s[7:0];&lt;br /&gt;
 assign LCD_RW = GPO2_s[0];&lt;br /&gt;
 assign LCD_RS = GPO2_s[1];&lt;br /&gt;
 assign LCD_E  = GPO2_s[2];&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
heartbeat heartbeat(&lt;br /&gt;
   .clk(clk),&lt;br /&gt;
   .rst(rst),&lt;br /&gt;
   .heartbeat_o(heartbeat_s)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign LED[7] = heartbeat_s;  &lt;br /&gt;
assign LED[6] = FIT1_Toggle_s; &lt;br /&gt;
assign LED[5:0] = GPO3_s[5:0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FPGA Implementierung ==&lt;br /&gt;
Am besten den FPGA mit den MCS &#039;&#039;&#039;vor&#039;&#039;&#039; der Vorbereitung des SDK komplett implementieren und auf das board laden. Es müßen die LED&#039;s 7 und 8 mit jeweils eigene Frequenz blinken. Wenn nicht, dann ist bei der Generierung und Instanziierung des Cores ein Fehler unterlaufen.&lt;br /&gt;
&lt;br /&gt;
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (ISE:View-&amp;gt;Panels_Tcl console) dann erscheint unten eine schmale Zeile in der tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.&lt;br /&gt;
&lt;br /&gt;
Jetzt das vom coregen erzeugte tcl script starten: source ../core/microblaze_mcs_setup.tcl . Dieses script fügt eine Option für das tool &#039;&#039;ngdbuild&#039;&#039; (für den Process &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot; bei der Implementierung&lt;br /&gt;
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf &amp;quot;Translate im Process-Fenster und &amp;quot;process properties&amp;quot; auswählen. Es findet sich jetzt in der Zeile &amp;quot;Other ... options&amp;quot; ein Eintrag beginnend mit &amp;quot;-bm&amp;quot; der auf ein ebenfalls von coregen erzeugtes .bmm file zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.&lt;br /&gt;
Der Teil ganz links ist der in ersten Coregen fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst&lt;br /&gt;
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den &amp;quot;Process Properties&amp;quot; läuft zwar der Schritt Translate und alle folgenden&lt;br /&gt;
durch, aber es wird Probleme bei &amp;quot;Vereinigung von Programm-binarie und FPGA bitfile geben -&amp;gt; die FPGA logic wird zwar funktionieren, aber es wird kein Programm &lt;br /&gt;
auf dem Softcore laufen.&lt;br /&gt;
&lt;br /&gt;
=Generierung Compilerumgebung und microblaze-programm=&lt;br /&gt;
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, &lt;br /&gt;
das findet sich im Ordner EDK (Embedded Development Kit):&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]&lt;br /&gt;
&lt;br /&gt;
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.&lt;br /&gt;
&lt;br /&gt;
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er &lt;br /&gt;
das fenster &amp;quot;project explorer&amp;quot; überdeckt. Jetzt müßen wir nacheinander 3 verschieden &amp;quot;typen&amp;quot; von &amp;quot;projekten&amp;quot; anlegen:&lt;br /&gt;
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.&lt;br /&gt;
 Diese benötigt die Infos aus dem Coregenlauf&lt;br /&gt;
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem&lt;br /&gt;
*C/C++projekt die leere C-datei für das eigentliche Programm&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sdk project wizards.png|thumb|center|400px|New -&amp;gt; Projects]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Platform Specification==&lt;br /&gt;
File -&amp;gt; new -&amp;gt; project -&amp;gt; Xilinx -&amp;gt; Hardware Platform Specification&lt;br /&gt;
&lt;br /&gt;
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit&lt;br /&gt;
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf&lt;br /&gt;
anzugeben, es findet sich daher in dem Verzeichniss Core.&lt;br /&gt;
&lt;br /&gt;
==Erstellung Hardware project==&lt;br /&gt;
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]&lt;br /&gt;
==Erstellung Board support package==&lt;br /&gt;
==Erstellung Programm==&lt;br /&gt;
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;xparameters.h&amp;gt;&lt;br /&gt;
#include &amp;lt;xiomodule.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_DELAY 100000&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	//instantiate IOs&lt;br /&gt;
	XIOModule GPIO;&lt;br /&gt;
&lt;br /&gt;
	volatile u32 i = 0;&lt;br /&gt;
&lt;br /&gt;
	//initialize IOs&lt;br /&gt;
	XIOModule_Initialize(&amp;amp;GPIO, XPAR_IOMODULE_0_DEVICE_ID);&lt;br /&gt;
	XIOModule_Start(&amp;amp;GPIO);&lt;br /&gt;
&lt;br /&gt;
	//LED&lt;br /&gt;
	bool led_on = false;&lt;br /&gt;
	int run = 1;&lt;br /&gt;
&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		if (led_on) {XIOModule_DiscreteWrite(&amp;amp;GPIO, 3,run);&lt;br /&gt;
		             if (run == 0x20) run = 1; else run *= 2;}&lt;br /&gt;
		led_on = !led_on;&lt;br /&gt;
		for(i=0;i &amp;lt; LED_DELAY; ++i);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==&lt;br /&gt;
=Fehlersuche=&lt;br /&gt;
Wenn möglich auch die beiden Zwischenergebnisse (&amp;quot;Gesamtdesign ohne MCS-Core instanziierung&amp;quot; und &amp;quot;Mit Core aber ohne Programm&amp;quot; am Board testen. Nur so lassen sich Fehler auf die Schritte im workflow zurückführen. &lt;br /&gt;
&lt;br /&gt;
Bei Änderungen am Core versagt gelegentlich das automatische Update von BPS etc.. Deshalb bei Coreänderungen die obsoleten Projekte (Hardware project, BSP und C-projekt) löschen und den workflow ab Schritt &amp;quot;tcl.script&amp;quot; wiederholen.&lt;br /&gt;
&lt;br /&gt;
Fehlermeldungen in die Eingabemaske von google kopieren und nach Antworten bei Xilinx oder Internetforen suchen. Das führt bei den&lt;br /&gt;
oft verwirrenden Fehlermeldungen schnell zum Erfolg. So weist diese Meldung über Memory leaks:&lt;br /&gt;
[[Datei:Ss more ngdbuilt error.png|400px|thumb|center|ngdbuil error]]&lt;br /&gt;
eigentlich darauf hin, das der Instanzname des MCS-cores nicht stimmt. Der &amp;quot;Answer record&amp;quot; bei Xilinx http://www.xilinx.com/support/answers/51538.html erklärt wie man den korrekten Namen findet und in das BMM-file einträgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Literatur =&lt;br /&gt;
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. &lt;br /&gt;
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.&lt;br /&gt;
&lt;br /&gt;
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html&lt;br /&gt;
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity&lt;br /&gt;
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Ss_more_ngdbuilt_error.png&amp;diff=87587</id>
		<title>Datei:Ss more ngdbuilt error.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Ss_more_ngdbuilt_error.png&amp;diff=87587"/>
		<updated>2015-02-27T21:01:16Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Screenshoot Xilinx ngdbuilt error: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshoot Xilinx ngdbuilt error: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Mcs_block.png&amp;diff=87586</id>
		<title>Datei:Mcs block.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Mcs_block.png&amp;diff=87586"/>
		<updated>2015-02-27T20:40:14Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: block schematic of simple microblaze mcs implementation
Own Work - Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;block schematic of simple microblaze mcs implementation&lt;br /&gt;
Own Work - Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87578</id>
		<title>Xilinx Microblaze MCS Workflow</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&amp;diff=87578"/>
		<updated>2015-02-26T21:59:49Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: More Pics, less typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status: 2015-Feb-26 -&amp;gt; Material und Screenshots sammeln&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt wie der 32bit Softcore &amp;quot;microblaze MCS&amp;quot; in FPGA verwendet wird.&lt;br /&gt;
Verwendet wird dabei die kostenfrei verfügbare &amp;quot;leichtgewichtige&amp;quot; microblaze mcs Variante aus dem coregenerator (ab ISE 13.4 und Vivado) und nicht die kostenpflichtige EDK Variante.&lt;br /&gt;
&lt;br /&gt;
=Ablauf=&lt;br /&gt;
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:&lt;br /&gt;
*Generierung des Softcore im CoreGenerator&lt;br /&gt;
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und Instanziierung Core&lt;br /&gt;
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)&lt;br /&gt;
*erstellung und Kompilierung des Programms&lt;br /&gt;
*Zusammenfügen programm-binarie mit FPGA-bitstream file&lt;br /&gt;
&lt;br /&gt;
=Benötigte Software=&lt;br /&gt;
Es wird von Xilinx die FPGA Implementierungssoftware und das Software Development Kit (SDK)benötigt. Nutzer der FPGA&#039;s vor der 7Serie (bspw Spartan3-Großfamilie, Spartan-6, Virtex5/6) muüßen installieren:&lt;br /&gt;
*ISE Design Suite: WebPack edition&lt;br /&gt;
*ISE Design Suite: Embedded edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )&lt;br /&gt;
&lt;br /&gt;
Nutzer der neueren 7er Reihe dagegen benötigen:&lt;br /&gt;
*Vivado Design Suite Webpack edition&lt;br /&gt;
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)&lt;br /&gt;
&lt;br /&gt;
=Beispiel=&lt;br /&gt;
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- und ein programmierbarer Zähler generiert.&lt;br /&gt;
Neben dem Core ist ein weitere Zähler im Design. Die drei Ausgangsport sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr ( wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. damit lassen sich 3 Implementierungsziele detektieren.&lt;br /&gt;
*Nix blinkt -&amp;gt; Totalversagen&lt;br /&gt;
*LED Nr. 8 blinkt -&amp;gt; FPGA erfolgreich geladen und gestartet&lt;br /&gt;
*LED 8 und 7 blinken: -&amp;gt; microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.&lt;br /&gt;
*Aktivität auf allen 8 LED&#039;s -&amp;gt; Perfekt&lt;br /&gt;
&lt;br /&gt;
=SoftCore-Generierung und FPGA-Implementierung=&lt;br /&gt;
==CoreGen==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]&lt;br /&gt;
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]&lt;br /&gt;
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]&lt;br /&gt;
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]&lt;br /&gt;
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]&lt;br /&gt;
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]&lt;br /&gt;
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
==Vorbereitung Synthese mit MCS core==&lt;br /&gt;
&lt;br /&gt;
==Top-Level==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
wire heartbeat_s;&lt;br /&gt;
  &lt;br /&gt;
  wire  [7:0] GPO1_s;   //display data&lt;br /&gt;
  wire  [3:0] GPO2_s;   //display control&lt;br /&gt;
  wire  [6:0] GPO3_s;   // led&#039;s&lt;br /&gt;
  wire  [7:0] GPI1_s;  //switches&lt;br /&gt;
  &lt;br /&gt;
  wire FIT1_Toggle_s;&lt;br /&gt;
  &lt;br /&gt;
MikroBlaze_mcs microblaze_s3an_disp (&lt;br /&gt;
  .Clk(clk),                       // input Clk&lt;br /&gt;
  .Reset(rst),                     // input Reset&lt;br /&gt;
  .FIT1_Toggle(FIT1_Toggle_s),       // output fixed timer toggler (every 25M ticks)&lt;br /&gt;
  .FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt&lt;br /&gt;
  .FIT2_Toggle(/*FIT2_Toggle*/),       // UNUSED - output FIT2_Toggle&lt;br /&gt;
  .PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt&lt;br /&gt;
  .PIT1_Toggle(/*PIT1_Toggle*/),       // UNUSED - output PIT1_Toggle&lt;br /&gt;
  .GPO1(GPO1_s),                       // output [7 : 0] GPO1&lt;br /&gt;
  .GPO2(GPO2_s),                       // output [3 : 0] GPO2&lt;br /&gt;
  .GPO3(GPO3_s),                       // output [6 : 0] GPO3  &lt;br /&gt;
  .GPI1(GPI1_s),                       // input  [7 : 0] GPI1&lt;br /&gt;
  .GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt&lt;br /&gt;
  .INTC_IRQ(/*INTC_IRQ*/)              // UNUSED - output INTC_IRQ&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(posedge clk)&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
 assign LCD_DB = GPO1_s[7:0];&lt;br /&gt;
 assign LCD_RW = GPO2_s[0];&lt;br /&gt;
 assign LCD_RS = GPO2_s[1];&lt;br /&gt;
 assign LCD_E  = GPO2_s[2];&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
heartbeat heartbeat(&lt;br /&gt;
   .clk(clk),&lt;br /&gt;
   .rst(rst),&lt;br /&gt;
   .heartbeat_o(heartbeat_s)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign LED[7] = heartbeat_s;  &lt;br /&gt;
assign LED[6] = FIT1_Toggle_s; &lt;br /&gt;
assign LED[5:0] = GPO3_s[5:0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FPGA Implementierung ==&lt;br /&gt;
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (ISE:View-&amp;gt;Panels_Tcl console) dann erscheint unten eine schmale Zeile in der tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.&lt;br /&gt;
&lt;br /&gt;
Jetzt das vom coregen erzeugte tcl script starten: source ../core/microblaze_mcs_setup.tcl . Dieses script fügt eine Option für das tool &#039;&#039;ngdbuild&#039;&#039; (für den Process &amp;quot;&#039;&#039;Translate&#039;&#039;&amp;quot; bei der Implementierung&lt;br /&gt;
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf &amp;quot;Translate im Process-Fenster und &amp;quot;process properties&amp;quot; auswählen. Es findet sich jetzt in der Zeile &amp;quot;Other ... options&amp;quot; ein Eintrag beginnend mit &amp;quot;-bm&amp;quot; der auf ein ebenfalls von coregen erzeugtes .bmm file zeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]&lt;br /&gt;
&lt;br /&gt;
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.&lt;br /&gt;
Der Teil ganz links ist der in ersten Coregen fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst&lt;br /&gt;
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den &amp;quot;Process Properties&amp;quot; läuft zwar der Schritt Translate und alle folgenden&lt;br /&gt;
durch, aber es wird Probleme bei &amp;quot;Vereinigung von Programm-binarie und FPGA bitfile geben -&amp;gt; die FPGA logic wird zwar funktionieren, aber es wird kein Programm &lt;br /&gt;
auf dem Softcore laufen.&lt;br /&gt;
&lt;br /&gt;
=Generierung Compilerumgebung und microblaze-programm=&lt;br /&gt;
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, &lt;br /&gt;
das findet sich im Ordner EDK (Embedded Development Kit):&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]&lt;br /&gt;
&lt;br /&gt;
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.&lt;br /&gt;
&lt;br /&gt;
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er &lt;br /&gt;
das fenster &amp;quot;project explorer&amp;quot; überdeckt. Jetzt müßen wir nacheinander 3 verschieden &amp;quot;typen&amp;quot; von &amp;quot;projekten&amp;quot; anlegen:&lt;br /&gt;
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.&lt;br /&gt;
 Diese benötigt die Infos aus dem Coregenlauf&lt;br /&gt;
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem&lt;br /&gt;
*C/C++projekt die leere C-datei für das eigentliche Programm&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sdk project wizards.png|thumb|center|400px|New -&amp;gt; Projects]]&lt;br /&gt;
&lt;br /&gt;
==Hardware Platform Specification==&lt;br /&gt;
File -&amp;gt; new -&amp;gt; project -&amp;gt; Xilinx -&amp;gt; Hardware Platform Specification&lt;br /&gt;
&lt;br /&gt;
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit&lt;br /&gt;
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf&lt;br /&gt;
anzugeben, es findet sich daher in dem Verzeichniss Core.&lt;br /&gt;
&lt;br /&gt;
==Erstellung Hardware project==&lt;br /&gt;
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]&lt;br /&gt;
==Erstellung Board support package==&lt;br /&gt;
==Erstellung Programm==&lt;br /&gt;
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;xparameters.h&amp;gt;&lt;br /&gt;
#include &amp;lt;xiomodule.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_DELAY 100000&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	//instantiate IOs&lt;br /&gt;
	XIOModule GPIO;&lt;br /&gt;
&lt;br /&gt;
	volatile u32 i = 0;&lt;br /&gt;
&lt;br /&gt;
	//initialize IOs&lt;br /&gt;
	XIOModule_Initialize(&amp;amp;GPIO, XPAR_IOMODULE_0_DEVICE_ID);&lt;br /&gt;
	XIOModule_Start(&amp;amp;GPIO);&lt;br /&gt;
&lt;br /&gt;
	//LED&lt;br /&gt;
	bool led_on = false;&lt;br /&gt;
	int run = 1;&lt;br /&gt;
&lt;br /&gt;
	for (;;)&lt;br /&gt;
	{&lt;br /&gt;
		if (led_on) {XIOModule_DiscreteWrite(&amp;amp;GPIO, 3,run);&lt;br /&gt;
		             if (run == 0x20) run = 1; else run *= 2;}&lt;br /&gt;
		led_on = !led_on;&lt;br /&gt;
		for(i=0;i &amp;lt; LED_DELAY; ++i);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==&lt;br /&gt;
&lt;br /&gt;
= Literatur =&lt;br /&gt;
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. &lt;br /&gt;
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.&lt;br /&gt;
&lt;br /&gt;
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html&lt;br /&gt;
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity&lt;br /&gt;
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Ss_after_setup_tcl.png&amp;diff=87577</id>
		<title>Datei:Ss after setup tcl.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Ss_after_setup_tcl.png&amp;diff=87577"/>
		<updated>2015-02-26T21:57:52Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Screenshoot Xilinx Settings ngdbuilt: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshoot Xilinx Settings ngdbuilt: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Ss_tcl_console.png&amp;diff=87576</id>
		<title>Datei:Ss tcl console.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Ss_tcl_console.png&amp;diff=87576"/>
		<updated>2015-02-26T21:53:33Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Screenshoot Xilinx Projektnavigator - Tcl-Console: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshoot Xilinx Projektnavigator - Tcl-Console: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Ss_coregen_info_tcl.png&amp;diff=87575</id>
		<title>Datei:Ss coregen info tcl.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Ss_coregen_info_tcl.png&amp;diff=87575"/>
		<updated>2015-02-26T21:49:01Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Screenshoot Xilinx Coregen - Hinweis nach Generierung: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshoot Xilinx Coregen - Hinweis nach Generierung: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Ss_coregen_info_sdk.png&amp;diff=87574</id>
		<title>Datei:Ss coregen info sdk.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Ss_coregen_info_sdk.png&amp;diff=87574"/>
		<updated>2015-02-26T21:46:08Z</updated>

		<summary type="html">&lt;p&gt;Fpgakuechle: Screenshoot Xilinx Coregen - Hinweis nach der Genreierung: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshoot Xilinx Coregen - Hinweis nach der Genreierung: Screenshoot taken by Volker Urban (fpgakuechle) licence: CC-BY 3.0 http://creativecommons.org/licenses/by/3.0/de/ in respect with regulations regarding software screenshots (here Xilinx Inc.)&lt;/div&gt;</summary>
		<author><name>Fpgakuechle</name></author>
	</entry>
</feed>