1 | component single_port_ram is
|
2 | port
|
3 | (
|
4 | clk : in std_logic;
|
5 | addr : in natural range 0 to 751;
|
6 | data : in std_logic_vector(7 downto 0);
|
7 | we : in std_logic := '1';
|
8 | q : out std_logic_vector(7 downto 0)
|
9 | );
|
10 | end component single_port_ram;
|
11 | vram1: component single_port_ram
|
12 | port map (
|
13 | clk =>VRAM_CLK1,
|
14 | addr =>VRAM_ADDR1,
|
15 | data =>VRAM_IN1,
|
16 | we =>VRAM_WE1,
|
17 | q =>VRAM_OUT1
|
18 | );
|
19 | vram2: component single_port_ram
|
20 | port map (
|
21 | clk =>VRAM_CLK2,
|
22 | addr =>VRAM_ADDR2,
|
23 | data =>VRAM_IN2,
|
24 | we =>VRAM_WE2,
|
25 | q =>VRAM_OUT2
|
26 | );
|
27 |
|
28 |
|
29 | VRAM_CLK1<=SDRAM_CLK WHEN VB='0' ELSE PLL_CLK;
|
30 | VRAM_CLK2<=SDRAM_CLK WHEN VB='1' ELSE PLL_CLK;
|
31 | PROCESS (SDRAM_CLK)
|
32 | BEGIN
|
33 | IF rising_edge(SDRAM_CLK) THEN
|
34 |
|
35 | -----------------------wirte to SDRAM-------------------
|
36 | IF (IMGRDY='0')THEN
|
37 | IF(to_integer(unsigned(SDRAM_ADDR))>437082)THEN----img done
|
38 | IMGRDY<='1';
|
39 | VRAM_ADDR1<=0;
|
40 | VRAM_ADDR2<=0;
|
41 | VB<='0';
|
42 | VB_DONE1<='1';
|
43 | VB_DONE2<='0';
|
44 | SDRAM_ADDR<=(OTHERS=>'0');
|
45 | END IF;
|
46 |
|
47 | AV_RD_N<='1';
|
48 | AV_WR_N<='0';
|
49 | .................
|
50 |
|
51 | END IF;
|
52 | ---------------read from SDRAM-----------------------------
|
53 | IF(IMGRDY='1')THEN
|
54 |
|
55 |
|
56 | AV_RD_N<='0';
|
57 | AV_WR_N<='1';
|
58 | -------------fill video buffer
|
59 | IF(VB='0')THEN----------fill 1st buffer
|
60 | VRAM_ADDR2<=VGA_ADDR;
|
61 |
|
62 | IF(VB_DONE1='0'AND VGA_ADDR=0)THEN -----if buffer 1 is full and new line begins
|
63 | VB<='1';
|
64 | END IF;
|
65 |
|
66 | VRAM_WE1<='1';
|
67 | VRAM_WE2<='0';
|
68 | VB_DONE2<='1';
|
69 | IF(AV_RDVALID='1' and AV_WRQ='0')THEN
|
70 | VRAM_IN1<=AV_RDDATA(7 downto 0);
|
71 | IF(VRAM_ADDR1<751 AND VB_DONE1='1')THEN----- fill buffer1
|
72 | VRAM_ADDR1<=VRAM_ADDR1+1;
|
73 | SDRAM_ADDR<=STD_LOGIC_VECTOR(unsigned(SDRAM_ADDR)+1);
|
74 | ELSE
|
75 | VB_DONE1<='0';
|
76 | VRAM_ADDR1<=0;
|
77 | END IF;
|
78 | END IF;
|
79 | END IF;
|
80 |
|
81 | IF(VB='1')THEN--------fill 2nd video buffer
|
82 | VRAM_ADDR1<=VGA_ADDR;
|
83 |
|
84 | IF(VB_DONE2='0' AND VGA_ADDR=0)THEN
|
85 | VB<='0';
|
86 |
|
87 | END IF;
|
88 |
|
89 | VRAM_WE1<='0';
|
90 | VRAM_WE2<='1';
|
91 | VB_DONE1<='1';
|
92 | IF(AV_RDVALID='1' and AV_WRQ='0')THEN
|
93 | VRAM_IN2<=AV_RDDATA(7 downto 0);
|
94 | IF(VRAM_ADDR2<751 AND VB_DONE2='1')THEN-----fill buffer 2
|
95 | VRAM_ADDR2<=VRAM_ADDR2+1;
|
96 | SDRAM_ADDR<=STD_LOGIC_VECTOR(unsigned(SDRAM_ADDR)+1);
|
97 | ELSE
|
98 | VB_DONE2<='0';
|
99 | VRAM_ADDR2<=0;
|
100 | END IF;
|
101 | END IF;
|
102 | END IF;
|
103 |
|
104 |
|
105 | IF (IMGDONE='1') THEN-----record new image
|
106 | SDRAM_ADDR<=(OTHERS=>'0');
|
107 | IMGRDY<='0';
|
108 | END IF;
|
109 |
|
110 | END IF;
|
111 | END IF;
|
112 |
|
113 |
|
114 | END PROCESS;
|
115 | PROCESS (PLL_CLK) ---------------VGA OUTPUT
|
116 | BEGIN
|
117 | IF rising_edge(PLL_CLK) THEN
|
118 |
|
119 | IF(IMGRDY='0' AND IMGDONE='1')THEN
|
120 |
|
121 | IMGDONE<='0';
|
122 |
|
123 | END IF;
|
124 | IF(XPOS<1055)THEN
|
125 | XPOS<=XPOS+1;
|
126 | ELSIF(XPOS=1055)THEN
|
127 |
|
128 | VGA_ADDR <=0;
|
129 | XPOS<=0;
|
130 | YPOS<=YPOS+1;
|
131 | END IF;
|
132 | IF(YPOS=624)THEN
|
133 | YPOS<=0;
|
134 | END IF;
|
135 | IF(XPOS>815 AND XPOS<895)THEN
|
136 | VGA_HS<='0';
|
137 | ELSE
|
138 | VGA_HS<='1';
|
139 | END IF;
|
140 | IF(YPOS>601 AND YPOS<605)THEN
|
141 | VGA_VS<='0';
|
142 | IF(IMGRDY='1' )THEN----check prior new frame, if img is available
|
143 | READIMG<='1';
|
144 | END IF;
|
145 | ELSE
|
146 | VGA_VS<='1';
|
147 | END IF;
|
148 |
|
149 | IF(XPOS>800 OR YPOS>600)THEN
|
150 |
|
151 | VGA_B<=(others=>'0');
|
152 | VGA_G<=(others=>'0');
|
153 | VGA_R<=(others=>'0');
|
154 | END IF;
|
155 |
|
156 | IF(XPOS<752 AND YPOS<582)THEN-----visible img
|
157 |
|
158 | IF (READIMG='1')THEN
|
159 | CASE VB IS
|
160 | WHEN '0'=>
|
161 | VID_DATA<=VRAM_OUT2;
|
162 | WHEN '1' =>
|
163 | VID_DATA<=VRAM_OUT1;
|
164 | WHEN OTHERS=>NULL;
|
165 | END CASE;
|
166 |
|
167 |
|
168 | IF(VGA_ADDR<751)THEN
|
169 | VGA_ADDR<=VGA_ADDR+1;
|
170 | END IF;
|
171 |
|
172 | VGA_B<=VID_DATA;
|
173 | VGA_G<=VID_DATA;
|
174 | VGA_R<=VID_DATA;
|
175 |
|
176 | ELSE
|
177 | VGA_B<=(others=>'0');
|
178 | VGA_G<=(others=>'0');
|
179 | VGA_R<=(others=>'0');
|
180 |
|
181 | END IF;
|
182 | ELSE
|
183 |
|
184 | VGA_B<=(others=>'0');
|
185 | VGA_G<=(others=>'0');
|
186 | VGA_R<=(others=>'0');
|
187 | END IF;
|
188 | IF(YPOS=582 AND IMGRDY='1' AND READIMG='1')THEN
|
189 | IMGDONE<='1';
|
190 | READIMG<='0';
|
191 |
|
192 | END IF;
|
193 | END IF;
|
194 | END PROCESS;
|
195 | END MAIN;
|