Hallo zusammen. Ich versuche momentan ein Sharp LM038QB1R10 mit Hilfe eines Spartan-3 boardes anzusteuern. Mein ziel war es erstmal etwas darzustellen (ein Rechteck oben links auf dem Display). Es tut sich zwar schon etwas aber irgendwie scheint es da noch probleme zu geben... Das Display flackert städig... Kann es am Timing liegen? Würde mich über Hilfe freuen, weil ich momentan gar nicht weiter komme
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.STD_LOGIC_ARITH.ALL; |
4 | use IEEE.STD_LOGIC_UNSIGNED.ALL; |
5 | |
6 | ---- Uncomment the following library declaration if instantiating
|
7 | ---- any Xilinx primitives in this code.
|
8 | --library UNISIM;
|
9 | --use UNISIM.VComponents.all;
|
10 | |
11 | entity displayansteuerung is |
12 | port( d : out std_logic_vector(3 downto 0); |
13 | yd : out std_logic ; |
14 | m : out std_logic; |
15 | lp : out std_logic; |
16 | disp : out std_logic; |
17 | start : in std_logic; |
18 | reset : in std_logic; |
19 | xck : out std_logic; -- 3,125 MHz Takt |
20 | clk : in std_logic);-- 50 MHz Takt |
21 | |
22 | |
23 | end displayansteuerung; |
24 | |
25 | architecture Behavioral of displayansteuerung is |
26 | signal xck_intern : std_logic_vector(3 downto 0); -- 3,125 MHz Takt |
27 | signal x_i : integer range 0 to 127; |
28 | signal y_i : integer range 0 to 255; |
29 | signal x : std_logic_vector(6 downto 0); |
30 | signal y : std_logic_vector(7 downto 0); |
31 | signal m_intern : std_logic ; |
32 | signal verri : std_logic ; |
33 | |
34 | begin
|
35 | |
36 | disp <= '1'; |
37 | |
38 | process(clk) |
39 | begin
|
40 | if(rising_edge(clk)) then |
41 | if(reset = '1') then |
42 | xck_intern <= "0000"; |
43 | else
|
44 | xck_intern <= xck_intern + "0001"; -- generieren einen 3,125 MHz Takt |
45 | end if; |
46 | end if; |
47 | end process; |
48 | |
49 | |
50 | process(xck_intern(3)) |
51 | |
52 | begin
|
53 | if (falling_edge(xck_intern(3))) then |
54 | |
55 | if (start = '1') then |
56 | x <= "0000000"; |
57 | y <= "00000000"; |
58 | verri <= '1'; |
59 | m_intern <= '0'; |
60 | |
61 | else
|
62 | if(verri = '1') then |
63 | |
64 | if (x < "1001111") then -- if-Schleife f¨¹r Einlesen einer Zeile, 79 Einheiten |
65 | x <= x + "0000001"; |
66 | lp <= '0'; |
67 | else
|
68 | lp <= '1'; |
69 | x <= "0000000"; -- wenn x 80 ist, wird er zurueckgesetzt |
70 | if (y < "11110011") then -- Z zaehlt bis 243 |
71 | if ((y = "00001100") and (x = "1001111")) then -- m_intern wird invertiert nach 13. Zeile ; |
72 | m_intern <= (not m_intern); |
73 | else
|
74 | m_intern <= m_intern; |
75 | end if; |
76 | y <= y + "00000001"; |
77 | else
|
78 | y <= "00000000"; |
79 | end if; |
80 | end if; |
81 | end if; |
82 | end if; |
83 | end if; |
84 | |
85 | end process; |
86 | |
87 | xck <= xck_intern(3); |
88 | |
89 | m <= m_intern; |
90 | |
91 | yd <= '1' when (y = "00000001") else -- signalisieren YD nach der 1. Zeile |
92 | '0'; |
93 | |
94 | x_i <= conv_integer(x); |
95 | y_i <= conv_integer(y); |
96 | |
97 | |
98 | d <= "0000" when ((x_i <= 4)and (y_i <= 39)) else -- dunkler Rechteck, 20 * 40, oben-links |
99 | "1111"; |
100 | |
101 | |
102 | |
103 | end Behavioral; |