begin tim2<=1; case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end 2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end 2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end 2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end default:light2<=3'b100; endcase end
2. 倒数计时
该部分程序完成二极管发光时延的计数,并将计数结果送到数码管显示电路,每切换到一个状态,计数器的初值都被重置,以实现不同颜色二极管不同的时延要求。本次设计直接用逻辑运算完成2位十进制数的计数,未采用分位器的设计。因为主、支干道上计数器的结构完全相同,顾只列出一路的程序,其具体程序如下所示:
always @(posedge clk ) begin else
begin //倒数计时 if(num1>0) if(num1[3:0]==0) begin
num1[3:0]<=4'b1001; num1[7:4]<=num1[7:4]-1; end
else num1[3:0]<=num1[3:0]-1; if(num1==1) tim1<=0; end end else begin
light1<=3'b010; num1=2'b00; tim1<=0; end end
3. 数码管的译码及扫描显示
该段程序主要完成4个7段数码管的译码显示及扫描,使系统能正常显示主、支干道两个方向上的剩
5
余时间。译码的时钟频率要低,为Hz级。扫描的时钟频率要高,最低不得小于人眼分辨频率50Hz,具体程序如下所示: always @(posedge qclk) begin //数码管扫描 if(rst1) begin st1=0; st2=0; end else begin case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01; end 2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10; end 2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11; end 2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00; end endcase end end
always @(posedge qclk) begin //数码管译码显示 case(num)
4'b0000: counter<=7'b0111111; //0 4'b0001: counter<=7'b0000110; //1 4'b0010: counter<=7'b1011011; //2 4'b0011: counter<=7'b1001111; //3 4'b0100: counter<=7'b1100110; //4 4'b0101: counter<=7'b1101101; //5 4'b0110: counter<=7'b1111101; //6 4'b0111: counter<=7'b0000111; //7 4'b1000: counter<=7'b1111111; //8 4'b1001: counter<=7'b1101111; //9 default: counter<=7'b0111111; //0 endcase end endmodule
总体程序见程序清单所示
6
第三章 仿真与硬件调试
3.1 波形仿真
在QuartursⅡ软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。设置仿真时间,时钟周期,输入输出端口,进行波形仿真。具体仿真波形图及说明如下所示: 仿真截止时间:100us; 时钟:clk 1us,qclk 0.1us 1. 正常工作时波形仿真图
图4. 正常工作时波形仿真图
图形说明
波形仿真主要完成了控制与计数以及数码管显示的波形图。en为低电品时,计数器置初值,高电平时开始正常控制与计数。控制发光二极管首次输出为“light1=001,light2=100”,表示主干道路绿灯亮,支杆道路红灯亮,计数器num1和num2从“00110101”开始递减计数,计数至“00000000”时,进入下一个状态,控制输出量为light=010,light2=010,表示主、支干道黄灯均亮起,计数器num1和num2从“00000101”开始计数递减,计数至”00000000”时进入下一个状态,light=100,light2=001,表示主干道路红灯亮,支杆道路绿灯亮。Counter根据num1,num2变化随时钟上升沿输出译码后的数据。由于屏幕显示大小有限,未仿真出一个完整周期。
2. 特殊情况仿真波形
7
图5. 特殊情况仿真波形
图形说明
当hold输入高电平时,在时钟上升沿的控制下,light 1与light2被强制置位为”100”,表示两路红灯均亮起 3. 复位情况仿真波形
图6. 复位情况仿真波形
图形说明
8
当rst输入高电平时,在时钟上升沿控制下,计数与控制都回到00状态,即light1=001,light2=100,计数器num1和num2从“00110101”开始递减计数。 3.2 硬件调试
完成时序仿真确认无误后,进行实验箱管脚设置,注意设置完成后一定要再进行一次全局仿真,使程序真正对应于硬件输出输出。具体连接说明如下所示
输入变量:rst、clk、qclk、hold、en
其中en,hold,rst接”0-1”拨码开关,以稳定的输出可变化的电平。计数时钟clk接实验箱上1Hz时钟,扫描显示时钟qclk接125Khz时钟。
输出变量:light1[2:0]、light2[2:0]、counter[6:0]、st1、st2
其中light1[0] 、light2[0]分别接绿色的发光二极管;light1[1]、light2[1] 分别接黄色的发光二极管;light1[2]、light2[2]分别接红色的发光二极管。counter[0]~counter[6],分别接七段数码管的a~f,st1、st2分别接试验箱上”4-16”译码器的低两位。
完成接线后将程序烧写到芯片上,开始功能调试。分辨改变使能信号,复位信号以及特殊情况信号,观察数码管以及发光二级管情况
9