集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 3563|回复: 4

用Verilog编的基于FPGA的交通灯的程序,请求帮忙修改注释

[复制链接]
悟禅的行者 发表于 2011-4-18 15:58:13 | 显示全部楼层 |阅读模式
各位大侠,首先声明我不是偷懒,实在是迫于压力无奈,今年毕业,不从事本专业,找了一篇论文(不是完整的),语言是VHDL的,但我只接触过Verilog,用转换器转换了一下,但有很多错误,马上就要交论文了,请大家帮帮忙,修改和注释一下程序(简单的声明语句就不用注释了),在此谢过各位!

欲设计有一条主干道和一条支干道的汇合点形成十字交叉路口,主干道为东西向,支干道为南北向。为确保车辆安全,迅速地通行,在交叉道口的每个入口处设置了红,绿,黄3色信号灯。具体要求如下:
(1)主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通行,主干道每次放行55s,支干道每次放行25s。每次由绿灯变为红灯的过程中,黄灯亮5s作为过渡。
(2)能实现正常的倒计时显示功能。
(3)能实现总体清零功能:计数器由初始状态开始计数,对应状态的指示灯亮。
(4)能实现特殊状态的功能显示:进入特殊状态时,东西、南北路口均显示红灯状态。


主干道绿灯55sec,支干道绿灯25sec,黄灯5sec过渡。同时用数码管指示当前状态(红、黄、绿)剩余时间。另外,设计一个紧急状态,当紧急状态出现时,两个方向都禁止通行,指示红灯。紧急状态解除后,指示紧急状态前的时间。当复位状态出现时,整个系统恢复起始状态。当主干道绿灯55秒和5秒黄灯过渡时,支干道必须禁止通行,即支干道红灯亮55+5=60秒;当支干道由红灯转为绿灯时,支干道亮25秒绿灯和5秒黄灯过渡,此时主干道红灯应亮25+5=30秒。




module traffic(clk,reset,sp,GA,YA,RA,ring,pin129,GB,YB,RB,BCDout,LEDout);
input clk;
input reset;
input sp;
output GA;
wire GA;
output YA;
wire YA;
output RA;
wire RA;
inout ring;
wire ring_xhd10;
inout pin129;
wire pin129_xhdl1;
output GB;
wire GB;
output YB;
wire YB;
output RB;
wire RB;
output[7:0] BCDout;
wire[7:0] BCDout;
out[3:0] LEDout;
wire a0;
wire a1;
integer b;
integer d;
integer e;
integer f;
integer g;
integer h;

assign ring=ring_xhdl0;
assign pin129=pin129_xhdl1;

div u1(
.clkin1(clk),
.clkout1(a0)
);
div u2(
.clkin2(a0),
.clkout1(a1)
);
counter u3(
.clock(a1),
.reset(reset),
.sp(sp),
.countNum(b)
);
controller u4(
.clock(a1),
.countNum(b),
.sp(sp),
.GreenA(GA),
.YellowA(YA),
.RedA(RA),
.GreenB(GB),
.YellowB(YB),
.RedB(RB),
.NumA(c),
.NumB(d)
);
fenwei1 u5(
.Numin(c),
.NumA(e),
.NumB(f)
);
fenwei2 u6(
.Numin(d),
.NumC(g),
.NumD(h)
);
demx u7(
.clock(a0),
.NumA(e),
.NumB(f),
.NumC(g),
.NumD(h),
.segout(BCDout),
.led_sel(LEDout)
);

assign ring=1’b;
assign pin129=1’b1;
endmodule
module div1(clkin1,clkout1);

input clkin1;
output clkout1;
wire clkout1;
parameter N=1000;
reg[13:0] counter;
reg clk;

always@(clkin1)
begin
  if(clkin1==1b’1)
   begin
     if(counter==N)
        begin
          counter<=1;
          clk<= ~clk;
       end
    else
       begin
         counter<= counter+1;
      end
  end
end

assign clkout1=CLK;
endmoule

module div2(clkin2,clkout2);
input clkin2;
output clkout2;
parameter N=500;
reg[8:0] counter;

always@(clkin2)
  begin
     if(clkin2==1’b1)
       begin
          if(counter==N);
             begin
                counter<=1;
                clk<= ~clk;
            end
         else
            begin
               counter<= counter+1;
            end
     end
end

assign clkout2=CLK;
endmoule

