www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Problem mit Portmapping


Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,


ich bin noch ziemlich unerfahren mit vhdl vondaher bitte ich um etwas 
nachsicht.
Mein Problem:

habe eine datei analysis.vhd mit folgender entity:
entity analysis is

port(
    analysisClk            : in std_logic;
    analysisReset          : in std_logic;
    analysisHSync          : in std_logic;
    analysisVSync          : in std_logic;
    analysisDE            : in std_logic;
    
    formatChange          : out std_logic;
    resetFormatChange        : in std_logic;
  
    -- analysisResults
    aResult_totalPix        : inout std_logic_vector (11 downto 0);
    aResult_totalLines        : inout std_logic_vector (10 downto 0);
    aResult_activePix        : out std_logic_vector (11 downto 0);
    aResult_activeLines        : out std_logic_vector (10 downto 0);
    aResult_hSync          : out std_logic_vector (5 downto 0);
    aResult_vSync          : out std_logic_vector (5 downto 0);
    aResult_horizontalFrontPorch  : out std_logic_vector (9 downto 0);
    aResult_horizontalBackPorch    : out std_logic_vector (9 downto 0);
    aResult_hSyncPolarity      : out std_logic;
    aResult_verticalFrontPorch    : out std_logic_vector (2 downto 0);
    aResult_verticalBackPorch    : out std_logic_vector (5 downto 0);
    aResult_vSyncPolarity      : out std_logic
    
  );

end;

meine zweite datei mux_displayUnit.vhd hat folgende entity:
entity mux_displayUnit is

port(
    muxClk                : in std_logic;  
  
    -- signal to select which data will be used
    sel                  : in std_logic_vector (7 downto 0);
    
    -- signaldata handed from the analysis
    anaResult_pixHorizontal        : in std_logic_vector(11 downto 0);
    anaResult_linesVertical        : in std_logic_vector(10 downto 0);
    anaResult_pixTotalHorizontal    : in std_logic_vector(11 downto 0);
    anaResult_linesTotalVertical    : in std_logic_vector(10 downto 0);
    anaResult_syncPixHorizontal      : in std_logic_vector(5 downto 0);
    anaResult_syncPixVertical      : in std_logic_vector(5 downto 0);
    anaResult_frontPorchHorizontal    : in std_logic_vector(9 downto 0);
    anaResult_frontPorchVertical    : in std_logic_vector(2 downto 0);
    anaResult_backPorchHorizontal    : in std_logic_vector(9 downto 0);
    anaResult_backPorchVertical      : in std_logic_vector(5 downto 0);
    anaResult_syncPolarityHorizontal  : in std_logic;
    anaResult_syncPolarityVertical    : in std_logic;

  );

in der top.vhd habe ich folgenden eintrag:
bb: analysis
  port map(
      analysisClk            => Clk_G,
      analysisReset          => S_Reset,
      analysisHSync          => internH,
      analysisVSync          => internV,
      analysisDE            => internDE,
      aResult_totalPix        => anaResult_pixTotalHorizontal,
      aResult_totalLines        => anaResult_linesTotalVertical,
      aResult_activePix        => anaResult_pixHorizontal,
      aResult_activeLines        => anaResult_linesVertical,
      aResult_hSync          => anaResult_syncPixHorizontal,
      aResult_vSync          => anaResult_syncPixVertical,
      aResult_horizontalFrontPorch  => anaResult_frontPorchHorizontal,
      aResult_horizontalBackPorch    => anaResult_backPorchHorizontal,
      aResult_hSyncPolarity      => anaResult_syncPolarityHorizontal,
      aResult_verticalFrontPorch    => anaResult_frontPorchVertical,
      aResult_verticalBackPorch    => anaResult_backPorchHorizontal,
      aResult_vSyncPolarity      => anaResult_syncPolarityVertical,
      formatChange          => formatChange,
      resetFormatChange        => resetFormatChange


      );


