數碼管顯示是比較簡單的顯示方式,在開發的過程中很多時候能起到驗證和顯示狀態的作用。由於開發最重要的就是實際上手操作,在實戰中慢慢學習verilog的語法細節(之前有學習過vhdl和c)。
數碼管通常是七段數碼管,感覺加點應該算八段,但是習慣於叫它七段數碼管。我使用的板子上是八位的數碼管,板子原理圖如下
為了節約引腳資源,在微控制器開發板中大部分多位的數碼管都是選擇採用鎖存器的方案,fpga則大部分都是直接驅動,這也時fpga和微控制器不同的直觀感受((*^_^*)),我在進行設計的時候,考慮的是八位的數碼管需要實時的顯示我傳進去的資料。所以,在我的數碼管掃瞄顯示模組中需要傳入要顯示的資料。
我設計的每乙個數碼管顯示的範圍是0~9,因此每乙個數碼管顯示資料需要用乙個4位的bcd碼來表示(4位用不完)。大於9的顯示,我預設它為不顯示。
我們模組的傳入資料,
clk——50mhz時鐘
rst——復位訊號
data[31:0]——顯示的資料,8*4
傳出的資料為
odata——輸出的八位共陽極數碼管顯示碼。
duan——掃瞄的數碼位選(拼音打錯了,應該是wei)
module bcd(clk,res,data,odata,duan);
input clk;
input res;
input [31:0] data;
output reg [7:0] odata;
output reg [7:0] duan;
reg [3:0] bcds;
reg [25:0] num_of_clk;
reg hz_100_clk;
always@(posedge clk or negedge res)
begin
if(!res)
begin
num_of_clk <= 26'd0;
hz_100_clk <= 1'b0;
endelse if(num_of_clk < 26'd25_000)
num_of_clk <= num_of_clk + 26'd1;
else
begin
num_of_clk <= 26'd0;
hz_100_clk <= ~hz_100_clk;
endend
always@(posedge hz_100_clk or negedge res)
begin
if(!res)
begin
bcds <= 4'b0000;
duan <= 8'b1111_1110;
endelse
begin
case(duan)
8'b1111_1110:begin bcds<=data[7:4]; duan <= 8'b1111_1101;end
8'b1111_1101:begin bcds<=data[11:8]; duan <= 8'b1111_1011;end
8'b1111_1011:begin bcds<=data[15:12]; duan <= 8'b1111_0111;end
8'b1111_0111:begin bcds<=data[19:16]; duan <= 8'b1110_1111;end
8'b1110_1111:begin bcds<=data[23:20]; duan <= 8'b1101_1111;end
8'b1101_1111:begin bcds<=data[27:24]; duan <= 8'b1011_1111;end
8'b1011_1111:begin bcds<=data[31:28]; duan <= 8'b0111_1111;end
default: begin bcds<=data[3:0];duan <= 8'b1111_1110;end
endcase
endendalways@(*)
begin
case(bcds)
4'b0000:odata <= 8'hc0;
4'b0001:odata <= 8'hf9;
4'b0010:odata <= 8'ha4;
4'b0011:odata <= 8'hb0;
4'b0100:odata <= 8'h99;
4'b0101:odata <= 8'h92;
4'b0110:odata <= 8'h82;
4'b0111:odata <= 8'hf8;
4'b1000:odata <= 8'h80;
4'b1001:odata <= 8'h90;
default:odata <= 8'hff;
endcase
endendmodule
**觀賞性比較差,下一次的筆記會加上注釋和格式的。
我的思路主要是,先分頻,得到100hz的掃瞄頻率,在按數碼管掃瞄的思路,掃瞄顯示。當我把case(bcds)和case(duan)寫在同乙個alway時,它會有乙個週期的延遲。於是就分開寫了。上乙個最後上機圖吧。由於邏輯比較簡單,就沒有加上**波形。
下乙個是關於通訊協議的,應該就大量都是**圖了。
建議該模組再加乙個進製轉換!!!!!!!!!!
FPGA動態掃瞄數碼管
功能 用兩個數碼管顯示0 99的數,每隔一秒加1。由於數碼管的段選段是連在一起的,要想兩個數碼管顯示不一樣的值,就必須動態地掃瞄數碼管。因為人眼地時間解析度是20ms,只要掃瞄數碼管地的週期小於20ms,就可以使用殘影讓數碼管顯示數值,給人的感覺就是數碼管同時顯示了兩個數字。使用到的模組 1.查詢表...
fpga學習之數碼管顯示
1 設計需求 設計乙個數碼管驅動電路,是數碼管能夠顯示任意六位數。2 數碼管原理分析 現在的數碼管基本都是八段式的,也就是說由八個發光二極體組成的。如圖一所示,這是單個數碼管的原理圖 我們需要二極體顯示數字,只需要控制二極體的亮滅就行。以共陽極數碼管為例 給二極體低電平為點亮二極體 如圖二所示顯示數...
FPGA之靜態數碼管顯示實驗
硬體原理圖 硬體介面定義 如下 module seg led static top input sys clk,input sys rst n,output 5 0 seg wei,output 7 0 seg duan wire time flag wire clk time count u ti...