|
- `timescale 1ns / 1ps
- //////////////////////////////////////////////////////////////////////////////////
- // Company:
- // Engineer:
- //
- // Create Date: 2020/12/05 12:01:14
- // Design Name:
- // Module Name: led_flowing
- // Project Name:
- // Target Devices:
- // Tool Versions:
- // Description:
- //
- // Dependencies:
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //////////////////////////////////////////////////////////////////////////////////
- //由按鍵控制的流水燈左移右移,暫停,復(fù)位功能。
- module led_flowing(clk,led,rst_n,key_1,key_2,key_3
- );
- input clk;
- input rst_n;//復(fù)位按鍵
- input key_1;///控制起停 低電平停止移動,高電平繼續(xù)移動
- input key_2;///控制左移 流水燈左移 按下按鍵為0,控制左移,再按一次停止
- input key_3;//控制右移 流水燈右移 按下按鍵為0,控制右移,再按一次停止
- output reg[3:0] led;//led power on _0 led power off _1 led燈低電平亮,led燈高電平熄滅
- reg [0:0]led_dir; // led left _1 led right _0 該位左移為1,右移為0;
- reg [0:0]led_on; //led on_1 off_0
- reg[31:0] timer_cout; //計數(shù)寄存器
- always@(posedge clk or negedge rst_n) //achieve timer++
-
- begin
- if(rst_n!=1)
- begin
- timer_cout<=32'd0;
-
- end
- else if(timer_cout==32'd49_999_999) //計數(shù)50_000_000次為1秒,時鐘為50Mhz
- begin
- timer_cout<=32'd0;
- end
- else
- begin
- timer_cout<=timer_cout+32'd1;
- end
- end
-
- //
- always@(posedge clk or negedge rst_n)
- begin
- if(rst_n!=1)
- begin
- led<=4'b1110;
- end
- else if((timer_cout==32'd49_999_999)&&(led_on==1)) //led_on==1開啟移位功能
- begin
- if(led_dir==1) // 右移
- begin
- led<={led[0],led[3:1]}; //0,3,2,1,0
- end //1,0,3,2
- else //2,1,0,3
- begin
- led<={led[2:0],led[3]};//2,1,0,3//左移
- end //1,0,3,2,
- end //0,3,2,1,
- end //3,2,1,0
- //3位按鍵程序
- reg [20:1] cnt;
- always@(posedge clk or negedge rst_n)
- begin
- if(rst_n!=1)
- begin
- cnt<=20'd0;
- end
- else
- begin
- cnt<=cnt+20'd1;
- end
- end
- reg[2:0]low_sw;
- always@(posedge clk or negedge rst_n)
- begin
- if (!rst_n)
- begin
- low_sw <= 3'b111;
- end
- else if (cnt== 20'hfffff) //滿20ms,將按鍵值鎖存到寄存器low_sw中cnt == 20'hfffff
- begin
- low_sw <= {key_3,key_2,key_1};
- end
- end
- reg[2:0] low_sw_r;
- always@(posedge clk or negedge rst_n)// 每個時鐘周期的上升沿將low_sw鎖存到low_sw_r中
- begin
- if (!rst_n)
- low_sw_r <= 3'b111;
- else
- low_sw_r <= low_sw;
- end
- wire [2:0]led_ctrl = low_sw_r[2:0]&(~low_sw[2:0]);//////////////關(guān)鍵之處。
- //判斷鍵值與功能
- always @(posedge clk or negedge rst_n)
- if (!rst_n)
- begin
- led_on = 1'b0;
- led_dir = 1'b0;
- end
- else
- begin
- if(led_ctrl[0]) led_on <= ~led_on;
- if(led_ctrl[1]) led_dir <= 1'b1;
- if(led_ctrl[2]) led_dir <= 1'b0;
- end
-
- endmodule
- ////////////////////////////////////////////////////////////////////////////////
復(fù)制代碼
|
|