按键控制实验报告Word格式.docx

上传人:b****7 文档编号:21844307 上传时间:2023-02-01 格式:DOCX 页数:12 大小:638KB
下载 相关 举报
按键控制实验报告Word格式.docx_第1页
第1页 / 共12页
按键控制实验报告Word格式.docx_第2页
第2页 / 共12页
按键控制实验报告Word格式.docx_第3页
第3页 / 共12页
按键控制实验报告Word格式.docx_第4页
第4页 / 共12页
按键控制实验报告Word格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

按键控制实验报告Word格式.docx

《按键控制实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《按键控制实验报告Word格式.docx(12页珍藏版)》请在冰豆网上搜索。

按键控制实验报告Word格式.docx

LEDG,

////////KEY//////////

KEY,

CLR,

////////COUNT//////////

//COUNT,

////////SEG7//////////

HEX0,

HEX1,

////////LCD//////////

LCD_BLON,

LCD_DATA,

LCD_EN,

LCD_ON,

LCD_RS,

LCD_RW,

////////SDRAM//////////

DRAM_ADDR,

DRAM_BA,

DRAM_CAS_N,

DRAM_CKE,

DRAM_CLK,

DRAM_CS_N,

DRAM_DQ,

DRAM_DQM,

DRAM_RAS_N,

DRAM_WE_N,

////////Flash//////////

FL_ADDR,

FL_CE_N,

FL_DQ,

FL_OE_N,

FL_RST_N,

FL_RY,

FL_WE_N,

FL_WP_N,

);

//PARAMETERdeclarations

 

//PORTdeclarations

////////////CLOCK//////////

inputCLOCK_50;

////////////LED//////////

output[7:

0]LEDG;

////////////KEY//////////

input[2:

0]KEY;

inputCLR;

////////////COUNT///////////

//input[7:

0]COUNT

////////////SEG7//////////

output[6:

0]HEX0;

0]HEX1;

////////////LCD//////////

outputLCD_BLON;

inout[7:

0]LCD_DATA;

outputLCD_EN;

outputLCD_ON;

outputLCD_RS;

outputLCD_RW;

////////////SDRAM//////////

output[12:

0]DRAM_ADDR;

output[1:

0]DRAM_BA;

outputDRAM_CAS_N;

outputDRAM_CKE;

outputDRAM_CLK;

outputDRAM_CS_N;

inout[31:

0]DRAM_DQ;

output[3:

0]DRAM_DQM;

outputDRAM_RAS_N;

outputDRAM_WE_N;

////////////Flash//////////

output[22:

0]FL_ADDR;

outputFL_CE_N;

inout[7:

0]FL_DQ;

outputFL_OE_N;

outputFL_RST_N;

inputFL_RY;

outputFL_WE_N;

outputFL_WP_N;

//REG/WIREdeclarations

////////7-SEG//////////////

//wire[2:

0]norkey;

wire[7:

0]count_in;

0]data;

//Structuralcoding

wirereset_n;

assignreset_n=1'

b1;

kernelkernel_inst(

//1)globalsignals:

.clk_50(CLOCK_50),

.reset_n(reset_n),

.sdram_clk(DRAM_CLK),

.sys_clk(clk_sys),///////////////////////

//the_key

.in_port_to_the_key(~KEY),

//the_count

.in_port_to_the_count(count_in[7:

0]),

//the_lcd

.LCD_E_from_the_lcd(LCD_EN),

.LCD_RS_from_the_lcd(LCD_RS),

.LCD_RW_from_the_lcd(LCD_RW),

.LCD_data_to_and_from_the_lcd(LCD_DATA),

//the_led

.out_port_from_the_led(LEDG),

//the_sdram

.zs_addr_from_the_sdram(DRAM_ADDR),

.zs_ba_from_the_sdram(DRAM_BA),

.zs_cas_n_from_the_sdram(DRAM_CAS_N),

.zs_cke_from_the_sdram(DRAM_CKE),

.zs_cs_n_from_the_sdram(DRAM_CS_N),

.zs_dq_to_and_from_the_sdram(DRAM_DQ),

.zs_dqm_from_the_sdram(DRAM_DQM),

.zs_ras_n_from_the_sdram(DRAM_RAS_N),

.zs_we_n_from_the_sdram(DRAM_WE_N),

//the_seg7

.out_port_from_the_seg7(data),

.out_port_from_the_en_seg(en),

//the_tri_state_bridge_flash_avalon_slave

.address_to_the_cfi_flash(FL_ADDR),

.read_n_to_the_cfi_flash(FL_OE_N),

.select_n_to_the_cfi_flash(FL_CE_N),

.tri_state_bridge_data(FL_DQ),

.write_n_to_the_cfi_flash(FL_WE_N),

);

