LED FPGA 扫描程序

LED
LED FPGA 扫描程序

module LED_SCAN(
input wire clk_100,
input wire nReset,

output	reg [1:0]	LED_CS,
input	wire		Start,
input	wire [(D_LENGTH-1):0]	Hdata,
input	wire [(D_LENGTH-1):0]	Ldata,
//74HC595
output	reg 		nSRCLR, //clear data reg
output	reg 		nG,     //nOE 
output	reg 		RCK,    //data lock
output	reg 		SRCK,   //data clk
output	wire		SER0    //data out

);

parameter D_LENGTH = 8;
//===============================================================
parameter STATE_IDLE = 4’b0001;
parameter STATE_LOCK = 4’b0010;
parameter STATE_DATA = 4’b0100;
parameter STATE_SET = 4’b1000;

parameter STATE_TIMES_LOCK = 12’d8;
parameter STATE_TIMES_DATA = STATE_TIMES_LOCK + D_LENGTH;
parameter STATE_TIMES_SET = STATE_TIMES_DATA + 12’d8;
parameter STATE_TIMES_MAX = 12’d500;//STATE_TIMES_SET + 8’d2;

parameter TIME_595_SRCK = STATE_TIMES_DATA + 12’d4;
parameter TIME_165_nLOAD = 12’d4;

parameter FLITER_NUM = 8’d13; //1ms = 76us * 13

//===============================================================

reg[3:0] state;
reg[11:0] state_cnt;
wire clk_1M;
wire clk_1M_posedge;
wire clk_1M_negedge;
//===============================================================
clk_div clks
(
.sys_clk (clk_100), //100M
.nRst (nReset),

.clk_1M				(clk_1M),
.clk_1M_posedge		(clk_1M_posedge),
.clk_1M_negedge		(clk_1M_negedge)

);

//===============================================================
reg Start_d1;
reg Start_d2;
always@(posedge clk_100)
begin
if(!nReset)begin
Start_d1 <= 1’b0;
Start_d2 <= 1’b0;
end else begin
Start_d1 <= Start;
Start_d2 <= Start_d1;
end
end
//===============================================================
always@(posedge clk_100)
begin
if(!nReset)begin
state_cnt <= 12’d0;
// end else if(Start_d11’b0 && Start_d21’b1)begin //falling
// state_cnt <= 8’d0;
end else if(clk_1M_posedge && state_cnt < STATE_TIMES_MAX)begin
state_cnt <= state_cnt + 1’b1;
end else if(clk_1M_posedge)begin
state_cnt <= 12’d0;
end
end
//===============================================================
always@(posedge clk_100)
begin
if(!nReset)begin
state <= STATE_IDLE;
end else if(clk_1M_negedge)begin
case (state)
STATE_IDLE:
begin
if(state_cnt == 8’d1)begin
state <= STATE_LOCK;
end
end
STATE_LOCK:
begin
if(state_cnt == STATE_TIMES_LOCK)begin
state <= STATE_DATA;
end
end
STATE_DATA:
begin
if(state_cnt == STATE_TIMES_DATA)begin
state <= STATE_SET;
end
end
STATE_SET:
begin
if(state_cnt == STATE_TIMES_SET)begin
state <= STATE_IDLE;
end
end
default:
begin
state <= STATE_IDLE;
end
endcase
end
end
//===============================================================
//TPIC6A595
reg[(D_LENGTH-1):0] shift_595reg;
assign SER0 = (state == STATE_DATA)? shift_595reg[(D_LENGTH-1)] : 1’b0;
//===============================================================
always@(posedge clk_100)
begin
if(!nReset)begin
nSRCLR <= 1’b0;
end else if(state == STATE_IDLE)begin
nSRCLR <= 1’b0;
end else begin
nSRCLR <= 1’b1;
end
end
//===============================================================
always@(posedge clk_100)
begin
if(!nReset)begin
nG <= 1’b1;
end else if(state_cnt == STATE_TIMES_MAX)begin
nG <= 1’b0;
end
end
//===============================================================
reg RCK_d1;
//===============================================================
always@(posedge clk_100)
begin
if(!nReset)begin
RCK <= 1’b0;
end else if(clk_1M_negedge && state_cnt==TIME_595_SRCK)begin
RCK <= 1’b1;
end else if(clk_1M_negedge)begin
RCK <= 1’b0;
end
end

//===============================================================
always@(posedge clk_100)
begin
if(!nReset)begin
LED_CS<=2’b01;
RCK_d1 <= 1’b0;
end else begin
RCK_d1 <= RCK;
if(RCK_d11’b0 && RCK1’b1)begin
LED_CS[0] <= LED_CS[1];
LED_CS[1] <= LED_CS[0];
end
end
end
//===============================================================
always@(posedge clk_100)
begin
if(!nReset)begin
SRCK <= 1’b0;
end else if(state == STATE_DATA)begin
SRCK <= clk_1M;
end else begin
SRCK <= 1’b0;
end
end
//===============================================================
always@(posedge clk_100)
begin
if(!nReset)begin
shift_595reg <= 0;
end else if(clk_1M_negedge && state_cnt == 8’d1 && LED_CS2’b10)begin
shift_595reg <= Ldata;
end else if(clk_1M_negedge && state_cnt == 8’d1 && LED_CS
2’b01)begin
shift_595reg <= Hdata;
end else if(clk_1M_negedge && state == STATE_DATA)begin
shift_595reg[(D_LENGTH-1):1] <= shift_595reg[(D_LENGTH-2):0];
shift_595reg[0] <= shift_595reg[(D_LENGTH-1)];
end
end
//===============================================================

endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值