1、 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
2、_WE_N, FL_WP_N,);/ PARAMETER declarations/ PORT declarations/ CLOCK /input CLOCK_50;/ LED /output 7:0 LEDG;/ KEY /input 2:0 KEY;input CLR;/COUNT/input 7:0 COUNT/ SEG7 /output 6:0 HEX0;0 HEX1;/ LCD /output LCD_BLON;inout 7:0 LCD_DATA;output LCD_EN;output LCD_ON;output LCD_RS;output LCD_RW;/ SDRAM /ou
3、tput 12:0 DRAM_ADDR;output 1:0 DRAM_BA;output DRAM_CAS_N;output DRAM_CKE;output DRAM_CLK;output DRAM_CS_N;inout 31:0 DRAM_DQ;output 3:0 DRAM_DQM;output DRAM_RAS_N;output DRAM_WE_N;/ Flash /output 22:0 FL_ADDR;output FL_CE_N;inout 7:0 FL_DQ;output FL_OE_N;output FL_RST_N;input FL_RY;output FL_WE_N;ou
4、tput FL_WP_N;/ REG/WIRE declarations/ 7-SEG /wire2:0 norkey;wire7:0 count_in;0 data;/ Structural codingwire reset_n;assign reset_n = 1b1;kernel kernel_inst( / 1) global signals: .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_
5、count .in_port_to_the_count(count_in7: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)
6、, .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), .
7、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_div clk_div( .clkin(clk_sys), .clk_1KHz(clk_1K
8、Hz), .clk_1Hz(clk_1Hz); mydecoder_7seg yima( .clk(clk_1KHz), .segmenth(HEX1), .segmentl(HEX0), .data(data), .en(en); / .lowdata(data3:0);counter couter( .clk(clk_1Hz), .clr(CLR),/anjian qingling .count(count_in7: / Flash Configassign FL_RST_N = reset_n;assign FL_WP_N = 1/ LCD configassign LCD_BLON =
9、 0; / not supportedassign LCD_ON = 1 / alwasy on endmodule系统框图实验程序#includecount.h /关于LCD的相关定义,控制LCD的输出格式#include stdio.hsystem.haltera_avalon_pio_regs.halt_types.hsys/alt_irq.hvolatile int a=0;volatile char b;unsigned char count1,count2,count3;static void KeyDown_interrupts(void* context,alt_32 id)
10、/中断函数 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE,0);/响应中断后,将中断响应位复位; b=IORD_ALTERA_AVALON_PIO_DATA(KEY_BASE); /读取中断响应值 switch(b) case 0x1: /七段数码管显示 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_AVALO
11、N_PIO_DATA(SEG7_BASE,count1); break; case 0x2: /LCD显示 count2=IORD_ALTERA_AVALON_PIO_DATA(COUNT_BASE); printf(%02x, count2);/直接用标准输出函数表示 case 0x4:/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:
12、/无按键时,正常计数,但无显示 void InitPIO(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);int main() InitPIO(); while(1)/等待中断 IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x00);/中断初始化
13、return 0;程序几点注意:1)volatile int a=0;对于变量a,b,一定要用volatile关键字修饰,防止因编译器的优化而省略。具体说来,由于外部中断等的存在,变量的值很可能因为外部按键而改变变量的值,但编译器不会察觉到其变化,而仅仅使用寄存器里的备份。比如,在本次实验中,变量b为读取外部中断按键的值,当我们按下不同的按键时,b每次对应的值是不同的,而编译器在编译的过程中是感觉不到其变化的。这也是区分C程序员和嵌入式系统程序员的最基本的问题。2)系统设置Stdout选择LCD,printf(输出结果在LCD上显示;实验结果实验总结与体会最开始的时候程序,完全没思路,网上搜了下,发现nios自带的几个模板函数有类似的函数,count binary,只是函数实现的功能稍有不同,并采用的是边沿中断。花了一段时间把程序看懂之后,发现按照实验要求,最好采用电平中断。再有就是版本问题,调试的过程总是显示一些意想不到的错误。可能SOPC较前沿,所遇到的问题都没有很好的系统解决方法,过程较吃力。 这次实验总体上实现了实验要求,LCD显示方式还没有完全搞清楚,有后续学习。总之,通过这次实验,学到了很多的东西,尤其是关于软件及如何在硬件平台的基础上,通过软件来实现特定功能,这也正是嵌入式的特点。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1