原创 【博客大赛】【原创】Verilog自制交通灯控制器加倒计时功能(内带源码文件)

2012-3-27 21:22 7201 24 43 分类: FPGA/CPLD

技术交流或者创业交流请关注我的微博:

http://weibo.com/yc18

 

        无论是课程设计,还是实验课,最好的方法就是在FPGA实验板上进行测试实验,这样可以看到实际交通灯的效果。对每一部分修改可以看到修改的效果,知道程序的修改带来的效果,那样比只看代码要理解的更深刻。
     在设计中最好是分模块设计,状态控制,脉冲发生等部分,对每个模块的调试书写时要特别注意每位的意义,尤其在软件绑定引脚时,每个输入输出信号的绑定,引脚的输入输出特性等,要与实际代码中的相符,在调试中不断发现问题,解决问题。

下面附上代码部分:
 

自制交通灯控制器加倒计时功能:

 

module traffic(CLK,EN,LIGHT_A,LIGHT_B,TIME_A,TIME_B,a,b,c,d,e,f,g);

output[7:0] TIME_A,TIME_B;

output[2:0] LIGHT_A,LIGHT_B;

output[3:0] a,b,c,d,e,f,g;

input CLK,EN;

reg[7:0] numa,numb;

reg tempa,tempb;

reg[1:0] counta,countb;

reg[5:0] ared,ayellow,agreen,bred,byellow,bgreen;

reg[2:0] LIGHT_A,LIGHT_B;

reg[3:0] a,b,c,d,e,f,g;

 

always @(EN)

  if(!EN) 

    begin

      ared <=8'd45;

      ayellow <=8'd05;

      agreen <=8'd40;

      bred <=8'd45;

      byellow <=8'd05;

      bgreen <=8'd40;

    end

assign TIME_A=numa;

assign TIME_B=numb;

 

always @(posedge CLK)

   begin

      if(EN)

         begin

            if(!tempa)

                begin

                   tempa<=1;

                      case(counta)

                     0: begin numa<=ared; LIGHT_A<=4; counta<=1; end

                     1: begin numa<=agreen; LIGHT_A<=1; counta<=2; end

                     2:begin numa<=ayellow; LIGHT_A<=2;counta<=0; end

                      default: LIGHT_A<=4;

                      endcase

               end

           else

              begin

                if(numa>=1)

                if(numa[3:0]==0)

                   begin

                      numa[3:0]<=9;

                      numa[7:4]<=numa[7:4]-1;

                   end

                else numa[3:0]<=numa[3:0]-1;

               if (numa==0) tempa<=0;

              end

           end

        else

           begin

             LIGHT_A<=4;

             counta<=0;

             tempa<=0;

           end

    end

 

always @(posedge CLK)

   begin

      if (EN)

         begin

            if(!tempb)

                begin

                   tempb<=1;

                   case (countb)

                    0: begin numb<=bgreen; LIGHT_B<=1; countb<=1; end

                    1:begin numb<=byellow; LIGHT_B<=2; countb<=2; end

                    2: begin numb<=bred; LIGHT_B<=4; countb<=0; end

                      default: LIGHT_B<=1;

                   endcase

                end

            else

               begin

                 if(numb>=1)

                 if(!numb[3:0])

                     begin

                       numb[3:0]<=9;

                       numb[7:4]<=numb[7:4]-1;

                     end

                 else numb[3:0]<=numb[3:0]-1;

                if(numb==0) tempb<=0;

              end

           end

       else

          begin

             LIGHT_B<=4;

             tempb<=0;

             countb<=0;

          end

    end

always @(TIME_A)

begin

case(TIME_A[7:4])

4'd0:{a[3],b[3],c[3],d[3],e[3],f[3],g[3]}=7'b1111110;

4'd1:{a[3],b[3],c[3],d[3],e[3],f[3],g[3]}=7'b0110000;

4'd2:{a[3],b[3],c[3],d[3],e[3],f[3],g[3]}=7'b1101101;

4'd3:{a[3],b[3],c[3],d[3],e[3],f[3],g[3]}=7'b1111001;

