交通信号灯控制器的verilog实现

上传人:仙*** 文档编号:47068811 上传时间:2021-12-16 格式:DOC 页数:11 大小:94.51KB
返回 下载 相关 举报
交通信号灯控制器的verilog实现_第1页
第1页 / 共11页
交通信号灯控制器的verilog实现_第2页
第2页 / 共11页
交通信号灯控制器的verilog实现_第3页
第3页 / 共11页
点击查看更多>>
资源描述
Harbin Institute of TechnologyVerilog实验报告(2)实验内容: 交通信号灯控制器 班 级: 姓 名: 学 号: 哈尔滨工业大学2015年6月一、 功能描述本设计利用Verilog HDL 语言,对一个十字路口的交通信号灯进行控制,可控制4个路口的红、黄、绿、左转四盏信号灯,让其按特定的规律进行变化。并通过ModelSim软件对系统进行了仿真。仿真结果表明系统可自动实现十字路口红绿灯及左转弯信号灯的控制。实现设计目标如下:(1)设计一个十字路口的交通灯控制电路,每条路配有红、黄、绿、左转四盏交通信号灯。通过控制器对四个路口的四组交通灯的状态实现自动循环控制;(2)实现两主干道车辆交替运行,每次通行直行时间为30 秒;左转时间为10秒,右转不受信号灯控制。(3)黄灯作为绿灯转为左转灯,左转灯转为红灯的过渡信号灯,过渡时间为5s。(4)系统设有总复位开关,可在任意时间对系统进行复位。二、设计方案1.设计思路我们对图1所示的十字路口进行设计,路口A和路口C的车辆同时行驶,路口B和路口D的车辆同时行驶,所以虽然要控制4组信号灯,但其实它们可以俩俩合并,这样大大简化了设计。由于我们采用自动控制方式,两个方向的灯按照顺序依次交替循环显示,每种灯亮的时间结合实际生活合理设定。系统设有复位开关,可在任意时间内对系统进行复位。图1 十字路口示意图由以上分析可知,该系统可视为一个状态机,而且共有8种状态,如表1所示。表1 交通灯状态示意表由上表我们还可以得到状态转换图,如图2所示:S7S0000003S11S6S25S5S36S47图2 状态转移示意图该状态机共有两个输入信号rstn和clk,rstn为复位信号,当该信号为低电平时,状态机处于S0,且状态不发生改变。当rstn为高电平时,这8个状态依次按时间顺序发生变化,每个状态保持多长时间由clk信号控制。三、 关键代码1.我们通过宏定义来设置每个状态保持的时间,这样既增强了代码的可读性,又方便以后的更改。由于此实验不做硬件设计,只是通过仿真来验证,所以为了方便看波形,我们用一个时钟周期代表5s,具体代码如下:define G2YDELAY 6/绿灯亮转到红灯亮的延迟,用一个时钟周期代替5s, /则此延迟为30s,这样做是为了仿真时容易看波形define Y2LDELAY 1/黄灯亮转到左转灯亮的延迟时间为5sdefine L2YDELAY 2/左转灯亮转到黄灯亮的延迟时间为10sdefine Y2RDELAY 1/黄灯亮转到红灯亮的延迟时间为5s2. 我们用一个16位的reg类型的向量light来代表16盏交通信号灯,light15:12代表A路口,light11:8代表B路口,light7:4代表C路口,light3:0代表D路口,高位到低位依次表示左转灯,红灯,绿灯,黄灯 且每一位用1代表亮,0代表灭。3. 用state表示当前状态,用next_state代表下一个状态,当rstn被拉低时,让系统处于S0状态,否则在时钟上升沿到来时将next_state赋给state。代码如下:always (posedge clk) if(!rstn)begin state<=S0; next_state<=S0; end else state<=next_state;/状态改变4. 当系统处于某种状态时必须有确定的输出,通过运用case语句代码可读性更强,而且简介。代码如下:always (state) begin case(state) S0:light<=16'b0010_0100_0010_0100; S1:light<=16'b0001_0100_0001_0100; S2:light<=16'b1000_0100_1000_0100; S3:light<=16'b0001_0100_0001_0100; S4:light<=16'b0100_0010_0100_0010; S5:light<=16'b0100_0001_0100_0001; S6:light<=16'b0100_1000_0100_1000; S7:light<=16'b0100_0001_0100_0001; endcase end5.控制状态何时发生改变是关键,通过repeat语句来实现延时,而且只有当rstn为高电平是,状态才可以发生改变,代码如下:always (state or rstn) begin if(rstn)begin case(state) S0:begin repeat(G2YDELAY-1) (posedge clk); next_state=S1; end S1:begin repeat(Y2LDELAY-1) (posedge clk); next_state=S2; end S2:begin repeat(L2YDELAY-1) (posedge clk); next_state=S3; end S3:begin repeat(Y2RDELAY-1) (posedge clk); next_state=S4; end S4:begin repeat(G2YDELAY-1) (posedge clk); next_state=S5; end S5:begin repeat(Y2LDELAY-1) (posedge clk); next_state=S6; end S6:begin repeat(L2YDELAY-1) (posedge clk); next_state=S7; end S7:begin repeat(Y2RDELAY-1) (posedge clk); next_state=S0; end endcase end end四、 仿真与验证1. 首先写一个test bench,由于输入信号少,而且状态是通过延时状态自动发生改变的,所以比较简单。详细代码见附录2。2. 通过modelsim进行仿真,仿真时间设为500ns,波形图如图3,从图中我们可以看到该系统基本实现了功能。图3 仿真波形图3. 放大局部,我们更细致地观察,可以确保它的正确性,如图5。图4 局部放大图五、 结论通过对交通信号控制器进行功能仿真,本设计达到了预定设计的目的,实现了利用verilog语言设计自动控制十字路口交通灯这样一个简单的数字系统,各交通灯设计任务要求正常运行。不过这是在理想状态下进行的仿真,如果考虑到实际门延时,该系统是否可靠,有待于进一步验证。附录1交通信号灯的verilog代码:define G2YDELAY 6/绿灯亮转到红灯亮的延迟,用一个时钟周期代替5s, /则此延迟为30s,这样做是为了仿真时容易看波形define Y2LDELAY 1/黄灯亮转到左转灯亮的延迟时间为5sdefine L2YDELAY 2/左转灯亮转到黄灯亮的延迟时间为10sdefine Y2RDELAY 1/黄灯亮转到红灯亮的延迟时间为5smodule sign_control(light,rstn,clk); output15:0 light; input rstn,clk; reg15:0 light;/light15:12代表A路口 /light11:8代表B路口 /light7:4代表c路口 /light3:0代表D路口 /高位到低位依次表示左转灯,红灯,绿灯,黄灯 且每一位用1/代表亮,0代表灭 /状态定义 parameter S0=3'd0, S1=3'd1, S2=3'd2, S3=3'd3, S4=3'd4, S5=3'd5, S6=3'd6, S7=3'd7; /内部状态变量 reg2:0 state; reg2:0 next_state; /状态只能在时钟的上升沿改变always (posedge clk) if(!rstn)begin state<=S0; next_state<=S0; end else state<=next_state;/状态改变 always (state) begin case(state) S0:light<=16'b0010_0100_0010_0100; S1:light<=16'b0001_0100_0001_0100; S2:light<=16'b1000_0100_1000_0100; S3:light<=16'b0001_0100_0001_0100; S4:light<=16'b0100_0010_0100_0010; S5:light<=16'b0100_0001_0100_0001; S6:light<=16'b0100_1000_0100_1000; S7:light<=16'b0100_0001_0100_0001; endcase end always (state) begin case(state) S0:begin repeat(G2YDELAY-1) (posedge clk); next_state=S1; end S1:begin repeat(Y2LDELAY-1) (posedge clk); next_state=S2; end S2:begin repeat(L2YDELAY-1) (posedge clk); next_state=S3; end S3:begin repeat(Y2RDELAY-1) (posedge clk); next_state=S4; end S4:begin repeat(G2YDELAY-1) (posedge clk); next_state=S5; end S5:begin repeat(Y2LDELAY-1) (posedge clk); next_state=S6; end S6:begin repeat(L2YDELAY-1) (posedge clk); next_state=S7; end S7:begin repeat(Y2RDELAY-1) (posedge clk); next_state=S0; end endcase end endmodule附录2激励块代码如下:timescale 1ns/100psmodule stimulus; reg clk,rstn; wire15:0 light; sign_control il(light,rstn,clk);initialbegin clk=1'b1; forever #2.5 clk=clk;endinitialbegin rstn=1'b0; #60 rstn=1'b1; #200 rstn=1'b0; #100 rstn=1'b1;endendmodule
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!