1. 程式人生 > >FPGA——數碼管動態掃描(verilog)

FPGA——數碼管動態掃描(verilog)

數碼管動態掃描原理——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