FPGA動態掃瞄數碼管

2021-08-30 06:33:34 字數 2994 閱讀 2293

功能:用兩個數碼管顯示0-99的數,每隔一秒加1。

由於數碼管的段選段是連在一起的,要想兩個數碼管顯示不一樣的值,就必須動態地掃瞄數碼管。因為人眼地時間解析度是20ms,只要掃瞄數碼管地的週期小於20ms,就可以使用殘影讓數碼管顯示數值,給人的感覺就是數碼管同時顯示了兩個數字。

使用到的模組:

1.查詢表,將數碼管要顯示的數值翻譯成數碼管的段選訊號,從低位到告位分別對應著hgfedcba

2.分頻模組,每隔1ms掃瞄一次數碼管,所以要乙個1khz的時鐘

3.用1khz的訊號去掃瞄數碼管的位選端

4.獲取相應數碼管的顯示值

5.計數模組,產生0-99

頂層模組**

module test_top(clk_50m,reset,select,seg);

input clk_50m;

input reset;

output [1:0]select;

output[7:0]seg;

reg [7:0]datain;

reg [25:0]cnt;//4999_9999計時1秒

reg [3:0]gewei,shiwei;

//產生datain

always@(posedge clk_50m,negedge reset)

if(!reset)begin

datain<=8'h00;

gewei<=4'h0;

shiwei<=4'h0;

endelse if(cnt==26'd4999_9999) begin

if(shiwei>4'h9 && gewei>4'h9)begin

gewei<=4'h0;

shiwei<=4'h0;

datain<=;

endelse if( gewei>4'h9)begin

gewei<=4'h0;

shiwei<=shiwei+1'b1;

datain<=;

endelse begin

gewei<=gewei+1'b1;

shiwei<=shiwei;

datain[3:0]<=gewei;

endcnt<=26'd0;

endelse begin

shiwei<=shiwei;

gewei<=gewei;

cnt<=cnt+1'b1;

datain<=datain;

endtest0 u0(

.clk_50m(clk_50m),

.reset(reset),

.datain(datain),

.select(select),

.seg(seg)

);endmodule

底層模組**:

module test0(clk_50m,reset,datain,select,seg);

input clk_50m,reset;

input [7:0]datain;

output [1:0]select;

output reg [7:0]seg;

reg [3:0]data_disp;

//分頻時鐘,產生頻率為1k的時鐘

reg [14:0]cnt;//24999

reg clk_1k;

always@(posedge clk_50m,negedge reset)

if(!reset) begin

cnt<=15'd0;

clk_1k<=1'b0;

endelse if(cnt==24999) begin

clk_1k<=~clk_1k;

cnt<=0;

endelse begin

clk_1k<=clk_1k;

cnt<=cnt+1'b1;

end//數碼管的位選

reg [1:0]select_r;

always@(posedge clk_1k,negedge reset)

if(!reset) begin

select_r<=2'b10;

endelse begin

case(select_r)

2'b10:select_r<=2'b01;

2'b01:select_r<=2'b10;

default: select_r<=2'b10;

endcase

endassign select=select_r;

//獲取相應數碼管的顯示值

always@(*)

case(select_r)

2'b10:data_disp=datain[3:0];

2'b01:data_disp=datain[7:4];

default:data_disp=4'h0;

endcase

//將顯示值通過查詢表翻譯成數碼管的段

always@(*)

case(data_disp)

4'h0:seg=8'b11000000;

4'h1:seg=8'b11111001;

4'h2:seg=8'b10100100;

4'h3:seg=8'b10110000;

4'h4:seg=8'b10011001;

4'h5:seg=8'b10010010;

4'h6:seg=8'b10000010;

4'h7:seg=8'b11111000;

4'h8:seg=8'b10000000;

4'h9:seg=8'b10010000;

default:seg=8'b11111111;

endcase

endmodule

這段**還存在的問題:在0-10的顯示過程中,會執行兩輪0-9的顯示,才會顯示10,並且,在整十數顯示的時候,個位先不會有數字顯示,下一秒才顯示0,比如到了29,下一秒就應該顯示30,但是它是十位顯示3,個位不顯示,接下來的一秒,個位才顯示0,不知道是怎麼回事。我找到問題之後再來改正。

fpga學習日記 數碼管掃瞄

數碼管顯示是比較簡單的顯示方式,在開發的過程中很多時候能起到驗證和顯示狀態的作用。由於開發最重要的就是實際上手操作,在實戰中慢慢學習verilog的語法細節 之前有學習過vhdl和c 數碼管通常是七段數碼管,感覺加點應該算八段,但是習慣於叫它七段數碼管。我使用的板子上是八位的數碼管,板子原理圖如下 ...

嵌入式之數碼管動態掃瞄

總結數碼管作為顯示的部件,在小家電中得以廣泛的應用 如果根據乙個數碼管是8位的話,只用單獨的i o來控制,需要用到32 4個i o,顯然這樣比較浪費微控制器的資源。通常條件下,人眼的識別連貫影象的速度是24幀 秒,也就是1000毫秒 24幀,大約為40ms 毫秒 所以我們可以利用這個人眼 影像時,產...

fpga學習之數碼管顯示

1 設計需求 設計乙個數碼管驅動電路,是數碼管能夠顯示任意六位數。2 數碼管原理分析 現在的數碼管基本都是八段式的,也就是說由八個發光二極體組成的。如圖一所示,這是單個數碼管的原理圖 我們需要二極體顯示數字,只需要控制二極體的亮滅就行。以共陽極數碼管為例 給二極體低電平為點亮二極體 如圖二所示顯示數...