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