clk_divclk_div(

.clkin(clk_sys),

.clk_1KHz(clk_1KHz),

.clk_1Hz(clk_1Hz));

mydecoder_7segyima(

.clk(clk_1KHz),

.segmenth(HEX1),

.segmentl(HEX0),

.data(data),

.en(en));

//.lowdata(data[3:

0]));

countercouter(

.clk(clk_1Hz),

.clr(CLR),//anjianqingling

.count(count_in[7:

//FlashConfig

assignFL_RST_N=reset_n;

assignFL_WP_N=1'

///////////////////////////////////////////

//LCDconfig

assignLCD_BLON=0;

//notsupported

assignLCD_ON=1'

//alwasyon

endmodule

系统框图

实验程序

#include"

count.h"

//关于LCD的相关定义,控制LCD的输出格式

#include<

unistd.h>

stdio.h>

system.h"

altera_avalon_pio_regs.h"

alt_types.h"

sys/alt_irq.h"

volatileinta=0;

volatilecharb;

unsignedcharcount1,count2,count3;

staticvoidKeyDown_interrupts(void*context,alt_32id)//中断函数

{

IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE,0);

//响应中断后,将中断响应位复位;

b=IORD_ALTERA_AVALON_PIO_DATA(KEY_BASE);

//读取中断响应值

switch(b)

{

case0x1:

//七段数码管显示

IOWR_ALTERA_AVALON_PIO_DATA(EN_SEG_BASE,1);

//IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x00);

count1=IORD_ALTERA_AVALON_PIO_DATA(COUNT_BASE);

IOWR_ALTERA_AVALON_PIO_DATA(SEG7_BASE,count1);

break;

case0x2:

//LCD显示

count2=IORD_ALTERA_AVALON_PIO_DATA(COUNT_BASE);

printf("

%02x"

count2);

//直接用标准输出函数表示

case0x4:

//LED灯显示

IOWR_ALTERA_AVALON_PIO_DATA(EN_SEG_BASE,0);

count3=IORD_ALTERA_AVALON_PIO_DATA(COUNT_BASE);

IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,count3);

default:

//无按键时,正常计数,但无显示

}

}

voidInitPIO(void)//中断初始化

IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE,0x7);

//开中断,允许后三位开中断

IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE,0x0);

//中断响应后复位,防止中断一直响应。

alt_irq_register(KEY_IRQ,NULL,KeyDown_interrupts);

intmain()

InitPIO();

while

(1)//等待中断

IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x00);

//中断初始化

return0;

程序几点注意:

1)volatileinta=0;

对于变量a,b,一定要用volatile关键字修饰,防止因编译器的优化而省略。

具体说来,由于外部中断等的存在,变量的值很可能因为外部按键而改变变量的值,但编译器不会察觉到其变化,而仅仅使用寄存器里的备份。

比如,在本次实验中,变量b为读取外部中断按键的值,当我们按下不同的按键时,b每次对应的值是不同的,而编译器在编译的过程中是感觉不到其变化的。

这也是区分C程序员和嵌入式系统程序员的最基本的问题。

2)系统设置

Stdout选择LCD,printf("

输出结果在LCD上显示;

实验结果

实验总结与体会

最开始的时候程序,完全没思路,网上搜了下,发现nios自带的几个模板函数有类似的函数,countbinary,只是函数实现的功能稍有不同,并采用的是边沿中断。

花了一段时间把程序看懂之后,发现按照实验要求,最好采用电平中断。

再有就是版本问题,调试的过程总是显示一些意想不到的错误。

可能SOPC较前沿,所遇到的问题都没有很好的系统解决方法,过程较吃力。

这次实验总体上实现了实验要求,LCD显示方式还没有完全搞清楚,有后续学习。

总之,通过这次实验,学到了很多的东西,尤其是关于软件及如何在硬件平台的基础上,通过软件来实现特定功能,这也正是嵌入式的特点。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1