FPGA 双向红绿灯
  1YQZUCUR1XeB 2023年11月02日 79 0

设计思路:使用fpga模拟双向红绿灯,也就是模拟实际路上红绿灯每个灯的亮灭程度:比如第一个红灯亮时,第二个灯的绿灯就亮,然后接着第二个灯的绿灯转为黄灯并闪烁时,第一个红灯转为绿灯,第二个灯转为红灯,依此类推。。。。。

设计思路图如下:

FPGA 双向红绿灯_交通灯

如上图所示,在0到1s时为空闲状态,在1s到4s时,是下方的绿灯和上方的红灯同时亮,在4s到5s时,下方的绿灯改为黄灯,并控制黄灯闪烁(可以更为真实的模拟红绿灯的状态),同时上方的红灯继续亮,在第5s到第8s时,上方的红灯改为绿灯,下方的黄灯改为红灯,在第8s到第9s时,上方的绿灯改为黄灯并控制黄灯闪烁,而下方的红灯保持不变。

伪代码如下:

parameter	DELAY_CNT_MAX	=	225000000 - 1;                //9秒
parameter one_times = 25000000 - 1;                         //1秒
parameter four_times = 75000000 - 1 + 25000000;            //4秒
parameter five_times = 75000000 + 25000000 + 25000000 - 1;              //5秒
parameter seven_times = 75000000 + 2500000 + 25000000 + 25000000 + 25000000 - 1;           //7秒
parameter eigtht_times = 75000000 + 25000000 + 75000000  + 25000000 - 1;           //8秒
parameter nine_times = DELAY_CNT_MAX;            //9秒
reg one_times_flag     ;
reg four_times_flag     ;
reg five_times_flag     ;
reg seven_times_flag    ;
reg eigtht_times_flag   ;
reg nine_times_flag     ;
reg [31:0]times_cnt;
always@(posedge i_clk or negedge i_rst_n)
    if(!i_rst_n)
        begin
            times_cnt <= 0;
        end
    else if(times_cnt == DELAY_CNT_MAX)
        times_cnt <= 0;
    else
        times_cnt <= times_cnt + 1'b1;
parameter S0 = 8'b0000_0001;
parameter S1 = 8'b0000_0010;
parameter S2 = 8'b0000_0100;
parameter S3 = 8'b0000_1000;
parameter S4 = 8'b0001_0000;
reg [7:0]state;
always@(posedge i_clk or negedge i_rst_n)
    if(!i_rst_n)
        begin
        one_times_flag  <= 0;
        four_times_flag  <= 0;
        five_times_flag <= 0;
        seven_times_flag <= 0;
        eigtht_times_flag <= 0; 
        nine_times_flag <= 0; 
        state <= S0;
        end
    else
    begin
        case(state)
        S0:
            begin
            one_times_flag <= 1'b1;
            if(times_cnt == one_times)
                state <= S1;
            end
        S1:
            begin
            if(times_cnt == four_times)
                begin
                    one_times_flag <= 0;
                    four_times_flag <= 1'b1;
                    state <= S2;
                end    
            end
        S2:
            begin
            if(times_cnt == five_times)
                begin
                    four_times_flag <= 0;
                    five_times_flag <= 1'b1;
                    state <= S3;
                end    
            end
        S3:
            begin
            if(times_cnt == eigtht_times)
                begin
                    five_times_flag <= 0;
                    eigtht_times_flag <= 1'b1;
                    state <= S4;
                end    
            end
        S4:
            begin
            if(times_cnt == nine_times)
                begin
                    eigtht_times_flag <= 0;
                    nine_times_flag <= 1'b1;
                    state <= S0;
                end    
            end
        default:
            begin
                one_times_flag      <=    one_times_flag   ;
                four_times_flag     <=    four_times_flag  ;
                five_times_flag     <=    five_times_flag  ;
                seven_times_flag     <=   seven_times_flag ;
                eigtht_times_flag   <=    eigtht_times_flag;
                nine_times_flag     <=    nine_times_flag  ;
            end
        endcase
