Forum: FPGA, VHDL & Co. Frage zu Cast


von Martin (Gast)


Lesenswert?

Hallo,

ich habe ein VHDL Modul, an dem ich gern einen Vektor beliebiger Länge 
übergeben möchte.
Das klappt soweit ganz gut, nur habe ich leider ein Problem, eine 
Konstante der selben Länge zu definieren.

Kann mir jemand sagen, wie ich der Konstante c10ms den wert 0b0...01010 
zuweisen kann? ich habe schon verschiedene Casts probiert, jedoch leider 
ohne Erfolg...

Anbei ein kleiner Codeausschnitt, in dem das Problem aufgeführt ist.
1
entity myEntity is
2
port
3
( iSysRstR        : in  std_logic;            -- Reset, active high
4
  iSysClkC        : in  std_logic;            -- Clock 40MHz
5
  iReactDurS      : in  std_logic_vector;     -- Timeout Duration
6
  [...]
7
);
8
end myEntity;
9
10
architecture myArchitecture of myEntity is
11
  constant c10ms      : std_logic_vector(iReactDurS'high downto 0) := 10;
12
  signal sDurCntI     : std_logic_vector(iReactDurS'high downto 0);
13
  
14
begin
15
[...]

Viele Grüße
Martin

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


Lesenswert?

>   constant c10ms      : std_logic_vector(iReactDurS'high downto 0) := 10;
10 ist eine Integer Zahl, ein 2-Bit-Vektor wäre z.B. "10"

> wie ich der Konstante c10ms den wert 0b0...01010 zuweisen kann?
In diese Richtung etwa:
1
   constant c10ms      : std_logic_vector(iReactDurS'high downto 0) := (3 downto 0 => "1010", others => '0');

Du wirst übrigens ein Problem haben bzw. bekommen können, denn 
uneingeschränkte Vektoren haben die Zählrichtung (0 to x). Du kannst 
also durchaus Probleme bei der Zuweisung und der Interpretation der 
Bitreihenfolge bekommen...
Übergib besser gleich z.B. anhand eines Generic definierte Vektoren.

von Martin (Gast)


Lesenswert?

Vielen Dank für Deine Antwort. Leider funktioniert Dein vorgeschlagenes 
Vorgehen nicht ganz:
1
if (sDurCntI >= c10ms ) then
führt zu den folgenden Fehlermeldungen:
@E: CD393 :"W:\design\file.vhd":39:86:39:91|String doesn't match type 
std_logic
@E: CD393 :"W:\design\file.vhd":39:86:39:91|String doesn't match type 
std_logic "1010"
@E: CD308 :"W:\design\file.vhd":39:86:39:91|Unable to evaluate 
expression type
@E: CD351 :"W:\design\file.vhd":39:86:39:91|Can't implement expression 
type string yet

Hast Du noch eine Idee, wie ich dem beikommen kann?

Bezüglich der Reihenfolge des Vektors sehe ich in diesem Fall kein 
Problem, da wir diesbezüglich einen Coding Style haben, der auch 
eingehalten wird.

Viele Grüße,
  Martin

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


Lesenswert?

So klappt das bei mir:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity UV is
6
    Port ( vector  : in   STD_LOGIC_VECTOR;
7
           equal   : out  STD_LOGIC;
8
           less    : out  STD_LOGIC;
9
           greater : out  STD_LOGIC);
10
end UV;
11
12
architecture Behavioral of UV is
13
constant const     : unsigned := to_unsigned(10,vecin'length);
14
signal   var       : unsigned(vector'high downto 0);
15
begin
16
   var     <= unsigned(vector);
17
   equal   <= '1' when var = const else '0';
18
   less    <= '1' when var < const else '0';
19
   greater <= '1' when var > const else '0';
20
end Behavioral;

von Martin (Gast)


Lesenswert?

Vielen Dank, ich werd es nachher mal ausprobieren.

Viele Grüße,
Martin

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.