【NiosII训练】第三篇、定时闹钟的设计

目录

第一部分、前言

1、闲话

第二部分、题目要求

1、图片

2、文字描述

第三部分、工程代码

1、软核的搭建

2、顶层文件的代码

3、Ecplise代码

 第四部分、总结

1、实现的功能阐述

2、结果演示

3、完整工程


第一部分、前言

1、闲话

这个设计也是我们《SOPC技术及应用》课程结束的期末作业,也相当于期末考试。我自己的是老师题库里的第五题、驱动AD9854这个模块,题目要求在《【NiosII训练】第一篇、FPGA驱动AD9854基础篇:https://blog.csdn.net/Learning1232/article/details/111193587》已经说到了,想回去看的铁子们可以回去看。这个定时闹钟的设计是我❤,她抽签抽到的第十八题,她不是很会,So。。。。题目要求如下。

第二部分、题目要求

1、图片

2、文字描述

使用sopc技术中的定时器设计一个能够定时的闹钟,能够在某款lcd上显示当前时间与定的闹钟的时间,当定的时间到时,ac620上的蜂鸣器能够响起来。

第三部分、工程代码

1、软核的搭建

这里核心的部分就是LCD9341的IP核、定时器的IP核、一个控制蜂鸣器的IP核和一个控制LED的IP核。工程还是一样基于之前小梅哥家的LCD9341的例程修改的,因为这个工程里面包含了LCD9341的IP核。

2、顶层文件的代码

