标题:
FPGA控制呼吸灯
[打印本页]
作者:
栀子忍冬艳蔷薇
时间:
2021-3-26 22:13
标题:
FPGA控制呼吸灯
//`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////////
//// Company:
//// Engineer:
////
//// Create Date: 2020/12/14 19:22:24
//// Design Name:
//// Module Name: led_breath
//// Project Name:
//// Target Devices:
//// Tool Versions:
//// Description:
////
//// Dependencies:
////
//// Revision:
//// Revision 0.01 - File Created
//// Additional Comments:
////
////////////////////////////////////////////////////////////////////////////////////
//module led_breath(
// input i_sys_clk, //输入时钟
// input i_sys_rst_n,
// output [3:0] o_led
// );
// /* 计数器r_cnt_2us循环计数,计到99为2us */ //计数r_cnt_2us 计数器
// parameter p_cnt_2us_max = 7'd100 - 1'b1;
// reg [7:0] r_cnt_2us = 7'b0;
// always @(posedge i_sys_clk or negedge i_sys_rst_n)
// begin
// if (i_sys_rst_n == 1'b0)
// r_cnt_2us <= 7'd0;
// else if(r_cnt_2us == p_cnt_2us_max)
// r_cnt_2us <= 7'd0;
// else
// r_cnt_2us <= r_cnt_2us + 1'b1;
// end
// /* 计数器r_cnt_2ms,每2us加一,计到999为2ms */ //计数r_cnt_2ms
// parameter p_cnt_2ms_max = 10'd1000 - 1'b1;
// reg [9:0] r_cnt_2ms = 10'b0;
// always @(posedge i_sys_clk or negedge i_sys_rst_n)
// begin
// if (i_sys_rst_n == 1'b0)
// r_cnt_2ms <= 10'd0;
// else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max)
// r_cnt_2ms <= 10'd0;
// else if(r_cnt_2us == p_cnt_2us_max)
// r_cnt_2ms <= r_cnt_2ms + 1'b1;
// else
// r_cnt_2ms = r_cnt_2ms;
// end
// /* 计数器r_cnt_2s,每2ms加一,计到999为2s */ //计数r_cnt_2s 计数
// parameter p_cnt_2s_max = 10'd1000 - 1'b1;
// reg [9:0] r_cnt_2s = 10'b0;
// reg [3:0] r_led = 4'b0;
// always @(posedge i_sys_clk or negedge i_sys_rst_n)
// begin
// if (i_sys_rst_n == 1'b0)
// r_cnt_2s <= 10'd0;
// else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max && r_cnt_2s == p_cnt_2s_max)
// r_cnt_2s <= 10'd0;
// else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max)
// r_cnt_2s <= r_cnt_2s + 1'b1;
// else
// r_cnt_2s <= r_cnt_2s;
// end
// /* r_flag标志 */
// reg r_flag = 1'b0;
// always @(posedge i_sys_clk or negedge i_sys_rst_n)
// begin
// if (i_sys_rst_n == 1'b0)
// r_flag <= 1'b0;
// else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max && r_cnt_2s == p_cnt_2s_max)
// r_flag <= ~r_flag;
// else
// r_flag <= r_flag;
// end
// /* control */
// always @(posedge i_sys_clk or negedge i_sys_rst_n)
// begin
// if (~i_sys_rst_n)
// r_led <= 4'b0000;
// else if (r_cnt_2s >= r_cnt_2ms && r_flag == 1'b0) //2s>两毫秒,0
// r_led <= 4'b1111;
// else if (r_cnt_2s < r_cnt_2ms && r_flag == 1'b0) //2s<2ms,0
// r_led <= 4'b0000;
// else if (r_cnt_2s >= r_cnt_2ms && r_flag == 1'b1) // 2s>2ms, 1
// r_led <= 4'b0000;
// else if (r_cnt_2s < r_cnt_2ms && r_flag == 1'b1) // 2s<2ms, 1
// r_led <= 4'b1111;
// else
// r_led <= 4'b0000;
// end
// /* 信号输出 */
// assign o_led = r_led;
// endmodule
`timescale 1ns/1ps
module led_breath(
clk,led,rst
);
input clk;
input rst;
output reg[3:0] led;
parameter p_2us_max=32'd100-32'd1;
parameter p_2ms_max=32'd1000-32'd1;
parameter p_2s_max=32'd1000-32'd1;
reg [32:1]cnt_2us;//2us计数器计数计到99次,2ms计数器加1
always@(posedge clk or negedge rst)
begin
if(rst!=1)
cnt_2us<=32'd0;
else if(cnt_2us==p_2us_max)
cnt_2us<=32'd0;
else
cnt_2us<=cnt_2us+32'd1;
end
reg[32:1] cnt_2ms; //2ms 计数器计数计到999次,2s计数器加1
always@(posedge clk or negedge rst)
begin
if(rst!=1)
cnt_2ms<=32'd0;
else if(cnt_2ms==p_2ms_max&&cnt_2us==p_2us_max)
cnt_2ms<=32'd0;
else if(cnt_2us==p_2us_max)
cnt_2ms<=cnt_2ms+32'd1;
else
cnt_2ms<=cnt_2ms;
end
reg[32:1] cnt_2s; //2s计数器计计到999次,清零,重新计数
always@(posedge clk or negedge rst)
begin
if(rst!=1)
cnt_2s<=32'd0;
else if(cnt_2s==p_2s_max&&cnt_2ms==p_2ms_max&&cnt_2us==p_2us_max)
cnt_2s<=32'd0;
else if(cnt_2us==p_2us_max&&cnt_2ms==p_2ms_max)
cnt_2s<=32'd1+cnt_2s;
else
cnt_2s<=cnt_2s;
end
//always@(posedge clk or negedge rst)
//begin
//if(rst!=1)
// led<=4'b0000;
//else if(cnt_2s>=cnt_2ms)
//led<=4'b1111;
//else if(cnt_2s<cnt_2ms)
//led<=4'b0000;
//else
//led<=4'b0000;
//end
reg flag;// 定义标志位
always@(posedge clk or negedge rst)
begin
if(rst!=1)
flag<=1'b0;
else if(cnt_2s==p_2s_max&&cnt_2ms==p_2ms_max&&cnt_2us==p_2us_max)
flag<=~flag;
else
flag<=flag;
end
//led由亮变暗的过程
//always@(posedge clk or negedge rst)
//begin
//if(rst!=1)
//led<=4'b0000;
//else if(cnt_2s>=cnt_2ms)
//led<=4'b1111;
//else if(cnt_2s<cnt_2ms) //灭到亮的过程
//led<=4'b0000;
//else
//led<=4'b0000;
//end
//利用标志位来判断亮暗的过程
always@(posedge clk or negedge rst)
begin
if(rst!=1)
led<=4'b0000;
else if(cnt_2s>=cnt_2ms&&flag==1'b0)
led<=4'b1111;
else if(cnt_2s<cnt_2ms&&flag==1'b0)
led<=4'b0000;
else if(cnt_2s>=cnt_2ms&&flag==1'b1)
led<=4'b0000;
else if(cnt_2s<cnt_2ms&&flag==1'b1)
led<=4'b1111;
end
endmodule
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1