Fehlermeldung: Type error resolving infix expression "<=" as type ieee.std_logic_1164.STD_LOGIC.

Gast #4894093
Lesenswert?

Hallo Leute :)

Wie schon im Betreff angegeben, bekomme ich diese Fehlermeldung:
"Type error resolving infix expression "<=" as type 
ieee.std_logic_1164.STD_LOGIC."

Irgendwie habe ich auch im Internet nichts gefunden. Das Beispiel, was 
ich versucht habe zu programmieren, ist eigentlich sehr einfach.

Meine Idee war es einen 1 zu 4 Demultiplexer zu programmieren: Das 
Eingangsbit E soll, abhängig von der Selektionsvariable SEL, auf einen 
von vier Ausgängen geschalten werden. Die anderen Ausgänge sollen 
hochohmig sein. Ein Low-aktiver Freigabeeingang EN sorgt dafür, dass 
alle Ausgänge hochohmig werden, falls EN nicht aktiviert ist.

Das ist meine Entity + Architecture:
1
 library IEEE;
2
use IEEE.std_logic_1164.all;
3

4
entity demu is 
5
  port (e_i  : in  std_logic;
6
      en_i  : in  std_logic;
7
      sel_i  : in  std_logic_vector (1 downto 0);
8
      q_o  : out  std_logic_vector (3 downto 0));
9
end entity demu;
10

11
architecture rtl of demu is
12
begin 
13
  p_demu : process (e_i, sel_i, en_i)
14
    begin
15
      if en_i = '1' then 
16
        q_o <= (others => 'Z');
17
      else 
18
        case sel_i is 
19
          when "00" => q_o(0) <= e_i,
20
                 q_o(3 downto 1) <= (others => 'Z');
21
          
22
          when "01" => q_o(1) <= e_i,
23
                 q_o(3 downto 2) <= (others => 'Z'),
24
                 q_o(0) <= 'Z';
25
          
26
          when "10" => q_o(2) <= e_i,
27
                 q_o(3) <= 'Z',
28
                 q_o(1 downto 0) <= (others => 'Z');
29
          
30
          when others => q_o(3) <= 'Z',
31
                   q_o(2 downto 0) <= (others => 'Z');
32
        end case;
33
      end if;
34
  end process p_demu;
35
end architecture rtl;



Irgendwie habe ich das Gefühl, dass ich den Ausgang q_o so nicht 
beschalten kann aber ich hoffe ihr könnt mir da weiterhelfen.

MfG
#4894102
Lesenswert?

1
          when "01" => q_o(1) <= e_i,
2
                 q_o(3 downto 2) <= (others => 'Z'),
3
                 q_o(0) <= 'Z';

Vielleicht so:
1
          when "01" => 
2
                 q_o(1) <= e_i;
3
                 q_o(3 downto 2) <= (others => 'Z');
4
                 q_o(0) <= 'Z';

Allerdings bin ich mir nicht sicher, ob 'Z' ausserhalb des Toplevels (wo 
man die enable-Buffer des FPGA benutzt) überhaupt geht. Probiers aus...
Gast #4894109
Lesenswert?

Super, danke jetzt habe ich auch keine Fehlermeldungen mehr :)

Ist es eigentlich ratsam, nur einen Ausgang mit einer Datenbreite von 4 
Bit (in meinem Fall q_o) zu verwenden oder ist es ist eigentlich besser 
wenn ich vier Ausgänge mit jeweils einem Bit verwende?

MfG
#4894135
Lesenswert?

Johannes H. schrieb:
> Super, danke jetzt habe ich auch keine Fehlermeldungen mehr :)
>
> Ist es eigentlich ratsam, nur einen Ausgang mit einer Datenbreite von 4
> Bit (in meinem Fall q_o) zu verwenden oder ist es ist eigentlich besser
> wenn ich vier Ausgänge mit jeweils einem Bit verwende?
>
> MfG

Besser wofür? Für die Lesbarkeit eher nicht.

Der Synthese ist das relativ schnurz. Die macht so oder so dasselbe 
draus.
Moderator (Firma: Titel) Persönliche Seite #4894680
Lesenswert?

Du könntest es auch mit dem & Operator probieren:
1
          :
2
          when "00" =>   q_o <= "ZZZ" & e_i;
3
          when "01" =>   q_o <= "ZZ"  & e_i  & 'Z';
4
          when "10" =>   q_o <= 'Z'   & e_i  & "ZZ";
5
          when others => q_o <=         e_i  & "ZZZ";
6
          :
Oder es so machen:
1
      :
2
      q_o <= "ZZZZ"
3
      if en_i = '0' then 
4
        case sel_i is 
5
          when "00" =>   q_o(0) <= e_i;
6
          when "01" =>   q_o(1) <= e_i;
7
          when "10" =>   q_o(2) <= e_i;
8
          when others => q_o(3) <= e_i;
9
      :
Oder es so zu probieren:
1
      :
2
      q_o <= "ZZZZ"
3
      if en_i = '0' then 
4
          q_o(to_integer(unsigned(sel_i))) <= e_i; 
5
      end if;
6
      :
Da kann es aber seltsame Effekte bei der Simulation geben, und man 
müsste evtl. eine Zwischenvariable zur Hilfe nehmen...  :-/
Gast #4894724
Lesenswert?

Lothar M. schrieb:
>
1
>       :
2
>       q_o <= "ZZZZ"
3
>       if en_i = '0' then
4
>           q_o(to_integer(unsigned(sel_i))) <= e_i;
5
>       end if;
6
>       :
7
>
> Da kann es aber seltsame Effekte bei der Simulation geben, und man
> müsste evtl. eine Zwischenvariable zur Hilfe nehmen...  :-/

<citation needed> :o)

Wieso, das funktioniert zumindest mit GHDL und Modelsim prima, letzte 
Zuweisung gewinnt hat, ist ja ganz normal 'sequential'...
Moderator (Firma: Titel) Persönliche Seite #4894925
Lesenswert?

berndl schrieb:
> Wieso, das funktioniert zumindest mit GHDL und Modelsim prima
Sollte es auch... ;-)

> <citation needed>
Ich muss mal suchen, es könnte aber auch ein Problem mit einer Zuweisung 
von ausserhalb und innerhalb des Prozesses gewesen sein...

Wenn du's schon aufgesetzt hast, probier mal das. Es müsste auch gehen:
1
:
2
begin 
3
  q_o <= "ZZZZ";
4

5
  p_demu : process (e_i, sel_i, en_i)
6
    begin
7
      if en_i = '0' then 
8
          q_o(to_integer(unsigned(sel_i))) <= e_i; 
9
      end if;
10
  end process;
11
:

Und komplett nebenläufig und kompakt das hier:
1
:
2
begin 
3
  q_o <= "ZZZZ";
4
  q_o(to_integer(unsigned(sel_i))) <= e_i when en_i = '0'; -- else 'Z'; 
5
:
Dank der Auflösungstabelle könnte das auch gehen. Obwohl es nach Latch 
aussieht...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren