⼩脚丫FPGA(4):数码管显⽰
数码管显⽰
硬件说明
数码管是⼯程设计中使⽤很⼴的⼀种显⽰输出器件。⼀个7段数码管(如果包括右下的⼩点可以认为是8段)分别由a、b、c、d、e、f、g 位段和表⽰⼩数点的dp位段组成。实际是由8个LED灯组成的,控制每个LED的点亮或熄灭实现数字显⽰。通常数码管分为共阳极数码管和共阴极数码管,结构如下图所⽰:
共阴8段数码管的信号端低电平有效,⽽共阳端接⾼电平有效。当共阳端接⾼电平时只要在各个位段上加上相应的低电平信号就可以使相应的位段发光。⽐如:要使a段发光,则在a段信号端加上低电平即可。共阴极的数码管则相反。 可以看到数码管的控制和LED的控制有相似之处,在⼩脚丫STEP-MXO2 V2开发板上有两位共阴极数码管。
数码管扫描原理
⼩脚丫上有两个数码管,这⾥⼗进制计数器模块,然后通过译码模块译码后送到数码管扫描模块扫描
显⽰。
单个数码管采⽤静态显⽰⽅式,数码管被分成a、b、c、d、e、f、g 和⼩数点,每段可以单独控制亮灭,通过点亮不同的段显⽰不同的数字和字符。
对于共阴极的数码管,显⽰数字和字符的编码如下:
对于多位数码管,利⽤视觉暂留原理,快速交替显⽰,让眼睛看上去是多个数码管同时显⽰。
decoder
Verilog实现
设计⼀个6位⼗进制计数器模块,然后通过译码模块译码后送到数码管扫描模块扫描显⽰。
每1s钟,数码管加1显⽰。
seg_top.v
module seg_top(
input clk_in,
input rst_n,
output [1:0] seg_sel,
output [7:0] seg_data0,
output [7:0] seg_data1
);
reg [31:0] timer_cnt;
reg en_1hz;
always @(posedge clk_in or negedge rst_n) begin
if(rst_n == 0)
begin
en_1hz <= 1'b0;
timer_cnt <= 32'd0;
end
else if(timer_cnt >= 32'd12_000_000)
begin
en_1hz <= 1'b1;
timer_cnt <= 32'd0;
end
else
begin
en_1hz <= 1'b0;
timer_cnt <= timer_cnt + 32'd1;
end
end
wire [3:0] count0;
wire t0;
counterB10 counterB10_bit0(
.clk_in(clk_in),
.rst_n(rst_n),
.en(en_1hz),
.clr(1'b0),
.data(count0),
.t(t0)
);
wire [3:0] count1;
counterB10 counterB10_bit1(
.clk_in(clk_in),
.rst_n(rst_n),
.en(t0),
.clr(1'b0),
.data(count1),
.t()
);
wire [6:0] seg_data_0;
seg_decoder seg_decoder_bit0(
.bin_data(count0),
.
seg_data(seg_data_1)
);
wire [6:0] seg_data_1;
seg_decoder seg_decoder_bit1(
.bin_data(count1),
.seg_data(seg_data_0)
);
seg_scan seg_scan_init_u0(
.clk_in(clk_in),
.rst_n(rst_n),
.seg_sel(seg_sel),
.
seg_data0(seg_data0),
.seg_data1(seg_data1),
.seg_data_0({1'b0,seg_data_0}),
.seg_data_1({1'b0,seg_data_1})
);
endmodule
counterB10.v
Port Width Direction Description clk_in1input system clock rst_n1input system reset
en1input counter enable bit clr1input counter clear bit data4output counter data bus t1output counter cin
module counterB10(
input clk_in,
input rst_n,
input en,
input clr,
output reg [3:0] data,
output reg t
);
always @(posedge clk_in or negedge rst_n) begin
if(rst_n == 0)
begin
data <= 4'd0;
t <= 1'b0;
end
else if(clr)
begin
data <= 4'd0;
t <= 1'b0;
end
else if(en)
begin
if(data == 4'd9)
begin
t <= 1'b1;
data <= 4'd0;
end
else
begin
t <= 1'b0;
data <= data + 4'd1;
end
end
else
t <= 1'b0;
end
endmodule
seg_decoder.v

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。