时序信号
Zedboard提供了50MHz的时钟信号,VGA 显示需要的是 25.175 MHz的时钟, 所以在设计时首先要对时钟信号进行二分频,得到 25 MHz 的时钟频率。我们采用分频后的信号作为HS和VS的时序信号。其VHDL程序设计如下:
process(clk_25M) --此处实现的在分频信号下,产生场扫描和行扫描的信号
begin
if clk_25M'event and clk_25M='1'
then
if(hclk=800) then hclk<=0;
else hclk<=hclk+1;
end if;
if hclk>=656 and hclk<752 then
hs1<='0';
else hs1<='1';
end if;
end if;
end process;
process(hs1)
variable cnt :integer range 0 to 1000
:=0;
begin
if hs1'event and hs1='0' then
if vclk=524 then vclk<=0;
else vclk<=vclk+1;
end if;
if vclk >= 491 and vclk<492 then
vs1<='0';
else vs1<='1';
end if;
end if;
end process;
图像显示
首先需要定义一个寄存器数组来存储图像。
type data_buffer is array(0to 22499) of std_logic_vector(7downto 0);
constant buf:data_buer:=(……--在此定义一个150×150的图片信息);
在产生的场、行扫描信号的基础上进行图像的输出控制,显示位置在矩形(100,100, 250,250)的矩形内。其控制程序如下所示。
process(clk,vclk,hclk)
begin
if clk'event and clk='1' then—控制信号在矩形内输出
if( vclk>=100 and vclk<250 and
hclk>=100 and hclk<250 ) then
d a t 1 < = b u f ( ( v c l k -
100)*150+(hclk-100));
else dat1<="00000000";
end if;
end if;
图像输出
利用Zedboard的VGA接口进行数据和时序信号的输出。
hs<=hs1;
vs<=vs1;--行、场信号输出
dat<=data1;--数据输出