Forum: FPGA, VHDL & Co. Fehlermeldung: Type error resolving infix expression "<=" as type ieee.std_logic_1164.STD_LOGIC.


von Johannes H. (Gast)


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

von Markus F. (mfro)


Lesenswert?

Johannes H. schrieb:
> Irgendwie habe ich das Gefühl, ...

Ich auch.

Tipp: such' mal nach Kommas, wo keine hingehören.

Ob das Ding dann aber das tut, was es soll, mußt Du selber rausfinden.

von P. K. (pek)


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...

von Johannes H. (Gast)


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

von Markus F. (mfro)


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.

von Johannes H. (Gast)


Lesenswert?

Super vielen Dank für die Hilfe. Hat dank euch funktioniert :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...  :-/

: Bearbeitet durch Moderator
von berndl (Gast)


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'...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.