按键控制实验报告Word格式.docx
《按键控制实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《按键控制实验报告Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
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显示方式还没有完全搞清楚,有后续学习。
总之,通过这次实验,学到了很多的东西,尤其是关于软件及如何在硬件平台的基础上,通过软件来实现特定功能,这也正是嵌入式的特点。