ich will sozusagen die anliegen signal einfach nur durchreichen... d.h. 
von den "out"-ports (analysis.vhd) zu den "in"-ports 
(mux_displayUnit.vhd) weiterleiten ohne diese irgendwie zu verändern 
oder sonst...
leider bekomm ich folgende fehlermeldung:
top.vhd(210): ERROR: anaresult_pixtotalhorizontal with mode 'in' cannot be updated
top.vhd(211): ERROR: anaresult_linestotalvertical with mode 'in' cannot be updated
top.vhd(212): ERROR: anaresult_pixhorizontal with mode 'in' cannot be updated
top.vhd(213): ERROR: anaresult_linesvertical with mode 'in' cannot be updated
top.vhd(214): ERROR: anaresult_syncpixhorizontal with mode 'in' cannot be updated
top.vhd(215): ERROR: anaresult_syncpixvertical with mode 'in' cannot be updated
top.vhd(216): ERROR: anaresult_frontporchhorizontal with mode 'in' cannot be updated
top.vhd(217): ERROR: anaresult_backporchhorizontal with mode 'in' cannot be updated
top.vhd(218): ERROR: anaresult_syncpolarityhorizontal with mode 'in' cannot be updated
top.vhd(219): ERROR: anaresult_frontporchvertical with mode 'in' cannot be updated
top.vhd(220): ERROR: anaresult_backporchhorizontal with mode 'in' cannot be updated
top.vhd(221): ERROR: anaresult_syncpolarityvertical with mode 'in' cannot be updated

leider verstehe ich nicht warum der Fehler auftritt, die "modes" 
(in/out) sind doch richtig oder ?

vielen dank im vorraus

grüße heiko

Autor: Andi Z. (duderino65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

das hab ich auch schon versucht. du musst in deiner top.vhd 
"zwischensignale" deklarieren und diese dann den jeweiligen ports 
zuweisen.

mfg

Andi

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
boah das ging zügig mit der antwort.... vielen vielen dank !

werds gleich umsetzen :)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
z.B.
 aResult_totalLines ist ein inout Port, da kann also auch was 
herauskommen.
 anaResult_linesTotalVertical ist ein in Port, da kann nur was 
hineingehen.

Und jetzt willst du dem  aResult_totalLines vom 
anaResult_linesTotalVertical etwas zuweisen. Das geht nicht.

inout Ports solltest du nur dort verwenden, wo auch entsprechende 
bidirketionale Bauelemente im FPGA vorhanden sind: direkt in der 
Top-Entity an den IO-Pins.

Welche Signalflussrichtung hat dein aResult_totalLines wiklich?

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aResult_totalLines müsste eigentlich wie die anderen auch "out" sein.

ich möchte eigentlich nur die ergebnisse die mir die analysis.vhd an 
ihren "out"-ports liefert verknüpfen mit den "in"-ports vom 
mux_displayUnit.vhd

ich hab nun "zwischensignale" erstellt , der aussschnitt von der top.vhd 
entity:
tempAnaResult_pixHorizontal      : inout std_logic_vector(11 downto 0);
    tempAnaResult_linesVertical      : inout std_logic_vector(10 downto 0);    
    tempAnaResult_pixTotalHorizontal  : inout std_logic_vector(11 downto 0);
    tempAnaResult_linesTotalVertical  : inout std_logic_vector(10 downto 0);
    tempAnaResult_syncPixHorizontal    : inout std_logic_vector(5 downto 0);
    tempAnaResult_syncPixVertical    : inout std_logic_vector(5 downto 0);
    tempAnaResult_frontPorchHorizontal  : inout std_logic_vector(9 downto 0);
    tempAnaResult_frontPorchVertical  : inout std_logic_vector(2 downto 0);
    tempAnaResult_backPorchHorizontal  : inout std_logic_vector(9 downto 0);
    tempAnaResult_backPorchVertical    : inout std_logic_vector(5 downto 0);
    tempAnaResult_syncPolarityHorizontal: inout std_logic;
    tempAnaResult_syncPolarityVertical  : inout std_logic;  

