## 数码管显示
本实验将会让你熟悉小脚丫上最后一种有意思的外设七段数码管。
\\
### 1. 硬件说明
数码管是工程设计中使用很广的一种显示输出器件。一个7段数码管(如果包括右下的小点可以认为是8段)分别由a、b、c、d、e、f、g位段和表示小数点的dp位段组成。实际是由8个LED灯组成的,控制每个LED的点亮或熄灭实现数字显示。通常数码管分为共阳极数码管和共阴极数码管,结构如下图所示:
{{ :数码管.jpg |共阳极、共阴极数码管}}
**图1 共阳极、共阴极数码管**
共阴8段数码管的信号端低电平有效,而共阳端接高电平有效。当共阳端接高电平时只要在各个位段上加上相应的低电平信号就可以使相应的位段发光。比如:要使a段发光,则在a段信号端加上低电平即可。共阴极的数码管则相反。
可以看到数码管的控制和LED的控制有相似之处,在[[STEP-Max10|小脚丫STEP-Max10]]开发板上有两位共阴极数码管,
\\
{{ :undefined:7segment.png |}}
\\
数码管所有的信号都连接到FPGA的管脚,作为输出信号控制。FPGA只要输出这些信号就能够控制数码管的那一段LED亮或者灭。这样我们可以通过开关来控制FPGA的输出,和[[Altera_3ymq|3-8译码器]]实验一样,通过组合逻辑的输出来控制数码管显示数字,下面是数码管显示的表格:
\\
{{ ::timg.jpg |}}
\\
这其实是一个4-16译码器,如果我们想数码管能显示16进制可以全译码,如果只想显示数字,可以只利用其中10个译码,下面看看如果用Verilog来实现。
### 2. Verilog代码
// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name : segment.v
// Module name : segment
// Author : STEP
// Description : segment initial
// Web : www.stepfpga.com
//
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date: |Changes Made:
// V1.0 |2017/03/02 |Initial ver
// --------------------------------------------------------------------
// Module Function:数码管的译码模块初始化
module segment (seg_data_1,seg_data_2,seg_led_1,seg_led_2);
input [3:0] seg_data_1; //数码管需要显示0~9十个数字,所以最少需要4位输入做译码
input [3:0] seg_data_2; //小脚丫上第二个数码管
output [8:0] seg_led_1; //在小脚丫上控制一个数码管需要9个信号 MSB~LSB=DIG、DP、G、F、E、D、C、B、A
output [8:0] seg_led_2; //在小脚丫上第二个数码管的控制信号 MSB~LSB=DIG、DP、G、F、E、D、C、B、A
reg [8:0] seg [9:0]; //定义了一个reg型的数组变量,相当于一个10*9的存储器,存储器一共有10个数,每个数有9位宽
initial //在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initial
//initial和always不同,其中语句只执行一次
begin
seg[0] = 9'h3f; //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字 0
seg[1] = 9'h06; //7段显示数字 1
seg[2] = 9'h5b; //7段显示数字 2
seg[3] = 9'h4f; //7段显示数字 3
seg[4] = 9'h66; //7段显示数字 4
seg[5] = 9'h6d; //7段显示数字 5
seg[6] = 9'h7d; //7段显示数字 6
seg[7] = 9'h07; //7段显示数字 7
seg[8] = 9'h7f; //7段显示数字 8
seg[9] = 9'h6f; //7段显示数字 9
end
assign seg_led_1 = seg[seg_data_1]; //连续赋值,这样输入不同四位数,就能输出对于译码的9位输出
assign seg_led_2 = seg[seg_data_2];
endmodule
### 3. 引脚分配
小脚丫上正好有4路按键和4路开关,可以用来作为输入信号分别控制数码管的输出。按照下面表格定义输入输出信号
\\
^信号 ^引脚 ^信号 ^引脚 ^
|seg_data_1(0) |J12 |seg_data_2(0) |J9 ^
|seg_data_1(1) |H11 |seg_data_2(1) |K14 ^
|seg_data_1(2) |H12 |seg_data_2(2) |J11 ^
|seg_data_1(3) |H13 |seg_data_2(3) |J14 ^
\\
^信号 ^引脚 ^信号 ^引脚 ^
|seg_led_1(0) |E1 |seg_led_2(0) |A3 ^
|seg_led_1(1) |D2 |seg_led_2(1) |A2 ^
|seg_led_1(2) |K2 |seg_led_2(2) |P2 ^
|seg_led_1(3) |J2 |seg_led_2(3) |P1 ^
|seg_led_1(4) |G2 |seg_led_2(4) |N1 ^
|seg_led_1(5) |F5 |seg_led_2(5) |C1 ^
|seg_led_1(6) |G5 |seg_led_2(6) |C2 ^
|seg_led_1(7) |L1 |seg_led_2(7) |R2 ^
|seg_led_1(8) |E2 |seg_led_2(8) |B1 ^
\\
配置好以后编译下载程序。这样可以通过按键或者开关来控制相应的数码管显示数字。如果你想显示16进制的AbCDeF在数码管,可以试试修改程序。这时候一定要定义一个16*9的存储器来初始化。
\\
### 4. 小结
了解了小脚丫数码管的工作原理,在下个实验我们将进行到有趣的时序逻辑。首先是如何控制[[Altera_5clk|时钟分频]]。