fpga學習日記 數碼管掃描

數碼管顯示是比較簡單的顯示方式,在開發的過程中很多時候能起到驗證和顯示狀態的作用。由於開發最重要的就是實際上手操作,在實戰中慢慢學習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;
	end
	else 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;
	end
	end



always@(posedge HZ_100_CLK or negedge RES)
begin
   if(!RES)
	begin
	BCDS <= 4'b0000;
	DUAN <= 8'b1111_1110;
	end
	
	else
	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
	end
end

always@(*)
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
end
endmodule

代碼觀賞性比較差,下一次的筆記會加上註釋和格式的。

我的思路主要是,先分頻,得到100hz的掃描頻率,在按數碼管掃描的思路,掃描顯示。當我把case(BCDS)和case(DUAN)寫在同一個alway時,它會有一個週期的延遲。於是就分開寫了。上一個最後上機圖吧。由於邏輯比較簡單,就沒有加上仿真波形。

下一個是關於通信協議的,應該就大量都是仿真圖了。

建議該模塊再加一個進制轉換!!!!!!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章