Hast du einen Effekt wie in Beitrag "integer zu logic_vector und zurück"
Bei den Libs solltest dich für die Good Old School
1 | use IEEE.STD_LOGIC_ARITH.ALL;
|
2 | use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
oder die modernere Variante
1 | use IEEE.NUMERIC_STD.ALL;
|
entscheiden.
SPI basiert auf Schieberegistern. Warum machst du dann nicht einfach den
MOSI (müsste eigenlich richtig MISO heissen, der Master ist der AVR) zum
ersten Bit eines Schieberegisters? Ok, ok, ich sehe ein, dass auf dem
CPLD FFs ein wenig rar sind, aber dafür gibts ja FPGAs (z.B. die
schnuckeligen kleinen MachXO von Lattice)...
Pass aber gut auf, dass deine 2 Taktdomänen gegeneinander verriegelt
(oder synchronisiert) sind:
> ... rising_edge(clk) ...
> ... rising_edge(spi_clk) ...
@ Falk
>>elsif rising_edge(spi_clk)and HS_AVR = '0' and sig_HS_CPLD = '1' then
>Solche Sachen sollte der Compiler nicht durchgehen lassen
Tut er aber.
Ich konnte es auch nicht glauben, habe es dann aber ausprobiert.
Siehe da, es geht:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use IEEE.numeric_std.ALL;
|
4 |
|
5 | entity EdgeUndLogik is
|
6 | Port ( clk : in STD_LOGIC;
|
7 | inp : in STD_LOGIC_VECTOR (7 downto 0);
|
8 | outA : out STD_LOGIC_VECTOR (7 downto 0);
|
9 | outB : out STD_LOGIC_VECTOR (7 downto 0);
|
10 | selA : in STD_LOGIC;
|
11 | selB : in STD_LOGIC);
|
12 | end EdgeUndLogik;
|
13 |
|
14 | architecture Behavioral of EdgeUndLogik is
|
15 |
|
16 | begin
|
17 | process (clk, selA)
|
18 | begin
|
19 | if rising_edge(clk) and (selA='1') then
|
20 | outA <= inp;
|
21 | end if;
|
22 | end process;
|
23 |
|
24 | process (clk)
|
25 | begin
|
26 | if rising_edge(clk) then
|
27 | if (selB='1') then
|
28 | outB <= inp;
|
29 | end if;
|
30 | end if;
|
31 | end process;
|
32 | end Behavioral;
|
Beides mal wird das selbe generiert: Einfach nur ein Clock-Enable.
RTL-Schematic siehe Anhang.