diese wollte ich nun mit den jeweiligen ports von der analyse und dem 
mux verbinden:
bb: analysis
  port map(
      analysisClk            => Clk_G,
      analysisReset          => S_Reset,
      analysisHSync          => internH,
      analysisVSync          => internV,
      analysisDE            => internDE,
      aResult_totalPix        => tempAnaResult_pixTotalHorizontal,
      aResult_totalLines        => tempAnaResult_linesTotalVertical,
      aResult_activePix        => tempAnaResult_pixHorizontal,
      aResult_activeLines        => tempAnaResult_linesVertical,
      aResult_hSync          => tempAnaResult_syncPixHorizontal,
      aResult_vSync          => tempAnaResult_syncPixVertical,
      aResult_horizontalFrontPorch  => tempAnaResult_frontPorchHorizontal,
      aResult_horizontalBackPorch    => tempAnaResult_backPorchHorizontal,
      aResult_hSyncPolarity      => tempAnaResult_syncPolarityHorizontal,
      aResult_verticalFrontPorch    => tempAnaResult_frontPorchVertical,
      aResult_verticalBackPorch    => tempAnaResult_backPorchHorizontal,
      aResult_vSyncPolarity      => tempAnaResult_syncPolarityVertical,
      formatChange          => formatChange,
      resetFormatChange        => resetFormatChange

      );

cc: mux_displayUnit
  port map(
      muxClk                  => Clk_G,
      tempAnaResult_pixTotalHorizontal    => anaResult_pixTotalHorizontal,
      tempAnaResult_linesTotalVertical    => anaResult_linesTotalVertical, 
      tempAnaResult_pixHorizontal        => anaResult_pixHorizontal,
      tempAnaResult_linesVertical        => anaResult_linesVertical,
      tempAnaResult_syncPixHorizontal      => anaResult_syncPixHorizontal,
      tempAnaResult_syncPixVertical      => anaResult_syncPixVertical,
      tempAnaResult_frontPorchHorizontal    => anaResult_frontPorchHorizontal,
      tempAnaResult_backPorchHorizontal    => anaResult_backPorchHorizontal,
      tempAnaResult_syncPolarityHorizontal  => anaResult_syncPolarityHorizontal,
      tempAnaResult_frontPorchVertical    => anaResult_frontPorchVertical,
      tempAnaResult_backPorchVertical      => anaResult_backPorchVertical,
      tempAnaResult_syncPolarityVertical    => anaResult_syncPolarityVertical  
      );

nur bekomme ich nun leider wieder folgenden fehler:
top.vhd(294): ERROR: anaresult_pixtotalhorizontal with mode 'in' cannot be updated
top.vhd(295): ERROR: anaresult_linestotalvertical with mode 'in' cannot be updated
top.vhd(296): ERROR: anaresult_pixhorizontal with mode 'in' cannot be updated
top.vhd(297): ERROR: anaresult_linesvertical with mode 'in' cannot be updated
top.vhd(298): ERROR: anaresult_syncpixhorizontal with mode 'in' cannot be updated
top.vhd(299): ERROR: anaresult_syncpixvertical with mode 'in' cannot be updated
top.vhd(300): ERROR: anaresult_frontporchhorizontal with mode 'in' cannot be updated
top.vhd(301): ERROR: anaresult_backporchhorizontal with mode 'in' cannot be updated
top.vhd(302): ERROR: anaresult_syncpolarityhorizontal with mode 'in' cannot be updated
top.vhd(303): ERROR: anaresult_frontporchvertical with mode 'in' cannot be updated
top.vhd(304): ERROR: anaresult_backporchvertical with mode 'in' cannot be updated
top.vhd(305): ERROR: anaresult_syncpolarityvertical with mode 'in' cannot be updated
top.vhd(328): ERROR: unit top_arch ignored due to previous errors

wobei sich die fehlermeldung auf die einträge des mux_displayUnit 
beziehen
...

was habe ich falsch gemacht?

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahhh ich habs !!!



die zuweisung war verdreht:
aus
tempAnaResult_pixTotalHorizontal    => anaResult_pixTotalHorizontal,
muss
anaResult_pixTotalHorizontal    => tempAnaResult_pixTotalHorizontal,
werden usw.

