东南大学自动化学院《数字系统课程设计》专业综合设计报告姓名:_________________________ 学号:专业:________________________ 实验室:组别:______________________同组人员:设计时间:年月日评定成绩: _____________________ 审阅教师:一.课程设计的目的与要求二.原理设计三.架构设计四.方案实现与测试五.分析与总结专业综合设计的目的与要求(含设计指标)主干道与乡村公路十字交叉路口在现代化的农村星罗棋布,为确保车辆安全、迅速地通过,在交叉路口的每个入口处设置了红、绿、黄三色信号灯。
红灯禁止通行;绿灯允许通行;黄 灯亮则给行驶中的车辆有时间行驶到禁行线之外。
主干道和乡村公路都安装了传感器, 检测 车辆通行情况,用于主干道的优先权控制。
设计任务与要求(1)当乡村公路无车时,始终保持乡村公路红灯亮,主干道绿灯亮。
(2)当乡村公路有车时,而主干道通车时间已经超过它的最短通车时间时,禁止主干道通 行,让乡村公路通行。
主干道最短通车时间为 25s 。
(3)当乡村公路和主干道都有车时,按主干道通车 25s ,乡村公路通车 16s 交替进行。
( 4)不论主干道情况如何,乡村公路通车最长时间为 16s 。
(5)在每次由绿灯亮变成红灯亮的转换过程中间,要亮5s 时间的黄灯作为过渡。
(6)用开关代替传感器作为检测车辆是否到来的信号。
用红、绿、黄三种颜色的发光二极 管作交通灯。
要求显示时间,倒计时。
. 原理设计(或基本原理)HDL 语言,用ONEHOTI 犬态机编码表示交通灯控制器的四个状态(状态0010,状态三: 0100,状态四: 1000):设置两个外部控制条件:重置( set );乡村干道是否有车( c —— c=1 表示无车; c=0 表示有 车) 设置一个内部控制条件: 时间是否计满 ( state —— state=0 表示计数完成; state=1 表示计 数没有完成)本设计采用 Verilog: 0001,状态二: 主干道红灯,显示 5 秒;乡村干道黄灯,显示 5 秒——( 0001) 主干道红灯,显示 21 秒;乡村干道绿灯,显示 16 秒——( 0010) 主干道黄灯,显示5 秒;乡村干道红灯,显示5 秒——( 0100)主干道绿灯,显示 25 秒;乡村干道红灯,显示 30 秒——( 1000)系统流程图如下:Set=1註:mlight代表主干道红绿黄灯的亮灭,clight代表乡村干道红绿黄灯的亮灭整个描述如下:当set由0变为1时,主干道为黄灯,乡村干道为红灯,各显示5秒,此时为第一阶段,当五秒倒计时完成时,state由1变为0,进入第二阶段。
此时主干道为红灯,乡村干道为绿灯,分别显示时间为21秒和16秒,当倒计时完成,state由1变为0,进入第三阶段,或者如果此时乡村干道没有车,即c=0时,不需要倒计时完成,即state可以为1,直接进入第三阶段,此时主干道为红灯,乡村干道为黄灯,分别显示时间为五秒,倒计时完成后,进入第四阶段,此时主干道为绿灯,乡村干道为红灯,分别显示时间为25秒和30秒,如果此时乡村干道没有车,即c=0时间将会一直卡在25秒和30秒不变,直到乡村干道开始有车时才开始倒计时,并在倒计时完成后,又进入第一阶段,进入下一次的循环。
交通灯控制器框图SetClkMlight[2:0]交通灯控制器Clight[2:0]>100——绿灯010――黄灯001——红灯100——绿灯010――黄灯001——红灯主干道计数器乡村干道计数器显示显示三.方案论证(架构设计)顶层的block图n^Q a・督嗨%卩•呼骸刘❻Ik $ $ ti d rdcw Hdp- 1—-■ • L. 囁i 二=卜*.I3 7-i :.二:.M IPOi*._sRK105 幽肿- RNJM -m.'iM]- =WJ1i :和4 ;仿真波形为: i1.td : k.3Sta TmeBa:¥心 aC.Ons33U.0nsSTD.0 os4山.0站ii60.0 ns 4M.01S530.0D2iiHit* 5.di^rLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLr1>EEt#2 stilei __i1*3 cU d. i .抓2 I 10 ili 泓 I LJ 斗ip 12 0 cir 13 x 2 i- X 〔■_/]?_ 0 trii M r 小 m 5 X mmnrnmn门「"rnmmmc L x o ■ tA OK 2 X L 3 Q0 kL i n n 13 x ? x i x o x 3 n x 7 x & x s x o 3 x u i X 0 X ?X 9 X T X 6 X s X i nVIiiaolDngthng.fflf| ®韓如End 343.03 n£ I 湘vat设计模块组成: 分频器:获取适合的时钟信号主模块:控制各个状态的转换数码管显示模块:显示主干道和乡村干道的时间具体设计如下:1分频器(clk_in为输入时钟频率,clk_out为输出时钟频率)分频器源代码:module fenpin( clk_ in, clk_out);in put clk_in;output clk_out;reg clk_out;reg[24:0] cnter;always @(posedge clk_in)beginif (cn ter<2000000)begi n cn ter = cn ter + 1; endelse cn ter = 0;if (enter == 2000000)begi n clk_out = 'b1;e ndelse clk_out = 'b0;end en dmodule2主模块部分:输入输出说明:Set ---- 重置,set=1,交通灯开始工作C ------ 乡村干道是否有车,c=1表示无车;c=0表示有车Clk ――输入时钟信号Mlight[2..O] 主干道交通灯的亮火,100代表绿灯亮,010代表黄灯亮,001代表红灯亮Clight[2..O]-乡村干道父通灯的亮火,100代表绿灯亮,010代表黄灯亮,001代表红灯亮Mch[3..O]—主干道交通灯的咼位数字Mcl[3..O]—--主干道交通灯的低位数字Cch[3..O]—-乡村干道交通灯的高位数字-Ccl[3..O]——-乡村干道交通灯的低位数字源代码:module jiaot on gde ng(set,c,clk,mlight,clight,mch,cch,mcl,ccl);in put set,c,clk;output[2:0] mlight,clight;output[3:0] mch,mcl,cch,ccl;reg[2:0] mlight,clight;reg[3:0] mch,mcl,cch,ccl;reg[7:0] mc,cc;reg state;reg[3:0] tab;always @(posedge clk)if(set) beginif(!state)beginstate <= 1;case(tab)4'b0001:begin mlight <= 3'b010; clight <= 3'b001; tab = 4'b0010; {mch,mcl} 8'b00000101; {cch,ccl} <= 8'b00000101;end4'b0010:begin mlight <= 3'b001; clight <= 3'b100; tab = 4'b0100; {mch,mcl} 8'b00100001; {cch,ccl} <= 8'b00010110;end4'b0100:begin mlight <= 3'b001; clight <= 3'b010; tab = 4'b1000; {mch,mcl} 8'b00000101; {cch,ccl} <= 8'b00000101;end4'b1000:begin mlight <= 3'b100; clight <= 3'b001; tab = 4'b0001; {mch,mcl} 8'b00100101; {cch,ccl} <= 8'b00110000;enddefault: begin mlight <= 3'b100; clight <= 3'b001;endendcaseif(tab == 4'b0001)beginif(c == 0)begin state <= 0; tab <= 4'b1000;endendendelse if(state)beginif(tab == 4'b0100)beginif(c == 0)begin state <= 0;endendif({mch,mcl} > 1)if(mcl == 0)begi n mcl <= 4'b1001; mch <= mch - 1;e ndelse mcl <= mcl - 1;if({mch,mcl} == 1) state <= 0; <= <= <= <=if({cch,ccl} > 1)if(ccl == 0)begi n ccl <= 4'b1001; cch <= cch - 1;e ndelse ccl <= ccl - 1;if({cch,ccl} == 1) state <= 0;endendelse begin mlight <= 3'b100; clight <= 3'b001; tab <= 4'b0001; state <= 0;end en dmodule3.数码管显示模块[2 a P-ay"'-!—dk kedp.,0]r = t^Clk ――输入时钟信号Cou nt[3..O] ——输入数字的BCD码LED[7..O]――输出七段码源代码:module display(clk,co un t,led);in put clk;in put[3:0] cou nt;output[7:0] led;reg[7:0] led; always @(posedge clk) begincase(count)4'd0:led = 8'b00000011;4'd1:led = 8'b10011111;4'd2:led = 8'b00100101;4'd3:led = 8'b00001101;4'd4:led = 8'b10011001;4'd5:led = 8'b01001001;4'd6:led = 8'b01000001;4'd7:led = 8'b00011111;4'd8:led = 8'b00000001;4'd9:led = 8'b00001001;default:led = 8'bx;endcaseendendmodule四. 方案实现与测试(或调试)初始程序:module jiaotongdeng(set,c,clk,mlight,clight,mcount,ccount);input set,c,clk;output[2:0] mlight,clight;output[7:0] mcount,ccount;reg[2:0] mlight,clight;reg[7:0] mc,cc;reg state;reg[3:0] tab;assign mcount = mc;assign ccount = cc; always @(posedge clk) if(set) begin if(!state) begin state <= 1;case(tab) 4'b0001:begin if(c == 1) begin mlight <= 3'b010; clight <= 3'b001; tab = 4'b0010; mc <= 8'd5; cc <= 8'd5;end else state <= 0;end4'b0010:begin mlight <= 3'b001; clight <= 3'b100; tab = 4'b0100; mc <= 8'd21; cc <= 8'd16;end4'b0100:begin mlight <= 3'b100; clight <= 3'b010; tab = 4'b1000; mc <= 8'd5; cc <= 8'd5;end 4'b1000:begin mlight <= 3'b001; clight <= 3'b001; tab = 4'b0001; mc <= 8'd25; cc <= 8'd30;end default: begin mlight <= 3'b100; clight <= 3'b001;end endcase end else if(c == 1) begin if(mc > 1) if(mc[3:0] == 0)begin mc[3:0] <= 4'b1001; mc[7:4] <= mc[7:4] - 1;endelse mc[3:0] <= mc[3:0] - 1; if(mc == 1) state <= 0;if(cc > 1) if(cc[3:0] == 0) begin cc[3:0] <= 4'b1001; cc[7:4] <= cc[7:4] - 1;endelse cc[3:0] <= cc[3:0] - 1;if(cc == 1) state <= 0;endend else begin mlight <= 3'b100; clight <= 3'b001; tab <= 4'bOOO1; state <= 0;end en dmodule 错误:仿真波形不出来一一忘记初始化C改正错误后出现波形:— -- --- ---- ---- - --- - --- - --- - --- - --- - --- - ----I || ■I I I1错误:直接从16跳到9分析:16=00010000, 9=00001001当判断十六的后四位是发现是0000,于是接下来进行了个位变成1001,十位减一的操作,从而变成了00001001,逻辑错误,改正之后如下:module jiaot on gde ng(set,c,clk,mlight,clight,mch,cch,mcl,ccl);in put set,c,clk;output[2:0] mlight,clight;output[3:0] mch,mcl,cch,ccl;reg[2:0] mlight,clight;reg[3:0] mch,mcl,cch,ccl;reg[7:0] mc,cc;reg state;reg[3:0] tab;always @(posedge clk)if(set)beginif(!state) begin state <= 1;case(tab)4'b0001:beginif(c == 1)begin mlight <= 3'b010; clight <= 3'b001; tab = 4'b0010; {mch,mcl} <= 8'b00000101; {cch,ccl} <= 8'b00000101;endelsestate <= 0;end4'b0010:begin mlight <= 3'b001; clight <= 3'b100; tab = 4'b0100; {mch,mcl} <=8'b00100001; {cch,ccl} <= 8'b00010110;end4'b0100:begin mlight <= 3'b001; clight <= 3'b010; tab = 4'b1000; {mch,mcl} <=8'b00000101; {cch,ccl} <= 8'b00000101;end4'b1000:begin mlight <= 3'b100; clight <= 3'b001; tab = 4'b0001; {mch,mcl} <=8'b00100101; {cch,ccl} <= 8'b00110000;enddefault: begin mlight <= 3'b100; clight <= 3'b001;endendcaseendelseif(c == 1)beginif({mch,mcl} > 1)if(mcl == 0)begin mcl <= 4'b1001; mch <= mch - 1;endelse mcl <= mcl - 1;if({mch,mcl} == 1) state <= 0;if({cch,ccl} > 1)if(ccl == 0)begin ccl <= 4'b1001; cch <= cch - 1;endelse ccl <= ccl - 1;if({cch,ccl} == 1) state <= 0;endendelse begin mlight <= 3'b100; clight <= 3'b001; tab <= 4'bOOO1; state <= 0;end en dmoduleI i i i !■ I >1 i Si I I i i I I i i !■ I )i i i I I i i i I i i !■ i i i II ■- ■-..........r - - .II DI I I 11 I I I n I I I 1 I I I q I I I I nIII||| ^ | ||j||||j|||^||||I I I I I I I I II I I I I I I I I F I I I II I I I I I I i I II I I I I I I I I I I 1 I I! I波形正确然而在实验箱上进行验证的时候发现,c 的功能有问题,一旦将 c 拨回0,即乡村公路没有车的时候,发现无论交通灯处于哪一个状态, 时间都将停止不动。