NIOS IIベースの電子時計設計

7613 ワード

この設計は筆者の実験授業の期末設計で、参考に供するだけで、ブログは実現方法とC言語の一部のプログラムソースコードを貼り出して、実現過程は長くないので、コードに対して最適化を行っていないが、機能はすでに実現した.プロジェクトファイルをCSDNダウンロードに提出するには、ダウンロードできる必要があります.https://download.csdn.net/download/g_curry/10855434パートナーが設計レポートを必要とするため、ダウンロードに転送されます.https://download.csdn.net/download/g_curry/11181792.
VerilogとSopcの2つの機能を使用する必要があるため、ハードウェア部分ではVerilogを使用してデジタルチューブのドライバを作成し、NiOS IIを使用して実装プロセスを記述します.
1.機能ニーズ
1)デジタルクロックの正確なリアルタイムの計時と表示機能を実現する;
2)目覚まし機能を実現し、即ちシステム時間が目覚まし時間に達した時にベルが鳴る.
3)時間と目覚まし時間の調整機能を実現する;
4)流水ランプ表示機能を実現する.
2.設計案
1)Qsysで生成したタイマーtimer_1 msは計時機能を実現する.
2)8個のデジタルチューブで時間を表示する;
3)3つのボタンで時間調整と目覚まし時計の時間調整を実現する機能.
キー1:交換モード(モード0:通常表示時間;モード1:現在時間を調整する時間;モード2;現在時間の分を調整する;モード3:現在時間の秒;モード4:目覚まし時間を調整する時間;モード5:目覚まし時間を調整する分);
キー2:非モード0で調整が必要な時間数を1つ加算しますが、オーバーフローしません.
キー3:非モード0で調整する時間数を1つ減らしますが、ゼロ以下ではありません.
時間と目覚まし時計の時間の調整機能を実現する.
4)点滅フラグを加え、調整中のビットを点滅させ、どのビットが調整されているかを判断する.
5)ボタンを押すと、一つのledランプに対応して点灯する.
6)ブザーで目覚まし機能を実現し、目覚ましが鳴った時に流水ランプ表示機能を実現する.
3.ハードウェア計画
ハードウェアシステムの組織計画において、システムが使用する周辺デバイスは次のとおりです.
1)デジタルチューブ:数時間でスクリーンを表示する;
2)ボタン:数サブ時計設定機能ボタン;
3)LEDランプ:8ビットのLEDランプが指示ランプとする;
4)ブザー:目覚まし時計が鳴る.ソフト、ハードウェアプログラムを格納する.
SOPC Qsysでシステム追加を確立するモジュールは以下のとおりである.
1)デジタル管を接続するPIO;
    2)Interval Timer;
3)キーPIO;
    4)On-Chip Memory RAM;
    5)On-Chip Memory ROM;
    6)System ID Peripheral;
#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 = 23,minute = 59,second = 50;
int hour1 = 0,minute1 = 0,n =0;
int segtab[12]={0x0,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9,0xf,0xe};
int model_flag = 0,S_flag = 0,BEEP = 0,beep_flag = 0,beep_flag1 = 0;
int key_set = 1,key_add = 1,key_sub = 1,key_rst = 1;
int a[8]={0,0,0,0,0,0,0,0};

void write_data()
{
	IOWR(DIG_1_BASE,0,a[7]);
	IOWR(DIG_2_BASE,0,a[6]);
	IOWR(DIG_3_BASE,0,a[5]);
	IOWR(DIG_4_BASE,0,a[4]);
	IOWR(DIG_5_BASE,0,a[3]);
	IOWR(DIG_6_BASE,0,a[2]);
	IOWR(DIG_7_BASE,0,a[1]);
	IOWR(DIG_8_BASE,0,a[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_BASE,0,0xff);
	}
	else if ( led_flag == 2){
		IOWR(LED_BASE,0,state);
	}
	else {
		IOWR(LED_BASE,0,0x00);
	}
}
void delay(int us)//  
{

	int i,j;
	for ( i = us; i > us; i--) {
		for ( j = 50; j > 0; j--);
	}}
int read_key()
{
	int status = 0;
	status = IORD(KEY_BASE,0);
	return status;
}
int tmp = 0;
void check_key()
{
	delay(10);
	int status = IORD(KEY_BASE,0);
  	if ( status) {
		tmp ++;
		if ( tmp == 50) {
			if ( status & 0x01) {
					key_set = 0;
					set_led(2,0x01);
				}
				else if ( status & 0x01 << 1) {
					key_add =0;
					set_led(2,0x02);
				}
				else if ( status & 0x01<< 2){
					key_sub = 0;
					set_led(2,0x04);
				}
				else if ( status & 0x01<< 3){
					key_rst = 0;
					set_led(2,0x08);
				}
				else
				{
					tmp = 0;
				}}}
	else {
		tmp = 0;
	}}
