Messi schrieb:
> Ist das so in Ordnung?
Eines vorneweg: ganz pfiffig wäre es, die DMA-Kanal-Namensgebung wie in
der Software- und Hardwarewelt üblich bei 0 beginnen zu lassen. Denn
wenn "00" den Kanal 1 auswählt und "11" den Kanal 4, dann ist das
zumindest arg unglücklich.
> Oder muss ich bei jedem ENA=1 auch die anderen mit 0 einsetzen?
Das kommt darauf an, wie diene Hardware diese DMA-Anforderungen
abhandelt.
> D.h. alle bis auf 1 Kanal müssen die ENA auf 0 haben.
Ich würde dann den gesamten Klimbim von der Datenstruktur her nicht auf
dieses ausufernde Copy&Paste ausrichten, sondern mit Arrays und einem
Index arbeiten.
Und vor Allem auch mit Datentypen, die Mehrdeutigkeiten ausschließen.
Zuallerserst gehört der dma_channel_no vom std_logic_vector in einen
Integer mit dem range 0 to 15 umgewandelt. Denn dann kannst du den
aktiven DMA-Kanal eben auch als Integer abspeichern und hast in 4 Bits
automatisch nur 1 einzigen aktiven "Kanal", statt einer one-hot
codierten Kanalauswahl mit 15 Bits auf '0' und 1 Bit auf '1'.
> trx_dma_ch1_ena
Wenn du deine Signale umbenennen würdest, könntest du mit Indices
arbeiten. Hier mal dein Copy-Paste-Ansatz:
1 | :
|
2 | signal std_logic trx_dma_ch1_ena,
|
3 | trx_dma_ch2_ena,
|
4 | trx_dma_ch3_ena,
|
5 | trx_dma_ch4_ena,
|
6 | :
|
7 | :
|
8 | :
|
9 | trx_dma_ch15_ena,
|
10 | trx_dma_ch16_ena;
|
11 | :
|
12 | :
|
13 | trx_dma_ch1_ena <= '0';
|
14 | trx_dma_ch2_ena <= '0';
|
15 | trx_dma_ch3_ena <= '0';
|
16 | trx_dma_ch4_ena <= '0';
|
17 | trx_dma_ch5_ena <= '0';
|
18 | trx_dma_ch6_ena <= '0';
|
19 | trx_dma_ch7_ena <= '0';
|
20 | trx_dma_ch8_ena <= '0';
|
21 | trx_dma_ch9_ena <= '0';
|
22 | trx_dma_ch10_ena <= '0';
|
23 | trx_dma_ch11_ena <= '0';
|
24 | trx_dma_ch12_ena <= '0';
|
25 | trx_dma_ch13_ena <= '0';
|
26 | trx_dma_ch14_ena <= '0';
|
27 | trx_dma_ch15_ena <= '0';
|
28 | trx_dma_ch16_ena <= '0';
|
29 | :
|
30 | case dma_channel_no is
|
31 |
|
32 | when "0000" =>
|
33 | trx_dma_ch1_ena <= '1';
|
34 | :
|
35 | when "0001" =>
|
36 | trx_dma_ch2_ena <= '1';
|
37 | :
|
38 | :
|
39 | :
|
40 | :
|
41 | :
|
42 | trx_dma_ch15_ena <= '1';
|
43 | :
|
44 | when "1111" =>
|
45 | trx_dma_ch16_ena <= '1';
|
46 | :
|
Das zieht sich hin, braucht laufend viel Tipparbeit und wehe, da
vergisst mal einer, eine Zahl anzupassen...
Das wäre eine kompaktere one-hot-Lösung:
1 | :
|
2 | signal trx_dma_ena : std_logic_vector (15 downto 0);
|
3 | :
|
4 | trx_dma_ena <= (others=>'0');
|
5 | :
|
6 | trx_dma_ena(to_integer(unsigned(dma_channel_no)) <= '1';
|
7 | :
|
Und ich würde zusehen, dass ich es so machen kann:
1 | :
|
2 | signal trx_dma_ena : integer range 0 to 15 := 0;
|
3 | :
|
4 | :
|
5 | :
|
6 | trx_dma_ena <= to_integer(unsigned(dma_channel_no));
|
7 | :
|