基于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。基于de1开发板的vga图像显示
相关推荐
为距离 4+边 2,4 的长度 距离 2,所以不更新 ) 医院 1 已 标号 距离 0 医院 2 未标号 距离 ∞ 医院 3 已 标号 距离 4 医院 4 未标号 距离 9 12 4 5 6 医院 1 已 标号 距离 0 医院 2 未标号 距离 ∞ 医院 3 未标号 距离 4 医院 4 未标号 距离 ∞ 12 4 5 6 10 找所 有未标号中距离最短的顶点为 医院 2,将 2做标号 ,已没有与
NT LCALL LOOK_ALARM JB K3,$ LCALL BEEP_BL JMP PROC_K2 PROC_K1: JB K2,PROC_END LCALL BEEP_BL JNB K2,$ MOV DPTR,RST_A1 MOV A,1 LCALL LCD_PRINT LCALL SET_ALARM LCALL RE_18B20。 将设定的 TH,TL 值写入 DS18B20
e II、 Stratix II 系列、 Stratix GX 系列等。 支持 IP 核,包含了 LPM/Mega Function 宏功能模块库,用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。 此外, Quartus II 通过和 DSP Builder 工具与Matlab/Simulink 相结合,可以方便地实现各种 DSP 应用系统;支持 Altera 的片上可编程系统(
找尾 { while ( parent[f] 0) { f = parent[f]。 } return f。 关键代码输出最小生成树 以下是主函数部门 int main(void)//主函数 { MGraph *G。 G = (MGraph*)malloc(sizeof(MGraph))。 if (G == NULL) { printf(memory allcation failed
包含的范围很广泛,共有 34 种运算符。 C 语言把括号、赋值、强制类型转换等都作为运算符处理。 从而使 C 语言的运算类型极其丰富,表达式类型多样化。 灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。 (3)数据类型丰富。 C 语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。 能用来实现各种 复杂的数据结构的运算。 并引入了指针概念,使程序效率更高
合于多种操作系统 , 如 DOS、 UNIX,也适用于多种机型。 当然, C 语言也有自身的不足,比如: C 语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数族下标越界不作检查等。 从应用的角度, C 语言比其他高级语言 较难掌握。 总之, C 语言既有高级语言的特点,又具有汇编语言的特点;既是一个成功的系统设计语言,有时一个使用的程序设计语言