und natürlich muss ich das portmapping entsprechend für das comonent 
angelegt werd aus dem die hilfssignale stammen ... in meinem falle top:
dd: top
  port map(
      anaResult_pixTotalHorizontal       => tempAnaResult_pixTotalHorizontal,
      anaResult_linesTotalVertical      => tempAnaResult_linesTotalVertical, 
      anaResult_pixHorizontal          => tempAnaResult_pixHorizontal,
      anaResult_linesVertical          => tempAnaResult_linesVertical,
      anaResult_syncPixHorizontal        => tempAnaResult_syncPixHorizontal,
      anaResult_syncPixVertical        => tempAnaResult_syncPixVertical,
      anaResult_frontPorchHorizontal      => tempAnaResult_frontPorchHorizontal,
      anaResult_backPorchHorizontal      => tempAnaResult_backPorchHorizontal,
      anaResult_syncPolarityHorizontal    => tempAnaResult_syncPolarityHorizontal,
      anaResult_frontPorchVertical      => tempAnaResult_frontPorchVertical,
      anaResult_backPorchVertical        => tempAnaResult_backPorchVertical,
      anaResult_syncPolarityVertical      => tempAnaResult_syncPolarityVertical
      );

ich möchte mich wirklich für die schnelle und tolle hilfe bedanken...

heiko

Autor: Andi Z. (duderino65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

hast du gerade nur die ports geändert?? also aus in -> inout gemacht??

deine deklarationen waren ja schon richtig. ausser das man vllt auf 
inout ports verzichten sollte.

ich dachte eigentlich an sowas:

analysis.vhd       |      top.vhd         |   mux_dingsbums.vhd
out signal        ->      zwischensignal  ->    in signal

du musste also in der top.vhd signale deklarieren:

z.b
signal pixel_bla : std_logic;...

und in der analysis port map ans richtige signal hängen und in der 
mux_dingsbum port map ans richtige signal legen. eins muss dabei immer 
input und eins output sein.

so z.b
  RAM_MODUL_A : ram_a
    port map(
          WrAdrA    =>wr_adr_a,
          RdAdrA    =>rd_adr_a,
          DataA    =>data,
          WeA      =>we_a,
          RdClkA    =>rdck_2_ram,
          RdClkA_en  =>rdck_a_en,
          ResetA    =>reset,
          WrClkA    =>bick,
          WrClkA_en  =>wrck_a_en,
          Q_A      =>sdto_a_i

        );

  CNTL_A_RAM : cntl_a
    port map(
          bi_clk    => bick,
          lr_clk    => lrck,
          rd_clk    => rdck,

          reset    => reset,

          ram_b_full  => ram_b_f,
          ram_full  => ram_a_f,      

          --Signale RAM_A--
          wr_en_a    => we_a,
          rd_en_a    => rdck_a_en,
          wrck_a_e  => wrck_a_en,
          WrAdr_a    => wr_adr_a,
          RdAdr_a    => rd_adr_a
      );


mfg

Andi

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Andy,

ja genauso hab ichs gemacht ....

die "inout"-ports sind noch reliquen von meinem Projekt-Vorgänger die 
ich noch nicht angepasst habe.

also keine sorge hatte dich richtig verstanden und habe es auch so 
umgesetzt ..

DANKE ;)

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Heiko:

Ein Tip: Wenn Du Dir was Gutes tun willst, schau Dir mal records [1] 
an.

Duke

[1] 
http://en.wikibooks.org/wiki/Programmable_Logic/VH...