4'd4:{a[3],b[3],c[3],d[3],e[3],f[3],g[3]}=7'b0110011;

4'd5:{a[3],b[3],c[3],d[3],e[3],f[3],g[3]}=7'b1011011;

4'd6:{a[3],b[3],c[3],d[3],e[3],f[3],g[3]}=7'b1011111;

4'd7:{a[3],b[3],c[3],d[3],e[3],f[3],g[3]}=7'b1110000;

4'd8:{a[3],b[3],c[3],d[3],e[3],f[3],g[3]}=7'b1111111;

4'd9:{a[3],b[3],c[3],d[3],e[3],f[3],g[3]}=7'b1111011;

default:{a[3],b[3],c[3],d[3],e[3],f[3],g[3]}=7'bx;

endcase

end

always @(TIME_A)

begin

case(TIME_A[3:0])

4'd0:{a[2],b[2],c[2],d[2],e[2],f[2],g[2]}=7'b1111110;

4'd1:{a[2],b[2],c[2],d[2],e[2],f[2],g[2]}=7'b0110000;

4'd2:{a[2],b[2],c[2],d[2],e[2],f[2],g[2]}=7'b1101101;

4'd3:{a[2],b[2],c[2],d[2],e[2],f[2],g[2]}=7'b1111001;

4'd4:{a[2],b[2],c[2],d[2],e[2],f[2],g[2]}=7'b0110011;

4'd5:{a[2],b[2],c[2],d[2],e[2],f[2],g[2]}=7'b1011011;

4'd6:{a[2],b[2],c[2],d[2],e[2],f[2],g[2]}=7'b1011111;

4'd7:{a[2],b[2],c[2],d[2],e[2],f[2],g[2]}=7'b1110000;

4'd8:{a[2],b[2],c[2],d[2],e[2],f[2],g[2]}=7'b1111111;

4'd9:{a[2],b[2],c[2],d[2],e[2],f[2],g[2]}=7'b1111011;

default:{a[2],b[2],c[2],d[2],e[2],f[2],g[2]}=7'bx;

endcase

end

always @(TIME_B)

begin

case(TIME_B[7:4])

4'd0:{a[1],b[1],c[1],d[1],e[1],f[1],g[1]}=7'b1111110;

4'd1:{a[1],b[1],c[1],d[1],e[1],f[1],g[1]}=7'b0110000;

4'd2:{a[1],b[1],c[1],d[1],e[1],f[1],g[1]}=7'b1101101;

4'd3:{a[1],b[1],c[1],d[1],e[1],f[1],g[1]}=7'b1111001;

4'd4:{a[1],b[1],c[1],d[1],e[1],f[1],g[1]}=7'b0110011;

4'd5:{a[1],b[1],c[1],d[1],e[1],f[1],g[1]}=7'b1011011;

4'd6:{a[1],b[1],c[1],d[1],e[1],f[1],g[1]}=7'b1011111;

4'd7:{a[1],b[1],c[1],d[1],e[1],f[1],g[1]}=7'b1110000;

4'd8:{a[1],b[1],c[1],d[1],e[1],f[1],g[1]}=7'b1111111;

4'd9:{a[1],b[1],c[1],d[1],e[1],f[1],g[1]}=7'b1111011;

default:{a[1],b[1],c[1],d[1],e[1],f[1],g[1]}=7'bx;

endcase

end

always @(TIME_B)

begin

case(TIME_B[3:0])

4'd0:{a[0],b[0],c[0],d[0],e[0],f[0],g[0]}=7'b1111110;

4'd1:{a[0],b[0],c[0],d[0],e[0],f[0],g[0]}=7'b0110000;

4'd2:{a[0],b[0],c[0],d[0],e[0],f[0],g[0]}=7'b1101101;

4'd3:{a[0],b[0],c[0],d[0],e[0],f[0],g[0]}=7'b1111001;

4'd4:{a[0],b[0],c[0],d[0],e[0],f[0],g[0]}=7'b0110011;

4'd5:{a[0],b[0],c[0],d[0],e[0],f[0],g[0]}=7'b1011011;

