aboutsummaryrefslogtreecommitdiff
path: root/VHDL.wiki
blob: 13f48d7d030a529ea7d0f2b26694517182d9eaba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
= Contents =
  - [[#VHDL|VHDL]]
    - [[#VHDL#Generell struktur|Generell struktur]]
    - [[#VHDL#Exempelkrets|Exempelkrets]]
    - [[#VHDL#Datatytper|Datatytper]]
      - [[#VHDL#Datatytper#std_logic|std_logic]]
      - [[#VHDL#Datatytper#std_logic_vector|std_logic_vector]]
    - [[#VHDL#Typer av satser|Typer av satser]]
      - [[#VHDL#Typer av satser#process|process]]
    - [[#VHDL#Annat trevligt|Annat trevligt]]
      - [[#VHDL#Annat trevligt#with-select-when|with-select-when]]
      - [[#VHDL#Annat trevligt#when-else|when-else]]

= VHDL =

- VHDL :: VHSIC HDL
- VHSIC :: Very High Speed Integrated Circuits
- HDL :: Hardware Description Language

Verilog mer hacker-vänligt, vanligare i USA

VHDL vanligare i Europa

== Generell struktur ==

Gränssnitt mot omvärlden
{{{vhdl
entity namen1 is
  -- Beskrivning av in och utgångar
end entity namn1;
}}}

Intern implementation.
{{{vhdl
architecture namn2 of namn1 is
  -- beskrivning av interna signaler
begin
  -- Beskrivning av funktion
end architecture namn2;
}}}

== Exempelkrets ==

Uttrycket

{{$
\begin{aligned}
c             &= \neg (x \vee y) \\
\text{där } x &= a \wedge b \\
            y &= a \vee b
\end{aligned}
}}$

kan i VHDL realiseras som:

{{{vhdl
entity knet is
    port (a, b : in std_logic;
          c: out std_logic);
end entity knet;
  
architecture fisttry of knet is
  signal x, y : std_logic;
begin
  c <= not (x or y);
  x <= a and b;
  y <= a or b;
end architecture fisttry;
}}}
.


== Datatytper ==
Mycket hårt typat, men nästan inga datatyper. Så nästintill allting
måste deffinieras upp själv. Standardbibliotek lägger dock till
allting man behöver.

Konstiga fulhak undanbedes.

Standardbiblioteket importeras enkalst genom
{{{VHDL
library ieee;                     -- Berätta att biblioteket finns.
use ieee.standard_logic_1164.all; -- Importera det vi vill ha (allt)
}}}

=== std_logic ===
"bit" typ (Namnet bit var tydligen redan upptaget).

Kan ha värdena `01uxz-wlh`.

- `U` Uninitialized
- `X` Forceing unkwon (i simulering när flera utgångar försöker driva signalen)
- `0` tvingad låg
- `1` tvingad hög
- `Z` High impedance (högohmig) (Tri state, stäng av komponenent)
- `-` Don't care 

=== std_logic_vector ===
Vektor av bitar.

Storlek skrivs antingen med `to` eller `downto`. Notera att de är
sepparat implementerade, och man ska hålla sig till den ena om man
inte vet vad man gör.

{{{VHDL
std_logic_vector (0 to 2);
std_logic_vector (5 downto 2);
}}}

== Typer av satser ==

Allting i VHDL är paralellt by default, dock finns:

=== process ===
`process` låter ett block köra i sekventiell ordning. Dock kör alla
`process`-block paralellt gämte varandra. 

== Annat trevligt ==

{{{VHDL
entity mux is
    port (d : in std_logic_vector (0 to 3);
          s : in std_logic_vector (1 downto 0);
          y : out std_logic_vector);
end entity mux;
}}}

=== with-select-when ===

Är begränsad till att högerledet måste vara ett "simpelt" uttryck.

{{{VHDL
architecture behavior1 of mux is
begin
    with s select
        y <= d(0) when "00",
             d(1) when "01",
             d(2) when "10",
             d(3) when others;
end architecture behavior1;
}}}

=== when-else ===
Tillåter "krångliga" uttryck i högerledet.

Första sanna villkoret bestämmer. Allting körs parallellt?

{{{VHDL
architecture behavior2 of mux is
begin
  y <= d(0) when s = "00" else
       d(1) when s = "01" else
       d(2) when s = "10" else
       d(3);
end architecture behavior2;
}}}