module counter(clock,reset,sp,countNum);
input clock;
input reset;
input sp;
output[6:0] countNum;
reg [6:0] countNum;

always@( reset or clock or sp)
begin
    if(reset= =1’b0)
        begin
              countNum<=0;
        end
    else
        begin
    if(clock= =1’b1)
        begin
           if(sp= =1’b0)
               begin
                     countNum<= countNum;
               end
           else
               begin
                    if(countNum= =91)
                       begin
                         countNum<=0;
                      end
                   else
                      begin
                         countNum<= countNum+1;
                      end
              end
         end
     end
end
endmodule

module controller(clock,sp,countnum,NumA,NumB,RedA,GreenA,YellowA, RedB,GreenB,YellowB);
input clock;
input sp
input [6:0] countnum;
output [5:0] NumA;
reg [5:0] NumA;
output [5:0] NumB;
reg [5:0] NumB;
output RedA;
reg RedA;
output GreenA;
reg GreenA;
output YellowA;
reg YellowA;
output RedB;
reg RedB;
output GreenB;
reg GreenB;
output YellowB;
reg YellowB;

always@(clock or sp)
   begin
       if(sp= =1’b0)
             begin
                RedA<=1’b1;
                RedB<=1’b1;
                GreenA<=1’b0;
                GreenB<=1’b0;
                YellowA<=1’b0;
                YellowB<=1’b0;
            end
       else if(clock= =1’b1)
  begin
     if(countnum<=55)
       begin
          NumA<=55- countnum;
          RedA<=1’b0;
          GreenA<=1’b1;
          YellowA<=1’b0;
       end
          else if(countnum<=60);
             begin
          NumA<=60- countnum;
          RedA<=1’b0;
          GreenA<=1’b0;
          YellowA<=1’b1;
       end
    else
       begin
          NumA<=91- countnum;
          RedA<=1’b1;
          GreenA<=1’b0;
          YellowA<=1’b0;
       end
    if(countnum<=60)
       begin
          NumB<=60- countnum;
          RedB<=1’b1;
          GreenB<=1’b0;
          YellowB<=1’b0;
       end
    else if(countnum<=86)
       begin
          NumB<=60- countnum;
          RedB<=1’b1;
          GreenB<=1’b0;
          YellowB<=1’b0;
       end
    else
       begin
          NumB<=91- countnum;
          RedB<=1’b0;
          GreenB<=1’b0;
          YellowB<=1’b1;
       end
         end
end
endmodule

分位器模块主程序
module fenwei1(Numin,NumA,NumB);                  
input[5:0]Numin;
output[3:0]NumA;
reg[3:0]NumA;
output[3:0]NumB;
reg[3:0]NumB;

   always@(Numin)
begin
  if(Numin>=50)
     begin
       NumA<=5;
       NumB<= Numin-50;
     end
  else if(Numin>=40)
     begin
       NumA<=4;
       NumB<= Numin-40;
    end
else if(Numin>=30)
     begin
       NumA<=3;
       NumB<= Numin-30;
     end
else if(Numin>=20)
     begin
       NumA<=2;
       NumB<= Numin-20;
     end
else if(Numin>=10)
     begin
       NumA<=1;
       NumB<= Numin-10;
     end
else
   begin
       NumA<=0;
       NumB<= Numin;
     end
end
endmodule

module fenwei2(Numin,NumC,NumD);               
input[5:0]Numin;
output[3:0]NumC;
reg[3:0]NumC;
output[3:0]NumD;
reg[3:0]NumD;

   always@(Numin)
begin
   if(Numin>=60)
      begin
        NumC<=6;
        NumD<= Numin-60;
      end
else if(Numin>=50)
     begin
        NumC<=5;
        NumD<= Numin-50;
      end
  else if(Numin>=40)
      begin
        NumC<=4;
        NumD<= Numin-40;
      end
else if(Numin>=30)
      begin
        NumC<=3;
        NumD<= Numin-30;
      end
else if(Numin>=20)
      begin
        NumC<=2;
        NumD<= Numin-20;
      end
else if(Numin>=10)
      begin
        NumC<=1;
        NumD<= Numin-10;
      end
else
begin
        NumC<=0;
        NumD<= Numin;
      end
end
endmodule






