FPGA 交通灯

设计要求

实现开发板上东西南北 4 个方向,每个方向上的 3 个 LED 灯按照“绿灯--黄灯--红灯--绿灯- -黄灯......”依次循环变化。变化的速度不同,东面的间隔时间为 1 秒;西面的间隔时间为 2 秒;南 面的间隔时间为 3 秒;北面的间隔时间为 4 秒。 具体要求: 1、每个方向的灯分开独立设计。 2、首先设计东向的灯:设计一个计时 1 秒的计数器,用来计算灯的状态变化的时间间隔。 3、如果计时 1 秒到了,把黄灯点亮;再过 1 秒把红灯点亮;再过 1 秒,把绿灯点亮...... 依次循环。 4、设计西方向的灯:设计一个计时 2 秒的计数器,其他的类似。

2

根据题目功能要求,东西南北四个方向 LED 灯颜色变换的速度都不同。因为在数字电路中的延 时都是通过计数器实现的,计数器*时钟周期=延时时间。本模块中,由于输入时钟是 50MHz,时钟周 期为 20ns,功能要求每 1 秒变化一次。我们通过 counter 来表示延时,当其值为 1s/20ns=5000_00 00 时,表示 1 秒时间到。 本工程架构由四个计数器组成:e_counter w_counter n_counter s_counter。

可以看到 50000000*4 位宽为28位 所以所有计数器位宽都为[27:0].

parameter COUNT_1S = 26'd5000_0000;

always @(posedge clk or negedge rst_n) begin

if (rst_n==0) begin

e_counter <= 0;

end

else if(add_e_counter) begin

if(end_e_counter)

e_counter <= 0;

else e_counter <= e_counter+1 ;

end

end

assign add_e_counter = 1;

assign end_e_counter = add_e_counter && e_counter == COUNT_1S-1 ;

LED 灯信号的变化,根据功能要求,东面的间隔时间为 1 秒;西面的间隔时间为 2 秒;南面 2 的间隔时间为 3 秒;北面的间隔时间为 4 秒。计数时间到时变化;时间没到,则不变化。每一时 刻每个方向只有一个灯亮,并且亮灯的颜色顺序按照“绿灯--黄灯--红灯--绿灯--黄灯.....”依次循环变 化。 东西南北四个方向的各有三盏不同颜色的 LED 灯,每个方向的三个 LED 灯都由 3 比特信号控 制,最高位为红灯,最低位为绿灯,并且低电平时 LED 灯亮。led_east 表示东面三个 LED 灯,led_ west 表示西面三个 LED 灯,led_south 表示南面三个 LED 灯,led_north 表示北面三个 LED 灯。 三色 LED 灯的循环变换控制可以通过拼接的方法使数据循环左移来实现。