预编译过后,将蜂鸣器的引脚分配为PB6(我这里没有用板载蜂鸣器,用的是一个外接的有源的低电平触发蜂鸣器简单

module AC620_GHRD(input  wire        clk,                           //                        clk.clkinput  wire        reset_n,                     //                      reset.reset_noutput wire        lcd_rst,                    //                    lcd_rst.exportoutput wire        lcd_rd_n,                     //                     lcd_rd.exportoutput wire        lcd_bl,                     //                     lcd_bl.exportoutput wire        lcd_wr_n,                     //                     lcd_wr.exportoutput wire        lcd_rs,                     //                     lcd_rs.exportoutput wire        lcd_cs_n,                     //                     lcd_cs.exportinout  wire [15:0] lcd_data,                     //                     lcd_db.exportoutput wire        sdram_clk,                     //                  sdram_clk.clkoutput wire [11:0] sdram_addr,                        //                      sdram.addroutput wire [1:0]  sdram_ba,                          //                           .baoutput wire        sdram_cas_n,                       //                           .cas_noutput wire        sdram_cke,                         //                           .ckeoutput wire        sdram_cs_n,                        //                           .cs_ninout  wire [15:0] sdram_dq,                          //                           .dqoutput wire [1:0]  sdram_dqm,                         //                           .dqmoutput wire        sdram_ras_n,                       //                           .ras_noutput wire        sdram_we_n,                         //                           .we_ninput  wire        uart_0_rxd,                        //                     uart_0.rxdoutput wire        uart_0_txd,                        //                           .txdoutput wire        epcs_dclk,                         //                       epcs.dclkoutput wire        epcs_sce,                          //                           .sceoutput wire        epcs_sdo,                          //                           .sdoinput  wire        epcs_data0,                         //                           .data0output wire [3:0]  pio_led,output wire        pio_buzzer);mysystem u0 (.clk_clk                           (clk),                           //                        clk.clk.reset_reset_n                     (reset_n),                     //                      reset.reset_n.uart_0_rxd                        (uart_0_rxd),                        //                     uart_0.rxd.uart_0_txd                        (uart_0_txd),                        //                           .txd.epcs_dclk                         (epcs_dclk),                         //                       epcs.dclk.epcs_sce                          (epcs_sce),                          //                           .sce.epcs_sdo                          (epcs_sdo),                          //                           .sdo.epcs_data0                        (epcs_data0),                        //.lcd_rst_export                    (lcd_rst),                    //                    lcd_rst.export.lcd_bl_export                     (lcd_bl),                     //                     lcd_bl.export.lcd_wr_n                          (lcd_wr_n),                          //                        lcd.wr_n.lcd_rd_n                          (lcd_rd_n),                          //                           .rd_n.lcd_data                          (lcd_data),                          //                           .data.lcd_rs                            (lcd_rs),                            //                           .rs.lcd_cs_n                          (lcd_cs_n),                           //  .sdram_clk_clk                     (sdram_clk),                     //                  sdram_clk.clk.altpll_0_phasedone_conduit_export (), // altpll_0_phasedone_conduit.export.altpll_0_locked_conduit_export    (),    //    altpll_0_locked_conduit.export.altpll_0_areset_conduit_export    (),    //    altpll_0_areset_conduit.export.sdram_addr                        (sdram_addr),                        //                      sdram.addr.sdram_ba                          (sdram_ba),                          //                           .ba.sdram_cas_n                       (sdram_cas_n),                       //                           .cas_n.sdram_cke                         (sdram_cke),                         //                           .cke.sdram_cs_n                        (sdram_cs_n),                        //                           .cs_n.sdram_dq                          (sdram_dq),                          //                           .dq.sdram_dqm                         (sdram_dqm),                         //                           .dqm.sdram_ras_n                       (sdram_ras_n),                       //                           .ras_n.sdram_we_n                        (sdram_we_n),                        //                           .we_n.pio_buzzer_export                 (pio_buzzer), // pio_buzzer.export.pio_led_export                    (pio_led)     //    pio_led.export);endmodule

3、Ecplise代码

#include "lcd9341.h"
#include "system.h" 
#include "altera_avalon_timer_regs.h" 
#include "altera_avalon_pio_regs.h" 
#include "sys/alt_irq.h"
#include "unistd.h" 
#include  
#include "priv/alt_legacy_irq.h"/************************************************************/
/*蜂鸣器I/o接  B6  管脚
/*************************************************************///时间变量的定义
unsigned int  s=0,m=20,h=12,led=0;//设置当前时间
unsigned int  s1=0,m1=21,h1=12;   //设置闹钟时间
unsigned char  ss[10],ms[10],hs[10],ss1[10],ms1[10],hs1[10];unsigned char  s1s[10],m1s[10],h1s[10],s1s1[10],m1s1[10],h1s1[10];//函数声明
alt_u32 timer_isr_context; //定义全局变量以储存 isr_context 指针
void Timer_Initial(void); //定时器中断初始化
void Timer_ISR_Interrupt(void); //定时器中断服务子程序//---------------------------------------------------------------------------
//-- 名称 : Timer_Initial()
//-- 功能 : 定时器中断初始化
//-- 输入参数 : 无
//-- 输出参数 : 无§4 Qsys 丰富多彩的内置 IP 核 161
//---------------------------------------------------------------------------void Timer_Initial(void){//改写 timer_isr_context 指针以匹配 alt_irq_register()函数原型void* isr_context_ptr = (void*) &timer_isr_context;//设置 PERIOD 寄存器//PERIODH << 16 | PERIODL = 计数器周期因子 * 系统时钟频率因子 - 1//PERIODH << 16 | PERIODL = 1s*100M - 1 = 99 999 999 = 0x05F5_E0FFIOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE, 0x05F5);IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE, 0xE0FF);//5F5E0FF//设置 CONTROL 寄存器//位数 | 3 | 2 | 1 | 0 |//CONTROL | STOP | START | CONT | ITO |//ITO 1,产生 IRO; 0,不产生 IRQ//CONT 1,计数器连续运行直到 STOP 被置一; 0,计数到 0 停止//START 1,计数器开始运行; 0,无影响//STOP 1,计数器停止运行; 0,无影响IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,ALTERA_AVALON_TIMER_CONTROL_START_MSK | //START = 1ALTERA_AVALON_TIMER_CONTROL_CONT_MSK | //CONT = 1ALTERA_AVALON_TIMER_CONTROL_ITO_MSK); //ITO = 1//注册Timer1中断alt_irq_register(TIMER_0_IRQ, NULL, Timer_ISR_Interrupt);}//---------------------------------------------------------------------------
//-- 名称 : Timer_Initial()
//-- 功能 : 定时器中断服务子程序
//-- 输入参数 : timer_isr_context,用于传递中断状态寄存器的值,id,中断号
//-- 输出参数 : 无
//---------------------------------------------------------------------------
void Timer_ISR_Interrupt(void)
{//用户中断代码s++;if(s == 60){s = 0;m++;if(m == 60){m = 0;h++;if(h == 24){h = 0;}}}led ++;//应答中断,将 STATUS 寄存器清零IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE,~ALTERA_AVALON_TIMER_STATUS_TO_MSK);
}//---------------------------------------------------------------------------
//-- 名称 : main()
//-- 功能 : 程序入口
//-- 输入参数 : 无
//-- 输出参数 : 无
//---------------------------------------------------------------------------
int main(void)
{alt_u32 led_state = 0xff; //初始化 LedTimer_Initial(); //初始化定时器中断LCD9341_Init();printf("Welcome To Timer Ip Demo Program... \n");IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0xff);//使 led熄灭IOWR_ALTERA_AVALON_PIO_DATA(PIO_BUZZER_BASE, 1);//蜂鸣器关闭while(1){POINT_COLOR=RED;LCD_ShowString(50,30,"Alarm Clock Test");LCD_ShowString(66,70,"Time: ");printf("%d\n",h);printf("%d\n",m);printf("%d\n",s);sprintf(hs,"%d",h/10);sprintf(hs1,"%d",h%10);sprintf(ms,"%d",m/10);sprintf(ms1,"%d",m%10);sprintf(ss,"%d",s/10);sprintf(ss1,"%d",s%10);sprintf(h1s,"%d",h1/10);sprintf(h1s1,"%d",h1%10);sprintf(m1s,"%d",m1/10);sprintf(m1s1,"%d",m1%10);sprintf(s1s,"%d",s1/10);sprintf(s1s1,"%d",s1%10);LCD_ShowString(114,70,hs);LCD_ShowString(122,70,hs1);LCD_ShowString(130,70,":");LCD_ShowString(138,70,ms);LCD_ShowString(146,70,ms1);LCD_ShowString(154,70,":");LCD_ShowString(162,70,ss);LCD_ShowString(170,70,ss1);LCD_ShowString(10,90,"Alarm Clock: ");LCD_ShowString(114,90,h1s);LCD_ShowString(122,90,h1s1);LCD_ShowString(130,90,":");LCD_ShowString(138,90,m1s);LCD_ShowString(146,90,m1s1);LCD_ShowString(154,90,":");LCD_ShowString(162,90,s1s);LCD_ShowString(170,90,s1s1);if(h1 == h && m1==m && s1 == s){led = 0;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0);//使 led 全亮IOWR_ALTERA_AVALON_PIO_DATA(PIO_BUZZER_BASE, 0);//蜂鸣器叫}if(led == 5)//5秒后停止叫{led = 0;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0xff);//使 led熄灭IOWR_ALTERA_AVALON_PIO_DATA(PIO_BUZZER_BASE, 1);//蜂鸣器关闭}}
}

 第四部分、总结

1、实现的功能阐述

这个里面的实时时间Time和闹钟Alarm Clock是自己手动从代码中输入进去的,当Time的时间和Alarm Clock的时间一样时,蜂鸣器叫,我这里蜂鸣器是外接的一个模块,低电平就叫唤,叫唤5秒后停止叫唤,然后你又得从Ecplise软件中更改代码或者重新仿真一次。最后毕竟题目要求很宽泛,所以这样的效果足以满足老师的检查

2、结果演示

这里只展示图片,视频文件我已经上传到群文件,你也可以点击这里看一下演示效果(https://live.csdn.net/v/121242)。

3、完整工程

嫖嫖时间,完整的工程,我整理了好了,扫码加群,群文件里面有、要么留下邮箱,我看到了我会发链接给你或者你想大气一下,请点击这里,谢谢老板“🐶”“🐶”“🐶”(https://download.csdn.net/download/Learning1232/13694624)!

对了有问题直接留言或私信哈!

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部