reg	[2:0]	led_left;	// 3个LED的亮灭状态
reg	[2:0]	led_right;	// 3个LED的亮灭状态
always@(posedge i_clk or negedge i_rst_n)
begin
    if(!i_rst_n)
    begin
        led_left <= 0;
        led_right <= 0;
    end
    else
    begin
        if(one_times_flag)
            begin
                led_left <= 3'b100;
                led_right <= 3'b100;
            end
        else if(four_times_flag)
            begin
                led_left <= 3'b100;
                led_right <= 3'b010;
            end
        else if(five_times_flag)
            begin
                led_left <= 3'b010;
                led_right <= 3'b001;
            end
        else if(eigtht_times_flag)
            begin
                led_left <= 3'b001;
                led_right <= 3'b001;
            end
    end 
end
reg [23:0]cnt;
reg flag1;
reg flag2;
always @(posedge i_clk or negedge i_rst_n)
    if(!i_rst_n)
        cnt <= 0;
    else if(cnt == one_times / 6)
        cnt <= 0;
    else 
        cnt <= cnt + 1'b1;
 
always @(posedge i_clk or negedge i_rst_n)
    if(!i_rst_n)
        flag1 <= 0;
    else if(led_left[0] == 1'b1)
        begin
            if(cnt == one_times / 6)
                flag1 <= 1'b1;
            else 
                flag1 <= 0;
        end
always @(posedge i_clk or negedge i_rst_n)
    if(!i_rst_n)
        flag2 <= 0;
    else if(led_right[1] == 1'b1)
        begin
            if(cnt == one_times / 6)
                flag2 <= 1'b1;
            else 
                flag2 <= 0;
        end
reg led_3_temp;
always @(posedge i_clk or negedge i_rst_n)
    if(!i_rst_n)
        led_3_temp <= 0;
    else if(led_right[1] == 1'b1)
        begin
            if(flag2 == 1'b1)
                led_3_temp <= ~led_3_temp;
            else 
                led_3_temp <= led_3_temp ;
        end
always @(posedge i_clk )
begin
    if(led_3_temp == 1'b1)
        led1_rgb <= 48'hFFFF_8FFF_0000;
    else
        led1_rgb <= 48'b0;
end
reg led_1_temp;
always @(posedge i_clk or negedge i_rst_n)
    if(!i_rst_n)
        led_1_temp <= 0;
    else if(led_left[0] == 1'b1)
    begin
        if(flag1 == 1'b1)
            led_1_temp <= ~led_1_temp;
        else if(flag1 == 0)
            led_1_temp <= led_1_temp;
    end
always @(posedge i_clk)
begin
    if(led_1_temp == 1'b1)
        led3_rgb <= 48'hFFFF_8FFF_0000;
    else
        led3_rgb <= 48'b0;
end      
//根据led对应位的高低电平,指定LED灯的颜色输出
assign	led0_rgb	 = (led_right[0] == 1'b1) ? 48'hFFFF_0000_0000 : 48'b0; // 输出RED颜色给LED0
//assign	led1_rgb	 = (led_right[1] == 1'b1) ? 48'hFFFF_FFFF_0000 : 48'b0; // 输出YELLOW颜色给LED1      !!!
assign	led2_rgb	 = (led_right[2] == 1'b1) ? 48'h0000_FFFF_0000 : 48'b0; // 输出GREEN颜色给LED2
//assign	led3_rgb	 = (led_left[0] == 1'b1) ? 48'hFFFF_FFFF_0000 : 48'b0; // 输出YELLOW颜色给LED3       !!!
assign	led4_rgb	 = (led_left[1] == 1'b1) ? 48'h0000_FFFF_0000 : 48'b0; // 输出GREEN颜色给LED4
assign	led5_rgb	 = (led_left[2] == 1'b1) ? 48'hFFFF_0000_0000 : 48'b0; // 输出RED颜色给LED5
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  1YQZUCUR1XeB   2023年11月02日   80   0   0 Verilog
  1YQZUCUR1XeB   2023年11月12日   33   0   0 串口通信Verilog
  1YQZUCUR1XeB   2023年11月02日   44   0   0 VerilogDDS
  1YQZUCUR1XeB   2023年11月02日   80   0   0 Verilog交通灯
1YQZUCUR1XeB