FPGA基于NIOS II的电子钟设计
使用了Verilog和Sopc两项功能,故在硬件部分使用Verilog编写出数码管的驱动程序,使用NiOS II编写实现过程。
1)使用Qsys生成的定时器timer_1ms实现计时功能;
2)使用8个数码管显示时间;
3)使用3个按钮实现调时间和闹钟时间的功能。
按键1:更换模式(模式0:正常显示时间;模式1:调当前时间的小时;模式2;调当前时间的分钟;模式3:当前时间的秒;模式4:调闹钟时间的小时;模式5:调闹钟时间的分钟);
按键2:在非模式0下给需要调节的时间数加一,但不溢出;
按键3:在非模式0下给需要调节的时间数减一,但不小于零;
实现时间和闹钟时间的调时功能;
4)加入闪烁标志,给正在调整的位闪烁,判断是哪一位在调整;
5)按键按下时,对应一个led灯点亮;
6)使用蜂鸣器实现闹钟功能,闹钟响时实现流水灯指示功能。
代码片段和文件信息
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-12-17 13:13 TIMER
目录 0 2018-11-15 20:20 TIMER.qsys_edit
文件 66 2018-11-08 14:34 TIMER.qsys_editfilters.xml
文件 72097 2018-11-15 15:54 TIMER.qsys_editlayout.xml
文件 72112 2018-11-15 15:55 TIMER.qsys_editmycpu.xml
文件 565 2018-11-14 22:57 TIMER.qsys_editpreferences.xml
目录 0 2018-12-17 13:14 TIMERdb
文件 1262 2018-11-15 15:58 TIMERdb.cmp.kpt
文件 1575 2018-11-08 14:38 TIMERdbadd_sub_hui.tdf
文件 17656 2018-11-08 14:38 TIMERdbaltera_mult_add_80u2.v
文件 17656 2018-11-08 14:38 TIMERdbaltera_mult_add_a0u2.v
文件 37802 2018-11-08 14:38 TIMERdbaltsyncram_3id1.tdf
文件 37470 2018-11-08 14:38 TIMERdbaltsyncram_boc1.tdf
文件 12571 2018-11-08 14:38 TIMERdbaltsyncram_cpg1.tdf
文件 6424 2018-11-08 14:38 TIMERdbaltsyncram_g7h1.tdf
文件 37407 2018-11-08 14:38 TIMERdbaltsyncram_glg1.tdf
文件 37407 2018-11-08 14:38 TIMERdbaltsyncram_hlg1.tdf
文件 34541 2018-11-08 14:38 TIMERdbaltsyncram_i2d1.tdf
文件 51233 2018-11-08 14:38 TIMERdbaltsyncram_n802.tdf
文件 17839 2018-11-08 14:38 TIMERdbaltsyncram_njh1.tdf
文件 30551 2018-11-08 14:38 TIMERdbaltsyncram_oac1.tdf
文件 30550 2018-11-08 14:38 TIMERdbaltsyncram_qac1.tdf
文件 31245 2018-11-08 14:38 TIMERdbaltsyncram_qv81.tdf
目录 0 2018-11-15 20:20 TIMERdbip
目录 0 2018-11-15 20:20 TIMERdbipmycpu
文件 7387 2018-11-15 15:57 TIMERdbipmycpumycpu.bsf
文件 14657 2018-11-15 15:57 TIMERdbipmycpumycpu.qip
文件 50494 2018-11-15 15:57 TIMERdbipmycpumycpu.v
文件 167712 2018-11-15 15:57 TIMERdbipmycpumycpu__report.html
文件 1197196 2018-11-15 15:57 TIMERdbipmycpumycpu__report.xml
目录 0 2018-11-15 20:20 TIMERdbipmycpusubmodules
............此处省略604个文件信息
#include
#include “system.h“
#include “alt_types.h“
#include “altera_avalon_pio_regs.h“
#include “altera_avalon_timer_regs.h“
#include “sys/alt_irq.h“
int hour = 23minute = 59second = 50;
int hour1 = 0minute1 = 0;
int secLsecHminuLminuHhourLhourH;
int segtab[12]={0x00x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x90xf0xe};
int model_flag = 0S_flag = 0BEEP = 0beep_flag = 0beep_flag1 = 0;
int key_set = 1key_add = 1key_sub = 1key_rst = 1;
int a[8]={00000000};
int n =0;
void write_data()
{
IOWR(DIG_1_base0a[7]);
IOWR(DIG_2_base0a[6]);
IOWR(DIG_3_base0a[5]);
IOWR(DIG_4_base0a[4]);
IOWR(DIG_5_base0a[3]);
IOWR(DIG_6_base0a[2]);
IOWR(DIG_7_base0a[1]);
IOWR(DIG_8_base0a[0]);
}
void rst()
{
if(key_rst==0)
{
key_rst =1;
a[0]=2;
a[1]=3;
a[2]=segtab[10];
a[3]=5;
a[4]=9;
a[5]=segtab[10];
a[6]=5;
a[7]=5;
write_data();
}
}
void set_led(int led_flag int state)
{
if ( led_flag == 1) {
IOWR(LED_base00xff);
}
else if ( led_flag == 2){
IOWR(LED_base0state);
}
else {
IOWR(LED_base00x00);
}
}
int read_key()
{
int status = 0;
status = IORD(KEY_base0);
return status;
}
int tmp = 0;
void check_key()
{
delay(10);
int status = IORD(KEY_base0);
if ( status) {
tmp ++;
if ( tmp == 50) {
if ( status & 0x01) {
key_set = 0;
set_led(20x01);
}
else if ( status & 0x01 << 1) {
key_add =0;
set_led(20x02);
}
else if ( status & 0x01<< 2){
key_sub = 0;
set_led(20x04);
}
else if ( status & 0x01<< 3){
key_rst = 0;
set_led(20x08);
}
else
{
tmp = 0;
}
}
}
else {
tmp = 0;
}
}
void delay(int us)// 延时函数
{
int ij;
for ( i = us; i > us; i--) {
for ( j = 50; j > 0; j--);
}
}
int flag = 0ss_add = 0;
void ISR_timer(void * context alt_u32 id)
{
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_1S_base 0);
ss_add++;
if(ss_add >= 500)
{
ss_add = 0;
S_flag =! S_flag; //闪烁标志位
}
flag = 1;
}
void display()
{
switch(model_flag)
{
case 0:
{
a[0]=segtab[hour/10];
a[1]=segtab[hour%10];
a[2]=segtab[10];
a[3]=segtab[minute/10];
a[4]=segtab[minute%10];
a[5]=segtab[10];
a[6]=segtab[second/10];
a[7]=segtab[second%10];
write_data();
}break;
case 1:
{
if(S_flag==1)
{
a[0]=segtab[hour/10];
a[1]=segtab[hour%10];
}
else
{
a[0]=segtab[11];
a[1]=segtab[11];
}
a[2]=segtab[10]; //横线-
a[3]=segtab[minute/10];
a[4]=segtab[minute%10];
a[5]=segtab[10];
a[6]=segtab[second/10];
a[7]=segtab[second%10];
write_data();
}
break;
case 2:
{
a[0]=segtab[hour/10];
a[1]=segtab[hour%10];
a[2]=segtab[10];
if(S_flag==1)
{
a[3]=segtab[minute/10];
a[4]=segtab[minute%10];
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-12-17 13:13 TIMER
目录 0 2018-11-15 20:20 TIMER.qsys_edit
文件 66 2018-11-08 14:34 TIMER.qsys_editfilters.xm
文件 72097 2018-11-15 15:54 TIMER.qsys_editlayout.xm
文件 72112 2018-11-15 15:55 TIMER.qsys_editmycpu.xm
文件 565 2018-11-14 22:57 TIMER.qsys_editpreferences.xm
目录 0 2018-12-17 13:14 TIMERdb
文件 1262 2018-11-15 15:58 TIMERdb.cmp.kpt
文件 1575 2018-11-08 14:38 TIMERdbadd_sub_hui.tdf
文件 17656 2018-11-08 14:38 TIMERdbaltera_mult_add_80u2.v
文件 17656 2018-11-08 14:38 TIMERdbaltera_mult_add_a0u2.v
文件 37802 2018-11-08 14:38 TIMERdbaltsyncram_3id1.tdf
文件 37470 2018-11-08 14:38 TIMERdbaltsyncram_boc1.tdf
文件 12571 2018-11-08 14:38 TIMERdbaltsyncram_cpg1.tdf
文件 6424 2018-11-08 14:38 TIMERdbaltsyncram_g7h1.tdf
文件 37407 2018-11-08 14:38 TIMERdbaltsyncram_glg1.tdf
文件 37407 2018-11-08 14:38 TIMERdbaltsyncram_hlg1.tdf
文件 34541 2018-11-08 14:38 TIMERdbaltsyncram_i2d1.tdf
文件 51233 2018-11-08 14:38 TIMERdbaltsyncram_n802.tdf
文件 17839 2018-11-08 14:38 TIMERdbaltsyncram_njh1.tdf
文件 30551 2018-11-08 14:38 TIMERdbaltsyncram_oac1.tdf
文件 30550 2018-11-08 14:38 TIMERdbaltsyncram_qac1.tdf
文件 31245 2018-11-08 14:38 TIMERdbaltsyncram_qv81.tdf
目录 0 2018-11-15 20:20 TIMERdbip
目录 0 2018-11-15 20:20 TIMERdbipmycpu
文件 7387 2018-11-15 15:57 TIMERdbipmycpumycpu.bsf
文件 14657 2018-11-15 15:57 TIMERdbipmycpumycpu.qip
文件 50494 2018-11-15 15:57 TIMERdbipmycpumycpu.v
文件 167712 2018-11-15 15:57 TIMERdbipmycpumycpu__report.html
文件 1197196 2018-11-15 15:57 TIMERdbipmycpumycpu__report.xm
目录 0 2018-11-15 20:20 TIMERdbipmycpusubmodules
............此处省略604个文件信息
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。
评论列表(条)