描述
要求实现一个交通红绿灯,具有红黄绿三个小指示灯和一个行人按钮,正常情况下,机动车道指示灯按照60时钟周期绿灯,5个时钟周期黄灯,10个时钟周期红灯循环。当行人按钮按下,如果剩余绿灯时间大于10个时钟,则缩短为10个时钟,小于10个时钟则保持不变。
注:机动车道的指示灯和人行道指示灯应该是配对的,当机动车道的灯为绿或者黄时,人行道的灯为红;当机动车道的灯为红时,人行道的灯为绿,为简便起见,只考虑机动车道的指示灯。
模块的信号接口图如下:
请使用VerilogHDL语言实现,并编写testbench验证功能。
输入描述:
clk:系统时钟信号
rst_n:复位信号,低电平有效
pass_request:行人按钮信号,当该信号为1,表示按钮按下,如果剩余绿灯时间大于10个时钟,则缩短为10个时钟,小于10个时钟则保持不变。
输出描述:
clock:交通灯倒计时读数
red:该信号为1,表示红灯亮,为0表示红灯不亮
yellow:该信号为1,表示黄灯亮,为0表示黄灯不亮
green:该信号为1,表示黄灯亮,为0表示黄灯不亮
题解主体
首先设置一个倒计时的计数器,每个时钟计数器输出减一,当计数器计数到0时,切换切换显示灯颜色,同时重置计数器为相应颜色的持续时间。
每个颜色的指示灯都会持续一段时间,可以取指示灯信号变化的上升沿作为状态转移的触发条件。上升沿的获取可以通过缓存一个时刻的数值,当当前时刻为1,前一时刻为0时,表示上升沿出现。
reg p_red,p_yellow,p_green; //用于缓存信号灯的前一时刻的数值,判断上升沿
always @(posedge clk, negedge rst_n)
begin
if(!rst_n)
begin
p_yellow <= 1'd0;
p_red <= 1'd0;
p_green <&#