FPGA——數碼管動態掃描(verilog)
阿新 • • 發佈:2019-01-05
數碼管動態掃描原理——FPGA程式碼
1、動態掃描是利用人眼視覺滯留的特點,點亮某一位後,在人眼反應之前,進行下一位的顯示,故而出現重影現象。而人的視覺暫留時間大約在1/24秒左右,所以應該保持24幀以上才會保持連續而不會出現閃爍,通俗來講,應該在一秒內至少掃描24次。也就是每次掃描時間至少小於40ms 。
2、注意數碼管的響應時間,一般為納秒級,故掃描時間也不能太短。
3、本例使用四段數碼管,50m時鐘輸入,以下為載板測試後的程式碼。
/*
* Title: <FPGA數碼管動態掃描>
* description:
* @author: fateszs
* @data: 2017.12.07
*
*/
module hex_hum_tem(
output [3:0]duan,
output [3:0]wei,
input reset,
input clock_50m,
input [15:0]data
);
reg clock_25m;
[email protected](posedge clock_50m , negedge reset)
begin
if(!reset)
clock_25m <= 0;
else
clock_25m <= ~clock_25m;
end
//計數器,約為10ms掃描一次
reg [17:0] cnt;
always @(posedge clock_25m , negedge reset)
begin
if(!reset)
cnt <=0;
else if(cnt == 18'b111111111111111111)
cnt <= 18'b0;
else
cnt <= cnt+1;
end
//數碼管位選
reg [3:0] wei_r,num ;
always @(posedge clock_25m , negedge reset)
begin
if(!reset)
begin
wei_r <= 4'b1111;
num <= 0;
end
else
case(cnt[17:16])
2'b00:
begin wei_r<=4'b1110; num <= data[3:0]; end
2'b01:
begin wei_r<=4'b1101; num <= data[7:4]; end
2'b10:
begin wei_r<=4'b1011; num <= data[11:8]; end
2'b11:
begin wei_r<=4'b0111; num <= data[15:12]; end
default:
begin wei_r<=4'b1111; num <= 0; end
endcase
end
assign wei = wei_r;
//數碼管段選
reg [3:0]duan_r ;
[email protected](posedge clock_25m , negedge reset)
begin
if(!reset)
duan_r <= 4'b0000;
else
case(num)
4'd9 : duan_r <= 4'b1001;
4'd8 : duan_r <= 4'b1000;
4'd7 : duan_r <= 4'b0111;
4'd6 : duan_r <= 4'b0110;
4'd5 : duan_r <= 4'b0101;
4'd4 : duan_r <= 4'b0100;
4'd3 : duan_r <= 4'b0011;
4'd2 : duan_r <= 4'b0010;
4'd1 : duan_r <= 4'b0001;
4'd0 : duan_r <= 4'b0000;
default : duan_r <= 4'b0000;
endcase
end
assign duan = duan_r;
endmodule