fpga學習之數碼管顯示

2021-09-02 22:14:33 字數 3392 閱讀 8367

1、設計需求:

設計乙個數碼管驅動電路,是數碼管能夠顯示任意六位數。

2、數碼管原理分析:

現在的數碼管基本都是八段式的,也就是說由八個發光二極體組成的。如圖一所示,這是單個數碼管的原理圖

我們需要二極體顯示數字,只需要控制二極體的亮滅就行。以共陽極數碼管為例(給二極體低電平為點亮二極體),如圖二所示顯示數字與段選關係

數碼管位選如圖三所示,y0~y7表示8位數碼管。1為數碼管有效

**功能實現部分:

module seg_6(

clk,

rst_n,

en,disp_data,

sel,

seg); input clk; //50m

input rst_n;

input en; //數碼管顯示使能,1使能,0關閉

input [23:0]disp_data;

output [5:0] sel;//數碼管位選(選擇當前要顯示的數碼管)

output reg [6:0] seg;//數碼管段選(當前要顯示的內容)

reg [14:0]divider_cnt;//25000-1

reg clk_1k;

reg [5:0]sel_r;

reg [3:0]data_tmp;//資料快取

// 分頻計數器計數模組

always@(posedge clk or negedge rst_n)

if(!rst_n)

divider_cnt <= 15'd0;

else if(!en)

divider_cnt <= 15'd0;

else if(divider_cnt == 24999)

divider_cnt <= 15'd0;

else

divider_cnt <= divider_cnt + 1'b1;

//1k掃瞄時鐘生成模組

always@(posedge clk or negedge rst_n)

if(!rst_n)

clk_1k <= 1'b0;

else if(divider_cnt == 24999)

clk_1k <= ~clk_1k;

else

clk_1k <= clk_1k;

//6位迴圈移位暫存器,實現數碼管的位選

always@(posedge clk_1k or negedge rst_n)

if(!rst_n)

sel_r <= 6'b00_0001;

else if(sel_r == 6'b10_0000)

sel_r <= 6'b00_0001;

else

sel_r <= sel_r << 1;

always@(*)

case(sel_r)

6'b00_0001:data_tmp = disp_data[3:0];

6'b00_0010:data_tmp = disp_data[7:4];

6'b00_0100:data_tmp = disp_data[11:8];

6'b00_1000:data_tmp = disp_data[15:12];

6'b01_0000:data_tmp = disp_data[19:16];

6'b10_0000:data_tmp = disp_data[23:20];

default:data_tmp = 4'b0000;

endcase

always@(*)

case(data_tmp)

4'h0:seg = 7'b1000000;

4'h1:seg = 7'b1111001;

4'h2:seg = 7'b0100100;

4'h3:seg = 7'b0110000;

4'h4:seg = 7'b0011001;

4'h5:seg = 7'b0010010;

4'h6:seg = 7'b0000010;

4'h7:seg = 7'b1111000;

4'h8:seg = 7'b0000000;

4'h9:seg = 7'b0010000;

4'ha:seg = 7'b0001000;

4'hb:seg = 7'b0000011;

4'hc:seg = 7'b1000110;

4'hd:seg = 7'b0100001;

4'he:seg = 7'b0000110;

4'hf:seg = 7'b0001110;

endcase

assign sel = (en)?sel_r:6'b00_0000;

endmodule

****部分

`timescale 1ns/1ns

`define clk_period 20

module seg_6_tb;

reg clk; //50m

reg rst_n;

reg en; //數碼管顯示使能,1使能,0關閉

reg [23:0]disp_data;

wire [5:0] sel;//數碼管位選(選擇當前要顯示的數碼管)

wire [6:0] seg;//數碼管段選(當前要顯示的內容)

seg_6 seg_6(

.clk(clk),

.rst_n(rst_n),

.en(en),

.disp_data(disp_data),

.sel(sel),

.seg(seg)

); initial clk = 1;

always#(`clk_period/2) clk = ~clk;

initial begin

rst_n = 1'b0;

en = 1;

disp_data = 24'h123456;

#(`clk_period*20);

rst_n = 1;

#(`clk_period*20);

#10000000;

disp_data = 24'h876543;

#10000000;

disp_data = 24'h89abcd;

#10000000;

$stop;

endendmodule

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...

數碼管顯示

數碼管顯示 最近因為對突然對電子感興趣,前幾天在路過電子 時買了乙個數碼管。因為以前總是紙上談兵,根本沒實驗過,連數碼見都沒見過,所以開始覺得將這塊數碼管顯示出來是非常具有挑戰性的工作。今天正好有空,拿來了我的數碼管,並在網上看了一些資料,才發現並不是想象中的那麼難,其實更準確的說是太簡單了。不到半...

數碼管顯示

一 區分數碼管的類別 共陰數碼管 即所有數碼管的陰極接在一起。要使某個數碼管點亮,只需置上高電平,中該位置 1 共陽數碼管 即所有數碼管的陽極接在一起。要使某個數碼管點亮,只需置上低電平,中該位置 0 二 單個數碼管顯示 a h 表示單個數碼管上面的8個led。根據共陰共陽的特性,點亮相應的led,...