Forum: FPGA, VHDL & Co. [VHDL] Counter


von Wolfi (Gast)


Lesenswert?

Hallo,

ich weiß nicht mehr weiter...
Ich wollte in VHDL einen Counter schreiben aber beim syntehtisieren 
(ISE) bekomme ich nur immer '+ can not have such operands in this 
context'
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
4
entity COUNTER is
5
      Port (     CLK : In    STD_LOGIC;
6
              ENABLE : In    STD_LOGIC;
7
                MODE : In    STD_LOGIC;
8
              REG_IN : In    std_logic_vector (3 downto 0);
9
                 RES : In    STD_LOGIC;
10
              PC_OUT : Out   std_logic_vector (3 downto 0) );
11
end COUNTER;
12
13
architecture BEHAVIORAL of COUNTER is
14
  signal pc_state: std_logic_vector (3 downto 0);
15
begin
16
17
  PC_OUT <= pc_state;
18
  
19
  process (clk, RES)
20
  begin
21
    if (RES = '1') then pc_state <= "0000"; -- Reset asynchron
22
   end if;
23
    
24
   if (ENABLE = '1') then
25
     if (clk='1' and clk'event) then
26
        if (MODE = '1') then 
27
        pc_state <= REG_IN; 
28
      end if;
29
      
30
        if (MODE = '0') then 
31
        if (pc_state="1111") then
32
          pc_state <= "0000";  -- Overflow
33
       else
34
           pc_state <= pc_state + 1;
35
       end if;
36
      end if;
37
     end if;
38
    end if;
39
  end process;
40
41
end BEHAVIORAL;

Weiß jemand warum VHDL den '+' Operator stört?

Wolif

von Thomas H. (mac4ever)


Lesenswert?

Weil Du nicht alle notwendigen Libraries eingebunden hast, damit die ISE 
eine Addition von std_logic_vector synthetisieren kann. Versuch mal
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;

edit:
Ach ja, dein Prozess wird wohl nicht synthetisierbar sein. Wenn du schon 
reset und clk benutzt, dann muss das folgendermaßen heißen:
1
process(reset,clk)
2
begin
3
 if resest = '1' then
4
   -- mach was;
5
 elsif clk='1' AND clk'event then
6
   -- und noch was;
7
 end if; 
8
end process;

von Matthias F. (flint)


Lesenswert?

Schöner wäre es allerdings noch, die standardisierte ieee.numeric_std 
statt der nicht überall gleich implementierten std_logic_arith und 
std_logic_unsigned zu verwenden und den Counter als unsigned zu 
deklarieren, denn das ist er ja schließlich auch.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?


von Gast (Gast)


Lesenswert?

Numeric LIB nutzen !  Sieh Dir im ModelSIM, "LIBS" die numeric an und 
schaue, was sie an Rechungen und Conversionen anbietet.

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.