4'd6:{a[0],b[0],c[0],d[0],e[0],f[0],g[0]}=7'b1011111;

4'd7:{a[0],b[0],c[0],d[0],e[0],f[0],g[0]}=7'b1110000;

4'd8:{a[0],b[0],c[0],d[0],e[0],f[0],g[0]}=7'b1111111;

4'd9:{a[0],b[0],c[0],d[0],e[0],f[0],g[0]}=7'b1111011;

default:{a[0],b[0],c[0],d[0],e[0],f[0],g[0]}=7'bx;

endcase

end

endmodule

文章评论19条评论)

登录后参与讨论

用户377235 2012-5-10 14:10

交通灯控制器加倒计时功能,挺好的……参考下

用户1647523 2012-5-4 15:57

一个很好的学习Verilog的例子,交通灯控制器加倒计时功能,我也曾做过,不过我只是设计过电路,本篇文章作者介绍得很详细,并且有源代码附上。爱好者们,来看看吧,很不错的文章。

用户413878 2012-4-12 20:22

不错,谢谢分享

用户377235 2012-4-11 16:50

楼主是用的什么型号的FPGA呢??

用户377235 2012-3-31 11:16

解码模块采用了,不知道有没有更好的编写方法,这样是直观,但是觉得还是有点繁琐……

用户377235 2012-3-28 22:33

现在正在研究cyclone系列的FPGA,也正在做实验 ,正好可以用下楼主的程序。

用户377235 2012-3-27 19:29

学习了,采用了其中一部分。

用户377235 2012-3-27 13:51

大家主要用哪家的FPGA呢,Ataler xilinx 还有其他的吗……

用户377235 2012-3-26 12:38

辛苦楼主敲的代码了,现在也正需要,感谢分享……

用户423201 2012-3-25 21:55

初学者,希望能指点,互相学习.
相关推荐阅读
357854360_973111976 2012-09-04 12:58
【TI博客大赛】写给初次接触TI的DSP或者MCU的人
       在本科期间读的是电子专业,主要学习了一些51单片机的知识,还有基础的ARM知识,也做了很多实验,主要是在开发板上调试,做一些实际的操作例程。初次接触TI的产品,是在读研期间,主要的是...
357854360_973111976 2012-09-03 20:59
【TI博客大赛】TI的DSP TMS2812的烧写与启动
一、TMS2812 flash烧写的问题,具体步骤如下: 下载烧写FLASH配套CMD文件、LIB文件以及起始代码asm文件。 CMD文件名称:DSP281x_Headers_nonBIOS...
357854360_973111976 2012-09-03 14:25
【TI博客大赛】关于DSP配置CMD文件的使用
      配置好主程序的CMD文件,才能将FLASH成功烧录,并且将FLASH中的文件拷贝到RAM中运行。关于CMD文件的配置: 首先在F2812.CMD文件中,可以看到有关于加载FLASH...
357854360_973111976 2012-09-03 13:04
【TI博客大赛】使用TI的MCU和DSP的一点经验之谈
    我在学校里面就一直使用TI的产品设计PCB板,算是TI的忠实用户,用的主要是C2000系类的,像2812是最常用的,还用过2808、28335,再到现在的28346。这里也和大家分享一下我...
357854360_973111976 2012-07-15 10:57
【TI博客大赛】德州仪器TI在模拟技术领域的几大应用
      德州仪器研究开发涉及的领域有很多,其产品应用的领域也很广,下面是其几项重大的模拟技术应用领域: ·1.医疗电子器件,特别是用于个人诊断的设备 ·2.用于通信和娱乐设备的触摸反馈...
357854360_973111976 2012-07-10 12:57
【TI博客大赛】【原创】模拟电子学习自我总结-初学者参考
      现在是信息化快速发展的时代,对于电子产品的更新换代之快,大家都能感觉到。但对于我们学习电子的朋友,也许都会有同样的感觉那就是,数字技术要简单,好理解,而模拟电子技术难理解,较抽象。数字...
我要评论
19
24
关闭 站长推荐上一条 /2 下一条