Verilog设计实例(二):交通信号灯设计实例

这篇具有很好参考价值的文章主要介绍了Verilog设计实例(二):交通信号灯设计实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文为Verilog实例开发的第二弹,缺少Verilog代码练手或者有些生疏的可以在这里参考一些设计实例进行练习。
本系列导航:
Verilog设计实例(一):自动售货机设计实例

交通信号灯设计实例

设计一个交通灯控制电路,红灯30s后转为绿灯。共x,y方向两组交通灯,每组红绿灯各一个,红灯亮30s,绿灯亮30s,设系统时钟频率为50MHz,要求用数码管显示计时结果。

状态转换图

verilog红绿灯和数码管,Verilog&FPGA开发,fpga开发

实现框架

verilog红绿灯和数码管,Verilog&FPGA开发,fpga开发
信号灯结构框架如图所示,需要实现的模块有分频器、计数器、BCD码以及译码器,还包括状态转换和状态输出部分。

Verilog实现

定义模块和IO端口

`timescale 1ns / 1ps

module trafficlight(
    clk_1Hz,
    rst,
    ledR_H,
    ledG_H,
    ledR_V,
    ledG_V,
    seg7_VH, //数码管显示-高位
    seg7_VL, //数码管显示-低位
    led15    //状态指示
    );
    
    parameter S1 = 1;//x方向红灯亮,y方向绿灯亮
    parameter S2 = 0;//x方向绿灯亮,y方向红灯亮
    input clk_50M,rst;
    output reg ledG_H,ledG_V,ledR_H,ledR_V;
    output wire [6:0] seg7_VH;
    output wire [6:0] seg7_VL;
    output wire led15;

实现分频器

reg clk_1Hz;    //1Hz的分频器
reg [31:0] cnt_1Hz;
always@(posedge clk_50M or negedge rst)
begin
    if(!rst)
    begin
        cnt_1Hz <= 1;
        clk_1Hz <= 1;
    end
    else
    begin
        if(cnt_1Hz>=25000000)
            begin
            cnt_1Hz <= 1;
            clk_1Hz <= ~clk_1Hz;
            end
        else
        cnt_1Hz <= cnt_1Hz + 1;
    end
end

实现计数器

reg [7:0] cnt30;    //计数器
always @(posedge clk_1Hz or negedge rst) 
begin
    if(!rst)
    begin
        cnt30 <= 0;
    end
    else
    begin
        if (cnt30>=30) 
        begin
            
            cnt30 <= 0;
        end
        else
            cnt30 <= cnt30 + 1;
    end
end

实现BCD码转换

reg [7:0] cntDis;   //BCD码转换
always @(posedge clk_50M) 
begin
    if(cnt30 > 29)
    begin
        cntDis[7:4] <= 3;
        cntDis[3:0] <= cnt30-30;
    end
    else if (cnt30 > 19) 
    begin
        cntDis[7:4] <= 2;
        cntDis[3:0] <= cnt30-20;
    end
    else if (cnt30 > 9) 
    begin
        cntDis[7:4] <= 1;
        cntDis[3:0] <= cnt30-10;
    end
    else
        cntDis <= cnt30;
    
end

调用数码管译码器

数码管译码器实现(SEG7_LUT.v)
module SEG7_LUT (
  input      [3:0] iDIG,
  output reg [6:0] oSEG
);

always@(iDIG)
begin
  case(iDIG)
    4'h1: oSEG = 7'b1111001;  // ---t----
    4'h2: oSEG = 7'b0100100;  // |      |
    4'h3: oSEG = 7'b0110000;  // lt     rt
    4'h4: oSEG = 7'b0011001;  // |      |
    4'h5: oSEG = 7'b0010010;  // ---m----
    4'h6: oSEG = 7'b0000010;  // |      |
    4'h7: oSEG = 7'b1111000;  // lb     rb
    4'h8: oSEG = 7'b0000000;  // |      |
    4'h9: oSEG = 7'b0011000;  // ---b----
    4'ha: oSEG = 7'b0001000;
    4'hb: oSEG = 7'b0000011;  
    4'hc: oSEG = 7'b1000110;  
    4'hd: oSEG = 7'b0100001;  
    4'he: oSEG = 7'b0000110;  
    4'hf: oSEG = 7'b0001110;  
    default: oSEG = 7'b1000000;  
  endcase                    
end                           
                              
endmodule
调用译码器实例
SEG7_LUT hex1(cntDis[3:0], seg7_VL[6:0]);
SEG7_LUT hex2(cntDis[7:4], seg7_VH[6:0]);

实现状态机

//状态转换
reg state;
always @(posedge clk_1Hz) 
begin
    case(state)
    S1:
    if (cnt30 >= 30)    state <= S2;
    S2:
    if (cnt30 >= 30)    state <= S1;
    default:
        state <= S1;
    endcase
end

always @(posedge clk_50M or negedge rst) 
begin
    if(!rst)
    begin
        ledG_H <= 0;
        ledG_V <= 0;
        ledR_H <= 0;
        ledR_V <= 0;
    end
    else
    begin
        case(state)
        S1: //横向红灯亮,纵向绿灯亮
        begin
            ledG_H <= 0;
            ledG_V <= 1;
            ledR_H <= 1;
            ledR_V <= 0;
        end
        S2: //横向绿灯,纵向红灯
        begin
            ledG_H <= 1;
            ledG_V <= 0;
            ledR_H <= 0;
            ledR_V <= 1;
        end
        default:
        begin
            ledG_H <= 0;
            ledG_V <= 0;
            ledR_H <= 0;
            ledR_V <= 0;
        end
        endcase
    end
end
assign led15 = state;   //状态指示

简单的TestBench编写

这里我没上板子跑,所以没用50MHz的时钟,直接给定了1Hz的时钟输入,有需要的可以自行修改。

module TL_tb();

                    reg clk_1Hz;
                    reg rst;
                    wire ledR_H;
                    wire ledG_H;
                    wire ledR_V;
                    wire ledG_V;
                    wire [6:0] seg7_VH; //数码管显示-高位
                    wire [6:0] seg7_VL; //数码管显示-低位
                    wire led15;    //状态指示



trafficlight tl1(
                    .clk_1Hz(clk_1Hz),
                    .rst(rst),
                    .ledR_H(ledR_H),
                    .ledG_H(ledG_H),
                    .ledR_V(ledR_V),
                    .ledG_V(ledG_V),
                    .seg7_VH(seg7_VH),
                    .seg7_VL(seg7_VL),
                    .led15(led15)
    );
initial begin
    clk_1Hz = 0;
    rst = 0;
    #20;rst = 1;
    //vivado中默认跑1000ns
end

always #5 clk_1Hz = ~clk_1Hz;

endmodule

测试波形

波形中,复位信号失效后,每三十个时钟周期,横向和纵向红绿灯的显示会交替。
verilog红绿灯和数码管,Verilog&amp;FPGA开发,fpga开发

总结

这是一个简单的红绿灯交替的例子,在此基础上,还可以添加黄灯状态,感兴趣的朋友可以自行尝试。本实例在时序逻辑电路的基础上还涉及到了分频器和BCD码、数码管等的实现,是一个比较典型的学习例子。文章来源地址https://www.toymoban.com/news/detail-768809.html

到了这里,关于Verilog设计实例(二):交通信号灯设计实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于FPGA的交通信号灯设计(二)

    根据要求,我们可以用典型时序状态机实现功能,共有六个大的状态,现设定: S0: 四个方向的红灯全亮 S1: 东、西方向绿灯亮,南、北方向红灯亮 S2:东、西方向黄灯闪烁,南、北方向红灯亮 S3:东、西方向红灯亮,南、北方向绿灯亮 S4:东、西方向红灯亮,南、北方向黄

    2024年04月23日
    浏览(40)
  • 基于STM32的智能交通信号灯控制系统设计

    通过分析交通规则和交通灯的工作原理,给出智能交通信号灯控制系统的设计方法。基于STM32F103芯片开发满足需求的外围电路,并绘制电路原理图。基于MDK keil软件编写交通信号灯控制程序,利用LabVIEW搭建交通信号灯场景,LabVIEW可以控制红绿灯时长。分别完成硬件、软件调试

    2024年02月03日
    浏览(51)
  • 基于51单片机的交通信号灯设计

    简介 1.本系统采用STC89C51单片机以及单片机最小系统和74HC245电路以及外围的按键和数码管显示等部件,设计一个基于单片机的交通灯设计。设计通过两位一体共阴极数码管显示,并能通过按键对定时进行设置,而且具有蜂鸣器提示。 2、本设计拟实现的性能指标如下: 设在十

    2024年02月04日
    浏览(37)
  • 基于Proteus仿真的交通信号灯设计——利用汇编语言实现

    基本信息 采用AT89C51单片机 晶振频率:12MHZ 红绿灯:发光二极管 数字显示:LED数码管 东西南北四个方向,一次循环共有六个状态,且每个状态的倒计时时间一样 交通状态 东西红灯22s,南北绿灯22s(数码管从0到21); 东西红灯5s,南北绿灯5s且没0.5s闪烁一次(数码管从0到4);

    2024年02月09日
    浏览(52)
  • 基于AT89C52单片机的交通信号灯设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87772657 源码获取 主要内容: 本次设计所提出的一种基于单片机技术的简易计算器的方案,能更好的解决计算机计算的问题,随着数字生活的到来,单片机在生活中越来越重要,它能将大量的逻辑功

    2024年02月10日
    浏览(58)
  • 51单片机STM32交通灯红绿灯十字路口信号灯类设计功能要求汇总

    浏览必读: 使用搜索可以达到事半功倍的效果。 电脑浏览器CTRL+F可以使用搜索查找 功能说明: 1.四路交通灯,带有红绿灯倒计时,绿灯倒计时结束后转黄灯5秒,再转红灯。 2.紧急情况下按键紧急按钮,四路黄灯快闪。 3.可以动态设置红绿灯时间。 涉及知识点:按键扫

    2024年02月11日
    浏览(109)
  • 【EDA课程设计】FPGA交通信号灯的设计(含动画视频、超详细思路/步骤分析、完整代码与效果详解)

    ✨你好啊,我是 “ 怪 ” ,是一名在校大学生哦。 🌍主页链接:怪的个人博客主页 ☀️博文主更方向为: 课程学习知识、作业题解、期末备考。 随着专业的深入会越来越广哦…一起期待。 ❤️一个“不想让我曾没有做好的也成为你的遗憾”的博主。 💪很高兴与你相遇,

    2023年04月08日
    浏览(57)
  • 【论文笔记】IntelliLight智能交通灯:一种基于强化学习的智能交通信号灯控制方法

    博客声明:本文仅为个人论文阅读笔记,大部分原文对照的中文为翻译而来,只对其中错误明显的部分作了修改。其他一些个人理解不到位或有误的地方也尽请见谅。 标题原文: IntelliLight:A Reinforcement Learning Approach for Intelligent Traffic Light Control 论文来源: Proceedings of the 24

    2024年04月12日
    浏览(57)
  • 【WinForm项目】C#模拟交通信号灯|WinForm交通红绿灯

    交通信号灯十字路口通行原理图。 实际上归类为四大类: 南北双向直行 东西双向直行 一对黑色粗线的左转 一对红色粗线的左转。 状态逻辑图如下图所示: 假定通行顺序为:南北直行、南北左转、东西直行、东西左转。 南北行人只在南北车流绿灯和黄灯的时候可以通行,

    2024年02月09日
    浏览(53)
  • 基于51单片机的交通信号灯

    本设计学校的一次单片机实训。 利用51单片机控制各个路口红绿灯及时间显示。 1、题目要求 1、各个路口红绿灯亮灭的规则,暂不考虑左转方向; 2、倒计时的实现,利用单片机的定时器进行计数得到秒信号; 3、时间显示:东西南北四个方向的时间一致,当东西方向为60秒绿

    2024年01月24日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包