FPGA学习日志
鼓励自己每天进行学习总结:2021.2.2
VGA接口项目
想要学习FPGA的图像处理,先得学习如何显示图像
一、VGA是什么?
VGA是一种视频传输标准,于1987年推出,主要是为了当时的模拟显示器相匹配,所以输出的RGB都是(0~0.714V)的模拟信号 (注意这个电压值)。现在VGA已经是中低端电脑的底配了。其中最重要的就数以下五个控制信号了
二、遇到的问题
1.接上信号线后,屏幕显示无信号
原因:rst高电平触发,但是开发板上的按键未按下时处于高电平状态,所以板子一直工作在rst状态
教训:以后的rst控制信号要用低电平触发rst_n
2.接上信号线后,屏幕黑屏
原因:输出信号VGA_RGB的位数没有对应好,本来是16位的输出,只输出了1位,所以相当于一直输出黑色
教训:以后的输出输入要先写好位数,这是一个重要的参数
3.接上信号线后,彩条错位显示
原因:输出的data_req请求信号,跟等待的pixel_data处于同一个时钟周期,然而VGA_display模块响应data_req和输出pixel_data需要一个时钟周期,所以data_req需要提前一个时钟周期送出
教训:
- 请求信号通常要比请求目标的输出信号提前一个时钟周期
- 计数器架构的话,“-1” 就是指 “提前一个时钟周期”
三、一些感想
-
计数器架构对应的输出可以是组合逻辑输出,这样可以节省寄存器资源,但是需要考虑亚稳态产生的可能(目前还不能排除这可能性)
-
关于reg和wire类型的感想:
reg类型通常用在always模块,修改赋值通常是时间点,随后它会自动保存数值 (前提是使用不完整的if语句,又或者完整的if语句里面的else写上 reg<=reg )
wire类型只能使用assign语句,修改赋值通常是时间段,若在计数器架构,则使用(cnt>=x , cnt<x+y);若在状态机架构,则使用(state == IDLE) -
关于模块内部参数的修改
VGA_driver
#(
H_active(16'd640),
V_active(16'd480)
)
VGA_driver_mo
(
...
);
- 在定义输出端口时,一般不说明是reg类型
因为一般的输出都是组合逻辑电路,没必要使用reg,这样的输出没有时钟延迟
module test(output dout);
...
reg dout_reg
...
assign dout = dout_reg;
-
注意驱动VGA中的信号都是3.3VTTL电平的,在配置引脚的时候记得设置
-
使用top顶层文件进行模块之间的连接,方便模块修改后的编译
-
关于使用锁相环PLL生成非整数倍的时钟,灵活使用乘数和除数的组合即可