程序调试
接下来设置基本的参数信息,比如黄灯的发光时长,红灯的发光时长,绿灯的发光时长等。WIDTH参数用于控制分频,产生1s的时钟,由于系统时钟是50Mhz,所以系统时钟的波形周期为20ns,之后基于这个20ns一个上升沿就可以计数产生分频信号:
其中WIDTH为25_000_000(仿真用25_000为其系统频率的一半,只要计数器clk_t小于WIDTH就不断累加,若达到这个值,或者复位信号来了,就归零,由此就产生了0.5s的计数器。依据这个0.5s的计数器,我们就可以产生1hz的时钟。
有了1hz的时钟之后就可以改变状态机,切换交通信号灯工作的8个状态。在开始状态切换之前有一个复位信号,状态复位到状态1,计时为27s。
led_module.v
led寄存器从高到低分别驱动:北、东、南、西向红绿黄灯。
整个实现为:
led灯控制模块(led_module):根据接收到的实时状态信号state[3:0],驱动北、东、南、西方向的led发光。
bit_seg_module.v
数码管显示模块(bit_seg_module):接收交通灯控制模块传递过来的北、东、南、西方向的实时时间数据n_time[9:0]、e_time[9:0]、s_time[9:0]和w_time[9:0],并以此驱动对应的数码管,将数据显示出来。主要就是产生位选和段选信号以驱动数码管。
所以数码管显示模块的输入为系统时钟信号,系统复位信号,东西方向数码管要显示的数值,南北方向数码管要显示的数值。输出就是数码管的位选信号和段选信号。
之后依据数字num去驱动数码管显示:
除此之外还写了顶层模块traffic_led.v和测试文件test.v。
仿真结果
总结
这次设计给我最大的收获就是做什么事都不要急,要一步一步的做好前提工作,我开始看到这个课题的时候就动手去写程序,只是凭着自己脑子里想一点就写一点,但是经过几次反复的修改还是没有成功,看不到效果,所以后来干脆就放下来先把每一步每一个模块都弄清楚再动手去写,可以再本子上把各个模块的端口以及连接都画好,再去写,这样能做到事半工倍的效果,而且在设计的时候不懂得地方可以参考别人写的程序,毕竟,不管做什么课程设计都是为了让自己弄懂、学好,只要将别人的程序设计转为自己的知识就ok了,在次基础上加上自己的一些想法,学会变通,或许还有 些知识没学到,比如键盘输入控制这部分,但是通过别人的程序能让自己学到更多的知识,而且能巩固知识,所以我觉得要想把程序写好平常一定要多写多练多参考