User Login


Sie sind noch nicht eingeloggt!

     anmelden |  registrieren

Termine


08. - 10.12.2014: Frankfurt |
PLC2 - Video Signal Processing

08. - 12.12.2014: Freiburg |
PLC2 - Expert FPGA Schaltungstechnik

08. - 10.12.2014: Mnchen |
PLC2 - Compact ZYNQ for HW Designers

Boards


Spartan 6 FPGA SP605 Evaluation Kit (XC6SLX45T-FGG484)
    

Links


FPGA Hersteller:  Altera
Xilinx
Lattice
FPGA Schulungen:  PLC2
El Camino
Trias
Weiteres:  VHDL ORG

Literatur


Dieter Wecker

Prozessorentwurf

Jahr: 2015
ISBN-10: 3110 4029 63

bitmap_pixelCounter muss ab "0" tätig werden,klappt nicht.

Grundlegende Probleme im Umgang mit VHDL

bitmap_pixelCounter muss ab "0" tätig werden,klappt nicht.

Beitragvon neuling » Mi 17. Sep 2014, 18:29

Hallo, ich lese hier auf einem Screen 320x240 Pixel VGA ein Bild mit 9600 Byte aus einem Array ein.
Das Bild ist wunderbar zu sehen, nur fehlen bei Linien manchmal Pixel.
Habe schon rausgefunden das der "bitmap_pixelCounter" schon 1 hat beim nächsten durchgang
als Zähler und nicht "0" wie er haben sollte.
Ich bekomme das nicht hin.

Ich muss ja am Ende diesen "bitmap_pixelCounter := bitmap_pixelCounter + 1;" hochzählen,
geht ja nicht anders.

Wer kann mal helfen?

Danke.

Gruss

Code: Alles auswählen
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.ALL;

entity vga_core is
port
(
  clk_50: in std_logic;
  red: out std_logic_vector(3 downto 0);
  green: out std_logic_vector(3 downto 0);
  blue: out std_logic_vector(3 downto 0);
  hsync: out std_logic;
  vsync: out std_logic
);
end vga_core;

architecture vga_core_arch of vga_core is

signal clk: std_logic;
signal lineCounter: integer:=0;
signal pixelCounter: integer:=0;

signal ascii : std_logic_vector(7 downto 0);
signal RomAddr  : integer range 0 to 9599 := 0;

type Rom is array (0 to 9599) of unsigned (7 downto 0);
signal ascii_rom : Rom := (
  x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff",
  x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff",
  .........
  ........
    x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff", x"ff" );

begin
 
vga_clk: process(clk_50)
begin
  if rising_edge(clk_50) then
    clk <= NOT clk;
  end if;
end process vga_clk;

vga_testpic: process(clk)

variable bitmap_pixelCounter: integer:= 0;

begin
  if rising_edge(clk) then
   
    pixelCounter <= pixelCounter + 1;
     
    if pixelCounter = 800 then
      pixelCounter <= 0;
      lineCounter <= lineCounter + 1;
    end if;
   
    if lineCounter = 525 then
      lineCounter <= 0;
    end if;

    if pixelCounter >= 655 AND pixelCounter  <= 751 then
      hsync <= '0';
    else
      hsync <= '1';
    end if;
   
    if lineCounter  >= 489 AND lineCounter <= 491 then
      vsync <= '0';
    else
      vsync <= '1';
    end if;
 
    if pixelCounter >= 0 AND pixelCounter <= 319 AND lineCounter >=  0 AND lineCounter <= 239 then
      if bitmap_pixelCounter <= 7 then 
        if ascii(bitmap_pixelCounter) = '1' then
          green <= "1111";
        else
          green <= "0000";
        end if;
      else
        bitmap_pixelCounter := 0;
        RomAddr <= RomAddr + 1; 
        if RomAddr = 9599 then
          romaddr <= 0;
        end if;
        ascii <= std_logic_vector(ascii_rom(RomAddr));         
      end if;   
    else
      red <= "0000";
      green <= "0000";
      blue <= "0000";
    end if;
    bitmap_pixelCounter := bitmap_pixelCounter + 1;
  end if;
end process vga_testpic;

end architecture vga_core_arch;
neuling
 
Beiträge: 45
Registriert: So 25. Mai 2014, 18:29

Re: bitmap_pixelCounter muss ab "0" tätig werden,klappt nic

Beitragvon eilert » Di 23. Sep 2014, 11:20

Hi,
bitmap_pixel_counter ist eine Variable.
Daher wird sie im Prozess sofort verändert (z.B. 0+1=1.)
Aber auch als Signal würde die letzte Zuweisung "gewinnen".

Setz doch mal das unvermeidliche
bitmap_pixelCounter := bitmap_pixelCounter + 1;
an den Anfang des Prozesses gleich nach der Taktflankenabfrage.
Dann bleibt die zugewiesene '0' bis zum nächsten Takt erhalten.
(Es können sich dadurch natürlich andere Dinge verschieben...)

Und schau dir die Geschichte mit deinem clk signal mal an.
Das geht jetzt über normale Routing Netze und nicht über ein spezielles Taktnetz.
Da können durch Laufzeitunterschiede seltsame Dinge passieren.

Erzeuge lieber ein CE signal und schreibe in deinen Prozessen:

if rising_edge(clk_50) then
if CE='1' then
-- ....
end if;
end if;

Viele Gruesse
Eilert
eilert
 
Beiträge: 72
Registriert: Fr 15. Jun 2012, 09:22

Re: bitmap_pixelCounter muss ab "0" tätig werden,klappt nic

Beitragvon neuling » Mi 24. Sep 2014, 08:20

Jup, danke für deine Antwort.

GRuss
neuling
 
Beiträge: 45
Registriert: So 25. Mai 2014, 18:29


Zurück zu VHDL Basics

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

cron