第四章 数码管的
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
演
一 简介
下面我们来学习第一个真正的硬件例程,看看数码管给我们带来了什么精彩内容。
二 建立 PIO模块
首先,打开 Quartus II 10.0,File->Open Project。选择.qpf文件,我选的是
D:\altera\10.0sp1\niosShow\niosShow.qpf
在软核部分添加,Tools->SOPC Builder。
如下图所示,双击选择 PIO。
如下图红框处修改,点击 Finish。
如下图,PIO已经添加好,将其重命名为 pio_7SEG。
点击 System->Auto-Assign Base Addresses
点击 Generate按钮,进行编译。
休息一下~~
再次看到 System generation war successful.
OK,PIO部分结束了。
三 数码管软件部分
1 原理
在开发板上有一个 7x4数码管,即 4个独立的数码管,每个数码管由 7个发光管组成,
加上小数点,每一个数码管一共有 8个发光管,如下面的原理图。
图中 SINK1~4分别控制数码管 1-4与电源是否连通。以图中数码管 1为例,当 SINK4
为低电平,PNP三极管 BC807 导通,则七段数码管 1与电源 VCC3.3 联通,否则七段数码
管 1与电源 VCC3.3断开。
SEG_A\B\F\E\D\P\C\G分别一个具体的发光管。当 SEG_A\B\F\E\D\P\C\G为高电平时,
相应的发光管被点亮。以图中数码管 1为例,当 SINK4为低电平,SEG_A为高电平时,七
段数码管 1的 a被点亮。
FPGA_TX
FPGA_RX
FPGA_CTS
FPGA_RTS
SINK4
SINK3
SINK2
SINK1
S
EG
_F
S
EG
_A
S
EG
_E
S
EG
_D
S
EG
_P
S
EG
_C
S
EG
_G
S
EG
_B
J8_D1
J8_D4
J8_D2
J8_D3
T803
BC807
C
3
B
1
E
2
T804
BC807
C
3
B
1
E
2
T801
BC807
C
3
B
1
E
2
T802
BC807
C
3
B
1
E
2
a
b
c
d
e
f
g
DP
a
e
DP
c
d
f
g
b
1 2
a
f
4
c c
f
a
b b
g
e
dDPd DP
e
3
g
U802
4X7SEG MT03641BR
VC
C
3
2
b
1
e
7
VC
C
2
3
VC
C
1
6
f
4
c
10
D
P
9
d
8
a
5
g
11
V
C
C
4
12
VCC3V3
VCC5V
J8_D9
J8_D16
J8_D12
J8_D18
J8_D4
J8_D8
VCC3V3
VCC3V3
J8_D7
J8_D15
J8_D11
J8_D2
VCC5V
VCC3V3
J8_D3
J8_D17
J8_D16
J8_D14
J8_D13
J8_D15
J8_D7
J8_D6
J8_D17
J8_D9
J8_D0
VCC5V
J8_D11
J8_D13
J8_D6
J8_D10
J8_D5
J801HEADER 25X2
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44
46
48
50
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
31
33
35
37
39
41
43
45
47
49
51 52
VCC5V
J8_D12
J8_D1
J8_D14
J8_D0
J8_D10
VCC3V3
J8_D8
J8_D18
J8_D5
G802
GNPORT
G
N
D
1
G801
GNPORT
G
N
D
1
RN802
22
R1 1
R2 2
R3 3
R4 445
36
27
18
RN804
1K
R1
1R2
2R3
3R4
4
4
5
3
6
2
7
1
8
RN803
22
R1
1
R2
2
R3
3
R4
4
4
53
62
71
8
SEG_D
SEG_P
SEG_C
SEG_G
SEG_B
SEG_F
SEG_A
SINK4
SINK3
SEG_E
SINK2
SINK1
2 具体操作
首先我们需要建立一个 Header File,如下图所示。
给文件命名,然后点击 Finish按钮。
SevenSegment.h代码如下:
/*
* SevenSegment.h
*
* Created on: 2010-10-22
* Author: www.fpgastudy.com
*/
#ifndef SEVENSEGMENT_H_
#define SEVENSEGMENT_H_
#include "system.h"
typedef struct
{
unsigned int data;
unsigned int direction;
unsigned int interrupt_mask;
unsigned int edge_capture;
} PIO_STR;
#define SevenSegment ((PIO_STR*)PIO_7SEG_BASE)
#endif /* SEVENSEGMENT_H_ */
main.c代码如下:
#include
#include
#include "system.h"
#include "SevenSegment.h"
int main()
{
int i;
printf("7Segment example is running!\n");
while(1)
{
for(i=0;i<15;i++)
{
switch(i)
{
case 0:SevenSegment->data=0x40;break; //四个数码管全亮并显示0
case 1:SevenSegment->data=0x4F;break; //四个数码管全亮并显示1
case 2:SevenSegment->data=0x24;break; //四个数码管全亮并显示2
case 3:SevenSegment->data=0x30;break; //四个数码管全亮并显示3
case 4:SevenSegment->data=0x19;break; //四个数码管全亮并显示4
case 5:SevenSegment->data=0x12;break; //四个数码管全亮并显示5
case 6:SevenSegment->data=0x02;break; //四个数码管全亮并显示6
case 7:SevenSegment->data=0x78;break; //四个数码管全亮并显示7
case 8:SevenSegment->data=0x00;break; //四个数码管全亮并显示8
case 9:SevenSegment->data=0x10;break; //四个数码管全亮并显示9
case 10:SevenSegment->data=0x80;break;
//四个数码管全亮并显示8,显示小数点
case 11:SevenSegment->data=0x700;break;
//数码管1亮并显示8,显示小数点
case 12:SevenSegment->data=0xB00;break;
//数码管2亮并显示8,显示小数点
case 13:SevenSegment->data=0xD00;break;
//数码管3亮并显示8,显示小数点
case 14:SevenSegment->data=0xE00;break;
//数码管4亮并显示8,显示小数点
case 15:SevenSegment->data=0xF00;break; //数码管全灭
default:break;
}
usleep(1000000);
}
}
return 0;
}
0x40为什么代表四个数码管全亮并显示 0呢?
在 niosShow.v中有如下代码:
assign {seg,segment}=pio_data_out;
seg表示 4个数码管,segment表示 8个发光管
0x40化为二进制位 0100 0000
对应 : 小数点 gfe dcba
g为 1,表示 g不亮。对应原理图看看,g不亮表示什么?没错,是 0。而 segm没有表
示,判定它为 0000,即 4个数码管全部点亮。
同理,0x700的二进制为 0111 0000 0000,即数码管 1亮并显示 8,显示小数点
由于之前添加 PIO,改变了软核,所以需要重新 Generate BSP。
右键->Nios II->Generate BSP,如下图。
接下来,我们回到 QuartusII 配置管脚,将我们提供的数码管管脚信息复制到工程文件
夹的 niosShow.qsf文件中。
修改 niosShow.v文件,代码如下:
module niosShow(clk,rstn,address_o,data_io,nce_o,nwe_o,noe_o,
nbyte_enable_o,dclk_o,sce_o,sdo_o,data0_i,seg,segment);
input clk,rstn;
inout [15:0] data_io;
output [17:0] address_o;
output nce_o,nwe_o,noe_o;
output [1:0] nbyte_enable_o;
output dclk_o,sce_o,sdo_o;
input data0_i;
output [3:0] seg;
output [7:0] segment;
wire [11:0] pio_data_out;
assign {seg,segment}=pio_data_out;//seg表示 4个数码管,segment表示 8个发光管
wire reset_n;
wire clk_in;
reset_logic reset_logic(.clk(clk),.rstn(rstn),.rstno(reset_n));
sys_pll clk_gen(.inclk0(clk),.c0(clk_in));
myNois myNois_inst
(
.addrsee_o_to_the_sram256x16_fpgastudy (address_o),
.clk_in (clk_in),
.data0_to_the_epcs_flash_controller (data0_i),
.data_io_to_and_from_the_sram256x16_fpgastudy (data_io),
.dclk_from_the_epcs_flash_controller (dclk_o),
.nbyte_enable_o_to_the_sram256x16_fpgastudy (nbyte_enable_o),
.nce_o_to_the_sram256x16_fpgastudy (nce_o),
.noe_o_to_the_sram256x16_fpgastudy (noe_o),
.nwe_o_to_the_sram256x16_fpgastudy (nwe_o),
.reset_n (reset_n),
.sce_from_the_epcs_flash_controller (sce_o),
.sdo_from_the_epcs_flash_controller (sdo_o),
.out_port_from_the_pio_7SEG (pio_data_out)
);
endmodule
编译,点击如下图红框处。
休息一下吧,我们离成功已经很近了。
编译成功了!!!
点击下图红框处,我们需要把硬件代码下载到开发板中。
插上数码管子板,连接 USB-Blaster,打开开发板电源。
在下载页面点击 Start按钮开始下载。
下载结束后,如上图所示,数码管的灯全部亮起。
硬件部分应经结束。
下面我们回到 Eclipse。
Run->Run Configurations。
进入如下界面,具体操作前面已经讲过。点击 Run按钮。
在 Eclipse上,可以看到
7Segment example is running!
在数码管上,数字从 0000-9999,循环改变。
辛苦没有白费,大功告成了!!!
第四章 数码管的表演
一 简介
二 建立PIO模块
三 数码管软件部分
1 原理
2 具体操作