FPGA(5)数码管静态显示与动态显示
生活随笔
收集整理的這篇文章主要介紹了
FPGA(5)数码管静态显示与动态显示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
一、數碼管靜態顯示
二、數碼管動態顯示
1、變量定義
2、定時(60us)
3、動態顯示
代碼
一、數碼管靜態顯示
FPGA的數碼管有4位,8段。(位和段都是共陽,即低電平有效)
?
?
位選的4位(二進制):分別為第1、2、3、4位數碼管。
段選的8位(二進制):分別為第h、g、f、e、d、c、b、a段。
下面用4位(所有)數碼管,?顯示數字“1”:
//數碼管(共陽:低電平有效)
//FPGA的數碼管:段選和位選都共陽
module my_and(dig, seg);output wire [3:0] dig; //位選(選定某一個數碼管)
output wire [7:0] seg; //段選(選定一個數碼管上的小段)assign dig = 4'b0000; //位選(0000:4個零,共4個數碼管,全選)assign seg = 8'b1111_1001; //段選(第6、7段為0,顯示的是“1”)endmodule
二、數碼管動態顯示
由于要顯示不同的數字,但是FPGA的數碼管沒辦法單獨操作,只能群操作。
所以只能給每個數碼管不同的頻率,然后依次顯示。
注:這里頻率要給適當:
頻率過快:容易發生混疊;
頻率過慢,變化慢,明顯的流水式顯示。
?頻率過慢(流水式變化):
?
頻率過快(混疊):
?正常頻率:
1、變量定義
module my_and(dig, seg, clk, rst_n);input clk, rst_n;
output reg [7:0] seg; //段選(選定一個數碼管上的小段)
output reg [3:0] dig; //位選(選定某一個數碼管)reg [25:0] cnt;
reg [1:0] wei;
2、定時(60us)
計時到60us,使得位變化一次。?
//定時(60us變化位變化一次)
always@ (posedge clk, negedge rst_n)
begin //按下復位鍵(清空)if(!rst_n) cnt <= 1'b0; //清空else if(cnt != 12'd3000) //60us(3000*20ns=60us)cnt <= cnt + 1'b1;//加1elsebegincnt <= 1'b0; //清空wei <= wei + 1; //位+1end
end
3、動態顯示
這里改變位(dig)和段(seg),段隨位變。?
//動態顯示
always@(*)
begin case(wei)//22'b00: begindig <= 4'b0111;seg <= 8'b1010_0100;end//52'b01:begindig <= 4'b1011;seg <= 8'b1001_0010;end//02'b10:begindig <= 4'b1101;seg <= 8'b1100_0000;end//82'b11:begindig <= 4'b1110;seg <= 8'b1000_0000;endendcase
end
代碼
//數碼管動態顯示(共陽:低電平有效)
//由于要顯示不同的數字,但是FPGA的數碼管沒辦法單獨操作,只能群操作。
//所以只能給每個數碼管不同的頻率,然后依次顯示
//注:這里頻率要給適當,
//頻率過快:容易發生混疊;
//頻率過慢,變化慢,明顯的流水式顯示
/*對照表
4'h0 : seg = 8'hc0; //顯示"0"
4'h1 : seg = 8'hf9; //顯示"1"
4'h2 : seg = 8'ha4; //顯示"2"
4'h3 : seg = 8'hb0; //顯示"3"
4'h4 : seg = 8'h99; //顯示"4"
4'h5 : seg = 8'h92; //顯示"5"
4'h6 : seg = 8'h82; //顯示"6"
4'h7 : seg = 8'hf8; //顯示"7"
4'h8 : seg = 8'h80; //顯示"8"
4'h9 : seg = 8'h90; //顯示"9"
4'ha : seg = 8'h88; //顯示"a"
4'hb : seg = 8'h83; //顯示"b"
4'hc : seg = 8'hc6; //顯示"c"
4'hd : seg = 8'ha1; //顯示"d"
4'he : seg = 8'h86; //顯示"e"
4'hf : seg = 8'h8e; //顯示"f"
*/
module my_and(dig, seg, clk, rst_n);input clk, rst_n;
output reg [7:0] seg; //段選(選定一個數碼管上的小段)
output reg [3:0] dig; //位選(選定某一個數碼管)reg [25:0] cnt;
reg [1:0] wei;//定時(60us變化位變化一次)
always@ (posedge clk, negedge rst_n)
begin //按下復位鍵(清空)if(!rst_n) cnt <= 1'b0; //清空else if(cnt != 12'd3000) //60us(3000*20ns=60us)cnt <= cnt + 1'b1;//加1elsebegincnt <= 1'b0; //清空wei <= wei + 1; //位+1end
end//動態顯示
always@(*)
begin case(wei)//22'b00: begindig <= 4'b0111;seg <= 8'b1010_0100;end//52'b01:begindig <= 4'b1011;seg <= 8'b1001_0010;end//02'b10:begindig <= 4'b1101;seg <= 8'b1100_0000;end//82'b11:begindig <= 4'b1110;seg <= 8'b1000_0000;endendcase
endendmodule
總結
以上是生活随笔為你收集整理的FPGA(5)数码管静态显示与动态显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FPGA(4)晶振与计数器 -- 实现定
- 下一篇: 奇葩错误 -- modelsim波形显示