基于de1开发板的vga图像显示内容摘要:

EY3 段产生一个低电平脉冲, picture 计数加 1。 不按 KEY3 时 picture 不变。 当 SW0 为高电平时为自动模式,此时隔一定的时间 picture 自动加 1,并且在自动模式下,每按一次 KEY3, picture 也加 1。 达到了手动与自动相结合控制的目的。 entity control is port( VGA_VS_period :in std_logic。 SW0 :in std_logic。 KEY3 :in std_logic。 picture :buffer integer range 0 to 7 )。 end。 architecture arc of control is signal scence_wait :std_logic。 signal SW0_t :std_logic。 signal picture_count_s:std_logic。 signal auto_picture_count_s:std_logic。 begin scencewait: change picture after some scences process(VGA_VS_period) variable scence_wait_t :integer range 0 to 31。 begin if VGA_VS_period39。 event and VGA_VS_period=39。 139。 then if scence_wait_t30 then scence_wait_t:=scence_wait_t+1。 else scence_wait_t:=0。 scence_wait=not scence_wait。 end if。 end if。 end process。 SW0_t=SW0。 auto_count_s: change picture after push SW0 process(SW0_t,scence_wait) begin if SW0_t=39。 139。 then if scence_wait39。 event and scence_wait=39。 139。 then auto_picture_count_s=not auto_picture_count_s。 end if。 else auto_picture_count_s=39。 139。 end if。 end process。 picture_count_s=auto_picture_count_s xor KEY3。 two ways to control Style_control: process(picture_count_s) begin if picture_count_s39。 event and picture_count_s=39。 139。 then picture=picture+1。 end if。 end process。 end。 10 5 图像产生模块 图 11 图像产生模块 Picture_style 进程是对显示的图片进行控制。 这里定义了 8 种显示图像, 0 为自定义的图片; 1 为纯白; 2 为纯黑; 3 为纯红; 4 为纯绿; 5 为竖直彩条; 6 为竖直渐变彩条; 7 为水平彩条。 每个像素时钟到来时,就按照图片计数里的数字显示相应的图片。 其中第 0 种情况是读取 sram 里的数据来进行显示,由于 sram 的读取时间为 10ns,而 FPGA 的时钟周期为 20ns,故可以直接对 sram 进行读取。 这里用到一个状态机是因为对原始图像数据进行了压缩,把空余的空间也用上了,即用 3 个存储单元储存 4 个像素的数据。 故读取的时候需要读 三个数据后空一次,并把每次读取的数据跟 RGB 三个通道对应好。 分辨率是 640*480,每个像素由 RGB3 个分量组成 ,每个分量由四位二进制数来表示 ,这样一幅彩色图片在不压缩的情况下要用 640*480*12bit,即大约 460K 字节 .所以需要外部存储器来储存图像信息。 开发板上有一片 512k 字节的 sram,并且 sram 的存取相对简单,故这里用 sram 作为存储器件。 Sram 的硬件连接如图 9。 由于 sram 的数据总线是 18 位,一个储存单元只放一个像素会空出四位,即加入一个像素的数据为 F(R)F(G)F(B),则在 sram 中储存格式为 0FFF。 而且这样用存一张图片要用 400k 字节的空间, sram 无法提供这么大的空间。 故只能考虑对数据进行压缩,即 (FFF)(F FF)(FF F)(FFF),用三个存储单元储存 4 个像素的数据,这就要求在用 VHDL 实现的时候需要注意以下读取格式。 图 12 sram 硬件连接图 本部分代码比较长,故在附录 1 中给出。 由于本电路 只能显示已经储存在 sram 里的特定格式的图片,故需要先用自己编写的 c程序对 bmp 格式的图片进行转换,并用 altera 自带的软件把数据先烧写到 sram 中。 图像处理的 C 程序见附录 2。 11 6 数码管显示模块 图 13 数码管显示模块 本模块的作用是把对显示图像的计数用数码管显示出来,即显示 07。 图 14 数码管显示模块仿真波形 entity hex_display is port( HEX0 :out std_logic_vector(6 downto 0)。 CLOCK_50 :in std_logic。 picture :in integer range 0 to 7 )。 end。 architecture art of hex_display is begin hex_display: process(picture,CLOCK_50) begin if CLOCK_5039。 event and CLOCK_50=39。 139。 then case picture is when 0 =HEX0=1000000。 when 1 =HEX0=1111001。 when 2 =HEX0=0100100。 when 3 =HEX0=0110000。 when 4 =HEX0=0011001。 when 5 =HEX0=0010010。 when 6 =HEX0=0000010。 when 7 =HEX0=1011000。 when others=NULL。 end case。 end if。 end process。 end。 7 串口通信模块 图 15 串口通信模块 该模块的功能是通过串口从 PC 机上读取图像信息,并把读到的图像数据写到 sram里面,以供在图像输出模式时进行读取。 在本模块中,包含一个子模 块用于产生波特率为 115200的时钟。 由前面可知一个图片的数据量为 450K byte,而传输速率为 115200/10= byte/s,故理想的最小传输时间为 450/=39s。 这是用 PC 机通过串口传输原始格式的图片数据的最 12 小时间。 捕捉 rxd 端在空闲状态下的下降沿,来识别数据的开始,由于数据传输格式是 8 位数据,无奇偶校验,一个停止位,故检测到开始信号后经过八个时钟可以读取八位数据,之后就是停止位。 在读到停止位的时候把读到的完整数据写到 sram 里,由于 sram 的数据总线宽度为 16 位,而串 口一次只能传 8 位,故需要连续采集两次然后一起写入 sram,模块里的double_done 就是用来标志连续采集完两个字节,可以发送的标志位。 LEDG 和 LEDR 总共18 个 led 灯,用来以二进制形式显示写到的地址,可以大体检测传输数量是否正确。 图 16 串口通信模块 SignalTapII 分析 上图为用 SignalTapII 进行逻辑分析的波形图。 用串口工具在 rxd 端输入 0x01, clk为波特率是 115200bps 的时钟信号。 Data 储存串口读到的信号。 Bitcount 是对读入的数据位进行计数。 无数据时 rxd为高电平,此时模块处于 idle 状态,当 rxd 端有数据,首先捕捉起始信号,即下降沿,之后在每个时钟的上升沿读取 rxd端的数据,并按位存到 data 中,每读一位 bitcount 就加 1,直到读完 1 个起始位, 8个数据位。 由图可见读完 8位数据位后 data的数为 01h,与发送数据一致。 这里需要注意的一点就是如果 FPGA 产生的 clk 比 PC 的波特率频率高,则会出现同一个数据位读两次的错误,而如果小一些,则会出现某一数据位无法读出的情况,即跳过了一位。 如果二者频率相等,也会有很小的概率读取到不稳定的信号。 故这种传输机制误码是无法避免的。 entity RS232_RXD is port( CLOCK_50 :in std_logic。 rxd :in std_logic。 mode :in std_logic。 0:reset 1:transmit LEDG :out std_logic_vector(7 downto 0)。 display the address LEDR :out std_logic_vector(9 downto 0)。 SRAM_ADDR_W :buffer std_logic_vector(17 downto 0)。 SRAM_DQ_W :out std_logic_vector(15 downto 0) )。 end。 architecture arc of RS232_RXD is ponent baud port( CLOCK_50 :in std_logic。 clk :out std_logic )。 end ponent。 signal clk :std_logic。 signal rxdata_start:std_logic:=39。 039。 set to 1 when capture the falling edge of rxd when in idle state(rxd_done=0) signal rxd_done :std_logic:=39。 139。 0 whne transmiting while 1 when transmission is done. signal double_done :std_logic:=39。 039。 col。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。