小弟初学Verilog,确实不太习惯,此文只是作为处级入门总结,高手请不要见笑。同时此文仅作为自己小小的经验总结,设计思路及程序仅供参考。
这几天遇到一个令自己比较头痛的问题,一个设计要求使用cpld来检测视频信号的有无,并通过输出高低电平来传递给mcu处理。最值得考虑的就是该cpld在工作时没有外部提供时钟信号,也许是为了节约成本吧。刚开始觉得应该没啥问题的,VGA视频信号是有行场脉冲信号的,用这个来触发不就是了。但在实际中却发现这样行不通啊,万一在输出高电平之后就没有脉冲了,怎么办,那不是一直为高吗。考虑了很久,也问了几个朋友,都没得到解决。也许是时间太短了吧,大家还没仔细考虑。其实现在想想这确实是个最基础最基础的问题了。期间有想过要是加了外部时钟的话,给个高频的晶振,如50M,不断采样检测也是可以实现的,但现在硬件不允许啊,还是想想其他办法。在一个朋友的提醒下(他学的比我久,层次是不一样啊),说可以再给个外部复位信号,因为之前我想的是就用行场信号来复位,后来才发现这更是个低级错误,不能在两个触发进程中操作同一个寄存器变量的(这也许是受mcu编程思维的影响太深吧)。咋一听,果然有点眉目了,于是理清思路重新设计了程序,这次是用mcu来给cpld提供复位信号,cpld使用下降沿复位,并且在上升沿判断是否有视频信号,哈哈,编译通过,下载到板子完全OK!!!在此小小庆祝一下,同时也是对自己的警醒,学东西一定要多思考啊,这么简单的问题就被难到了,唉。
module VGA_Detect(Clk,Vin0,Vin1,Vin2,Vin3,Hin0,Hin1,Hin2,Hin3,Vout,Hout,Sel,En,Detect_Out);
input Clk;
input En;
input Vin0;
input Vin1;
input Vin2;
input Vin3;
input Hin0;
input Hin1;
input Hin2;
input Hin3;
input[2:0] Sel;
output Vout;
output Hout;
output Detect_Out;
reg Vout;
reg Hout;
reg[3:0] Detect_Out;
reg Hin0_reg;
reg Hin1_reg;
reg Hin2_reg;
reg Hin3_reg;
reg Detect_Flag0;
reg Detect_Flag1;
reg Detect_Flag2;
reg Detect_Flag3;
always@(Hin0 or Hin1 or Hin2 or Hin3)