void delay(int us)//  
{
	int i,j;
	for ( i = us; i > us; i--) {
		for ( j = 50; j > 0; j--);
	}
}
int flag = 0,ss_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];
			}
			else
			{
				a[3]=segtab[11];
				a[4]=segtab[11];
			}
			a[5]=segtab[10];
			a[6]=segtab[second/10];
			a[7]=segtab[second%10];
			write_data();
		}break;
	case 3:
		{
			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];
			if(S_flag==1)
			{
				a[6]=segtab[second/10];
				a[7]=segtab[second%10];
			}
			else
			{
				a[6]=segtab[11];
				a[7]=segtab[11];
			}
			write_data();
		}break;
	case 4:
		{
			if(S_flag==1)
			{
				a[0]=segtab[hour1/10];
				a[1]=segtab[hour1%10];
			}
			else
			{
				a[0]=segtab[11];
				a[1]=segtab[11];
			}
			a[2]=segtab[10];
			a[3]=segtab[minute1/10];
			a[4]=segtab[minute1%10];
			a[5]=segtab[10];
			a[6]=segtab[11];
			a[7]=segtab[11];
			write_data();
		}break;
	case 5:
		{
			a[0]=segtab[hour1/10];
			a[1]=segtab[hour1%10];
			a[2]=segtab[10];
			if(S_flag==1)
			{
				a[3]=segtab[minute1/10];
				a[4]=segtab[minute1%10];
			}
			else
			{
				a[3]=segtab[11];
				a[4]=segtab[11];
			}
			a[5]=segtab[10];
			a[6]=segtab[11];
			a[7]=segtab[11];
			write_data();
		}
	}
}
void key_model()
{
   if(key_set==0)
	 {
			key_set = 1;
			model_flag++;
			if(model_flag==6)
			model_flag=0;	 
}
   if(model_flag!=0)
   {
	 switch(model_flag)
	 {
		  case 1:		   // —— 
		  {
			if(key_add==0)
			{
					key_add = 1;
					if(hour<23) hour++;
					else hour=0;
			}
			if(key_sub==0)
			{
					key_sub = 1;
					if(hour> 0) hour--;
					else hour=23;
			}
		  } break;
		  case 2:		  // —— 
		  {
			if(key_add==0)
			{
					key_add = 1;
					if(minute<59) minute++;
					else minute=0;
			}
			if(key_sub==0)
			{
					key_sub = 1;
					if(minute>0) minute--;
					else minute=59;
			}
		} break;
		 case 3:		  // —— 
		  {
			if(key_add==0)
			{
					key_add = 1;
					if(second<59) second++;
					else second=0;
			}
			if(key_sub==0)
			{
					key_sub = 1;
					if(second>0) second--;
					else second=59;
			}
		} break;
		 case 4:		  // —— 
		  {
			if(key_add==0)
				{
					key_add = 1;
					if(hour1<23)
					hour1++;
					else hour1=0;
				}
			 if(key_sub==0)
				{
					key_sub = 1;
					if(hour1>0)
					hour1--;
					else hour1=23;
				 }
		  }	 break;
		  case 5:		  // —— 
		   {
			 if(key_add==0)
				{
					key_add = 1;
					if(minute1<59)
					minute1++;
					else minute1=0;
				}
			if(key_sub==0)
				{
					key_sub = 1;
					if(minute1>0)
					minute1--;
					else minute1=59;
				}
			}  break;
		}
	}
}
void naozhong()
{
	if(hour1==hour&&minute1==minute&&second<10) // 
	{
		beep_flag = ~beep_flag;
		if (beep_flag == 0)
			IOWR(BEEP_BASE,0,0);
		else
			IOWR(BEEP_BASE,0,1);
		if(S_flag==1)
		{
			set_led(2,0x55);
		}
		else
		{
			set_led(2,~0x55);
		}
	}
}
int main()
{
	alt_irq_register(TIMER_1S_IRQ,0,ISR_timer);
	flag = 0;
    while(1)
    {
		check_key();
		key_model();
    	if (flag)
    	{
    		rst();
    		naozhong();
    		flag = 0;
    		n++;
			if(n == 1000)
			{
				n = 0;
				second++;
				if(second >= 60)
				{
					minute++;
					second = 0;
				}
				if(minute >= 60)
				{
					hour++;
					minute = 0;
				}
				if(hour >= 24)
				{
					hour = 0;
				}
			}
			display();
    	}
    }
    return 0;
}