功能:用兩個數碼管顯示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 數碼管原理分析 現在的數碼管基本都是八段式的,也就是說由八個發光二極體組成的。如圖一所示,這是單個數碼管的原理圖 我們需要二極體顯示數字,只需要控制二極體的亮滅就行。以共陽極數碼管為例 給二極體低電平為點亮二極體 如圖二所示顯示數...