接下来就是灯的控制信号 这里采用移位拼接的方法;led_east<={{(LED_LEN-1){1'b1}},1'b0};

led_east<={{(LED_LEN-1){1'b1}},1'b0};

代码如下:采用一个时序逻辑来控制。

always @(posedge clk or negedge rst_n)begin

if(rst_n==1'b0)begin

led_east<={{(LED_LEN-1){1'b1}},1'b0};

end

else if(end_e_counter)begin

led_east<={led_east[LED_LEN-2:0],led_east[LED_LEN-1]};

end

else begin

led_east<=led_east;

end

end

最后输出端口output如下

 

总体代码如下

module jiaotongden
(
    input  wire      clk,
    input  wire   rst_n,
    output reg [2:0]  led_east,
    output reg [2:0]  led_south,
    output reg [2:0]  led_west,
    output reg [2:0]  led_north
    );
    
    reg [27:0] e_counter;
    reg [27:0] w_counter;
    reg [27:0] n_counter;
    reg [27:0] s_counter;
    
    
parameter COUNT_1S = 26'd5000_0000;
parameter LED_LEN = 3;
   
 always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
e_counter<= 0;
end
else if(add_e_counter)begin
if(end_e_counter)
   e_counter <= 0;
else
  e_counter <=e_counter + 1;
end
end

assign add_e_counter = 1;       
assign end_e_counter = add_e_counter && e_counter==COUNT_1S-1 ;   


always @(posedge clk or negedge rst_n) begin 
 if (rst_n==0) begin
 w_counter <= 0; 
 end
 else if(add_w_counter) begin
 if(end_w_counter)
 w_counter <= 0; 
 else
 w_counter <= w_counter+1 ;
 end
end
assign add_w_counter = 1;
assign end_w_counter = add_w_counter && w_counter == 2*COUNT_1S-1 ;

always @(posedge clk or negedge rst_n) begin 
 if (rst_n==0) begin
 s_counter <= 0; 
 end
 else if(add_s_counter) begin
 if(end_s_counter)
 s_counter <= 0; 
 else
 s_counter <= s_counter+1 ;
 end
end
assign add_s_counter = 1;
assign end_s_counter = add_s_counter && s_counter == 3*COUNT_1S-1 ;
  
  
  always @(posedge clk or negedge rst_n) begin 
 if (rst_n==0) begin
 n_counter <= 0; 
 end
 else if(add_n_counter) begin
 if(end_n_counter)
 n_counter <= 0; 
 else
 n_counter <= n_counter+1 ;
 end
end
assign add_n_counter = 1;
assign end_n_counter = add_n_counter && n_counter == 4*COUNT_1S-1 ; 


always @(posedge clk or negedge rst_n)begin
 if(rst_n==1'b0)begin
 led_east<={{(LED_LEN-1){1'b1}},1'b0};
 end
 else if(end_e_counter)begin
 led_east<={led_east[LED_LEN-2:0],led_east[LED_LEN-1]};
 end
 else begin
 led_east<=led_east;
 end
end


always @(posedge clk or negedge rst_n)begin
 if(rst_n==1'b0)begin
 led_west<={{(LED_LEN-1){1'b1}},1'b0};
 end
 else if(end_w_counter)begin
  led_west<={led_west[LED_LEN-2:0],led_west[LED_LEN-1]};
 end
 else begin
 led_west<=led_west;
 end
end

always @(posedge clk or negedge rst_n)begin
 if(rst_n==1'b0)begin
 led_south<={{(LED_LEN-1){1'b1}},1'b0};
 end
 else if(end_s_counter)begin
 led_south<={led_south[LED_LEN-2:0],led_south[LED_LEN-1]};
 end
 else begin
 led_south<=led_south;
 end
end

always @(posedge clk or negedge rst_n)begin
 if(rst_n==1'b0)begin
 led_north<={{(LED_LEN-1){1'b1}},1'b0};
 end
 else if(end_n_counter)begin
 led_north<={led_north[LED_LEN-2:0],led_north[LED_LEN-1]};
 end
 else begin
 led_north<=led_north;
 end
end

endmodule

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设计任务 (一)有一条主干道和一条支干道的汇合点形成十字交叉路口,主干道为东西向,支干道为南北向。为确保车辆安全,迅速地通行,在交叉道口的每个入口处设置了红,绿,黄3色信号。 (二)要求: (1)主干道绿亮时,支干道红亮,反之亦然,两者交替允许通行,主干道每次放行55s,支干道每次放行25s。每次由绿变为红的过程中,黄亮5s作为过渡。 (2)能实现正常的倒计时显示功能。 (3)能实现总体清零功能:计数器由初始状态开始计数,对应状态的指示亮。 (4)能实现特殊状态的功能显示:进入特殊状态时,东西、南北路口均显示红状态。 Verilog HDL作为一种规范的硬件描述语言,被广泛应用于电路的设计中。利用Verilog的设计描述可被不同的工具(包括验证仿真、时序分析、测试分析以及综合)所支持,可用不同器件来实现。而可编程器件的广泛应用,为数字系统的设计带来了极大的灵活性。由于可编程器件可以通过软件编程对硬件的结构和工作方式进行重构,使得硬件的设计可以如同软件设计那样快捷方便。 本文用Verilog HDL设计了一个交通控制系统,主干道交通按绿-黄-红变化,支干道交通按红-绿-黄变化。设计采用了自顶向下的设计方法,首先根据功能将电路分为div(包括div1和div2)、counter、controller、Fenwei(包括Fenwei1和Fenwei2)、demx模块,然后针对每个模块进行开发。利用QuartusII6.0中的仿真工具对每个模块进行仿真,保证功能正确。在此基础上,将所有模块连接起来,形成完整的设计,并用QuartusII6.0中的仿真工具再次仿真。仿真结果表明功能正确,符合设计要求。最后利用QuartusII6.0将程序下载到Altera FPGA芯片EP1C3T144C8中,实际结果表明电路工作正常,满足了设计要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旭旭宝宝和车友车行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值