Autor: Heiko (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich nochmal,


hab nochmal ne frage:

unzwar wenn ich folgenden eintrag:
dd: top
  port map(
      anaResult_pixTotalHorizontal       => tempAnaResult_pixTotalHorizontal,
      anaResult_linesTotalVertical      => tempAnaResult_linesTotalVertical, 
      anaResult_pixHorizontal          => tempAnaResult_pixHorizontal,
      anaResult_linesVertical          => tempAnaResult_linesVertical,
      anaResult_syncPixHorizontal        => tempAnaResult_syncPixHorizontal,
      anaResult_syncPixVertical        => tempAnaResult_syncPixVertical,
      anaResult_frontPorchHorizontal      => tempAnaResult_frontPorchHorizontal,
      anaResult_backPorchHorizontal      => tempAnaResult_backPorchHorizontal,
      anaResult_syncPolarityHorizontal    => tempAnaResult_syncPolarityHorizontal,
      anaResult_frontPorchVertical      => tempAnaResult_frontPorchVertical,
      anaResult_backPorchVertical        => tempAnaResult_backPorchVertical,
      anaResult_syncPolarityVertical      => tempAnaResult_syncPolarityVertical
      );


in der top.vhd hinzufüge verschwinden zwar alle Fehlermeldungen 
allerdings geht auch irgendwie die struktur meines projektes flöten.
D.H. das meine top.vhd nicht mehr als toplevel-entity erkannt wird und 
ich kann sie auch nicht als toplevel-entity setzen.

kommentiere ich obigen eintrag heraus bekomme ich zwar logischer weise 
fehlermeldungen aber die struktur des projektes ist in ordnung.

bin etwas verwirrt ...

screenshots im anhang um das mit der projekt-struktur besser zu 
verdeutlichen

Autor: Andi Z. (duderino65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das "dd : top" ist meiner meinung nach garnicht nötig.

du brauchst einfach von jeder entity (also analysis und mux) eine 
instanz in deiner top.vhd.

dann machst du die zwischensignale und verbindest die port von jeder 
instanz mit dem zwischensignal.

die top.vhd bruachst du ja nicht zu instanzieren.

ich hoffe ich hab dich recht verstanden.


mfg

Andi

Autor: Andi Z. (duderino65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so z.b.
entity top_modul is
  port  (
        bick  : in std_logic;
        lrck  : in std_logic;
        rdck  : in std_logic;
        reset  : in std_logic;
        
        sdti  : in std_logic;

        sdto  : out std_logic_vector(7 downto 0)
      ); 
end;

architecture structure of top_modul is

  signal we_buf_i    : std_logic;
  signal wrck_e_i    : std_logic;
  signal rdck_e_i     : std_logic;
  signal rdck_buf    : std_logic;

  signal wradd_buf_i  : std_logic_vector(4 downto 0);
  signal rdadd_buf_i  : std_logic_vector(4 downto 0);
  
  component cntl
    port  (
          bi_clk    : in std_logic;
          rd_clk    : in std_logic;
          lr_clk    : in std_logic;

          rst      : in std_logic;
        
          wr_en    : out std_logic;
          wr_clk_e  : out std_logic;
          rd_clk_e  : out std_logic;
          rdck_2_ram  : out std_logic;

          wr_add    : out std_logic_vector(4 downto 0);
          rd_add    : out std_logic_vector(4 downto 0)
        );
  end component;

  
  component ram_modul
    port   (
          data_s    : in std_logic;
          wr_adr    : in std_logic_vector(4 downto 0);
          rd_adr    : in std_logic_vector(4 downto 0);
        
          reset    : in std_logic;
          WE      : in std_logic;
          rd_clk    : in std_logic;
          rd_clk_en  : in std_logic;
        
          wr_clk    : in std_logic;
          wr_clk_en  : in std_logic;

          sdto      : out std_logic_vector(7 downto 0)
        );
  end component;

begin
  
  CONTROL : cntl
    port map  (
            bi_clk    => bick,
            rd_clk    => rdck,
            lr_clk    => lrck,
                        
                        rst      => reset,
                        
                        wr_en    => we_buf_i,    
                        wr_clk_e  => wrck_e_i,  
                        rd_clk_e  => rdck_e_i,  
                        rdck_2_ram  => rdck_buf,
               
                        wr_add    => wradd_buf_i,
                        rd_add    => rdadd_buf_i
           );           


  RAM : ram_modul
    port map  (
            data_s    => sdti,
            wr_adr    => wradd_buf_i,
                        rd_adr    => rdadd_buf_i,
                        
                        reset    => reset,
                        WE      => we_buf_i,    
                        rd_clk    => rdck_buf,    
                        rd_clk_en  => rdck_e_i,   
                       
                        wr_clk    => bick,
                        wr_clk_en  => wrck_e_i,
                        
                        sdto    => sdto
          );


            
  end structure;    

mfg

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Andy,

ja du hattest mich recht verstanden ... und ja es funktioniert jetzt mit 
deiner Hilfe!

vielen herzlichen Dank !!!

Heiko

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.