BCD数码管模块主程序
module demx(clock,NumA, NumB, NumC, NumD,segout,led_sel);
input clock;
intput [3:0]NumA;
intput [3:0]NumB;
intput [3:0]NumC;
intput [3:0]NumD;
output[7:0]segout;
wire[7:0]segout;
output[3:0]led_sel;
reg[3:0] led_sel;
integer Q1;
reg[1:0]Q2;

always@(clock)
begin
   if(clock= =1’b1)
     begin
        Q2<=Q2+1’b1;
     end
  end

always@(Q2 or NumA or NumB or NumC or NumD)
begin
  case(Q2)
     2’b00:
            begin
               led_sel<=4’b0001;
                Q1<=NumD;
            end
     2’b01:
               begin
                 led_sel<=4’b0010;
                  Q1<=NumC;
               end
2’b10:
               begin
                 led_sel<=4’b0100;
                  Q1<=NumB;
               end
2’b11:
               begin
                 led_sel<=4’b1000;
                  Q1<=NumA;
               end
      default:
               begin
               end
endcase
end
BCD u1(
    .bcd.data(Q1),
    .bcdout(segout)
);
endmodule

module BCD(bcd_data,bcdout);
input[3:0] bcd_data;
output[7:0] bcdout;
reg[7:0] bcdout;

always@(bcd_data)
begin
   case(bcd_data)
     0:
        begin
               bcdout<=8’b11000000;
             end
     1:
        begin
               bcdout<=8’b11110000;
             end
  2:
        begin
               bcdout<=8’b10100100;
             end
  3:
        begin
               bcdout<=8’b10110000;
             end
  4:
        begin
               bcdout<=8’b10011001;
             end
  5:
        begin
               bcdout<=8’b10000010;
             end
  6:
        begin
               bcdout<=8’b10000010;
             end
  7:
        begin
               bcdout<=8’b11111000;
             end
  8:
        begin
               bcdout<=8’b10000000;
             end
  9:
        begin
               bcdout<=8’b10010000;
             end
default:
     begin
     end
endcase
    end
endmoule


顶层文件模块主程序
module traffic(clk,reset,sp,GA,YA,RA,ring,pin129,GB,YB,RB,BCDout,LEDout);
input clk;
input reset;
input sp;
output GA;
wire GA;
output YA;
wire YA;
output RA;
wire RA;
inout ring;
wire ring_xhd10;
inout pin129;
wire pin129_xhdl1;
output GB;
wire GB;
output YB;
wire YB;
output RB;
wire RB;
output[7:0] BCDout;
wire[7:0] BCDout;
out[3:0] LEDout;
wire[3:0] LEDout;

wire a0;
wire a1;
integer b;
integer d;
integer e;
integer f;
integer g;
integer h;

assign ring=ring_xhdl0;
assign pin129=pin129_xhdl1;

div u1(
      .clkin1(clk),
      .clkout1(a0)
);
div u2(
      .clkin2(a0),
      .clkout1(a1)
);
counter u3(
      .clock(a1),
      .reset(reset),
      .sp(sp),
      .countNum(b)
);
   controller u4(
         .clock(a1),
         .countNum(b),
         .sp(sp),
         .GreenA(GA),
         .YellowA(YA),
         .RedA(RA),
         .GreenB(GB),
         .YellowB(YB),
         .RedB(RB),
         .NumA(c),
         .NumB(d)
);
   fenwei1 u5(
         .Numin(c),
         .NumA(e),
         .NumB(f)
);
fenwei2 u6(
         .Numin(d),
         .NumC(g),
            .NumD(h)
);
demx u7(
      .clock(a0),
      .NumA(e),
      .NumB(f),
      .NumC(g),
      .NumD(h),
      .segout(BCDout),
      .led_sel(LEDout)
);
assign ring=1’bz;
assign pin129=1’b1;
endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| 悟禅的行者 发表于 2011-4-20 09:30:18 | 显示全部楼层
没人吗,呜呜
18799730091 发表于 2021-6-29 17:01:32 | 显示全部楼层
这个代码是好使的吗
lihongkun16 发表于 2021-6-30 09:28:27 | 显示全部楼层
用Verilog编的基于FPGA的交通灯的程序,请求帮忙修改注释
dameihuaxia 发表于 2021-7-7 14:12:09 | 显示全部楼层
FPGA全局时钟的运用
http://www.fpgaw.com/forum.php?m ... 5&fromuid=58166
(出处: fpga论坛|fpga设计论坛)
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-1 13:25 , Processed in 0.065600 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表