一個帶小數點的數碼管的所有8個發光二極管的正極或負極有一個公共端,通常必須接GND(共陰極數碼管)或者接VCC(共陽極數碼管),而另一個非公共端的8個引腳就留給用戶的I/O直接控制了。
所以,你做實驗之前要明白自己的開發板的數碼管是共陽極的還是共陰極的,由于板子是師兄留給我的,我就不知道我的板子是共陽極的還是供陰極的,所以顯示數字出現亂碼時,我就花了很長時間確定是共陽極的還是共陰極的,亂碼是這個原因還是引腳約束出問題了等等,很煩惱,當然,最后成功的顯示數字之后,心里還是很舒服的。
我的Spartan-6 FPGA開發板中的數碼管是共陽極的,因此段選是低電平有效,也就是低電平時,每一段對應的發光二極管點亮。
如下圖是數碼管的示意圖:
如果是共陰極的,那么譯碼表為:
每個數字或字符的編碼是怎么得到的呢?
如下表:
上表舉了0、1這兩個數字的編碼方式,應該很明白了吧,從dot開始到a,依次編碼,亮為1,滅為0,如此規律,可以找到各個數字或字符對應的16進制編碼,該16進制編碼最高位賦值給dot,然后是g、f依次到a,這樣的話,就應該到時候分配引腳的時候,dot引腳對應的編碼位數是最高位,a引腳對應的是編碼位數的最低位。
不明白這一點,弄錯了,就會出現亂碼。
上面說的是共陰極的情況,那么共陽極的情況呢?對應的編碼是多少呢?
可知根據規律自己推,這里就直接給出了:
下面說說這個實驗的要求,由于只是初步了解數碼管的段選片選,所以就不要求那么復雜了,相對簡單一些:
看看你的開發板上有幾個數碼管,讓它們同時顯示數字從0 到 F。
下面給出我的FPGA設計的Verilog HDL硬件描述語言:
這個代碼是特權同學的,我改動了下,適應我的FPGA開發板,(數碼管是共陽極的,片選是低電平有效,8個數碼管。)
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 14:03:17 08/17/2018
// Design Name:
// Module Name: leg_seg7
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module led_seg7(
clk,rst_n,
sm_cs1_n,sm_db
);
input clk; // 50MHz
input rst_n; // 復位信號,低有效
output[7:0] sm_cs1_n; //數碼管片選信號,低有效
output[7:0] sm_db; //8段數碼管(包括小數點)
reg[24:0] cnt; //計數器,最大可以計數到2的25次方*20ns=640ms
always @ (posedge clk or negedge rst_n)
if(!rst_n) cnt 《= 25‘d0;
else cnt 《= cnt+1’b1; //循環計數
reg[3:0] num; //顯示數值
always @ (posedge clk or negedge rst_n)
if(!rst_n) num 《= 4‘d0;
else if(cnt == 25’h1ffffff) num 《= num+1‘b1; //每640ms增一
//-------------------------------------------------------------------------------
/* 共陽級 :帶小數點
;0, 1, 2, 3, 4, 5, 6, 7,
db C0, F9, A4, B0, 99, 92, 82, F8
;8, 9, a, b, c, d, e, f , 滅
db 80, 90, 88, 83, C6, A1, 86, 8E, ff*/
parameter seg0 = 7’hC0,
seg1 = 7‘hF9,
seg2 = 7’hA4,
seg3 = 7‘hB0,
seg4 = 7’h99,
seg5 = 7‘h92,
seg6 = 7’h82,
seg7 = 7‘hF8,
seg8 = 7’h80,
seg9 = 7‘h90,
sega = 7’h88,
segb = 7‘h83,
segc = 7’hC6,
segd = 7‘hA1,
sege = 7’h86,
segf = 7‘h8E;
reg[7:0] sm_dbr; //8段數碼管(包括小數點)
always @ (num)
case (num) //NUM值顯示在數碼管上
4’h0: sm_dbr 《= seg0;
4‘h1: sm_dbr 《= seg1;
4’h2: sm_dbr 《= seg2;
4‘h3: sm_dbr 《= seg3;
4’h4: sm_dbr 《= seg4;
4‘h5: sm_dbr 《= seg5;
4’h6: sm_dbr 《= seg6;
4‘h7: sm_dbr 《= seg7;
4’h8: sm_dbr 《= seg8;
4‘h9: sm_dbr 《= seg9;
4’ha: sm_dbr 《= sega;
4‘hb: sm_dbr 《= segb;
4’hc: sm_dbr 《= segc;
4‘hd: sm_dbr 《= segd;
4’he: sm_dbr 《= sege;
4‘hf: sm_dbr 《= segf;
default: ;
endcase
assign sm_db = sm_dbr;
assign sm_cs1_n = 8’b0000_0000; //數碼管常開
endmodule
對上述代碼需要解釋的是片選信號有8個,低電平有效,我把8個數碼區的片選全部賦值為0了,這樣8個數碼管就全部有效,同步顯示0到F.(片選的意思是選擇哪一個數碼管有效)
這是我的數碼管的電路圖:
更多關于BJ-EPM240學習板之數碼管顯示實驗請看視頻。
-
FPGA
+關注
關注
1629文章
21735瀏覽量
603150 -
數碼管
+關注
關注
32文章
1882瀏覽量
91093
發布評論請先 登錄
相關推薦
評論