FPGA nios軟核雙向IO以及單獨引腳的輸入輸出控制的實現
我就是想要實現這樣的功能:
學過51微控制器的都知道,每一個8位IO口都有單獨每一位的讀取或者賦值方式,這個在LCD等外設的驅動引腳控制中至關重要,這裡我舉個例:
lcd1602主要有如下引腳,
LCD1602_DB,8位
LCD1602_RS,一位
LCD1602_RW,一位
LCD1602_E,一位
比如我們想要單獨控制使能引腳LCD1602_E
51微控制器中我可以這樣寫:sbit LCD1602_E = P1`0;
LCD1602_E = 1;即可實現這個引腳為高電平
但是在FPGA nios中,沒有單獨取某一位的指令(只能一次性讀完或者寫完,FPGA nios結構決定的),那麼怎麼辦呢,我百度了好多,基本上都是說,把每個需要單獨控制的引腳用一個pio核來實現,這樣當然是沒有問題,但是很麻煩,比如某些場合需要單獨控制幾十個引腳,那麼是不是得新增幾十個pio核,這樣你的FPGA的巨集單元也不一定夠用,而且,新增太多IP核可能容易出錯,這裡我想到一種方法來實現這個功能:
新增一個pio核即可,但是位寬設為你需要的引腳數,比如8位,而且設定為雙向IO
這樣這8個IO和51微控制器的IO結構就是一樣的了,也比較符合我們操作的習慣
比如我們需要讀某一位的值,我們可以先讀出這8位的值(只能一次性讀完或者寫完,FPGA nios結構決定的),
然後再通過c語言的一些與或等運算取出其中我們想要的那一位即可
比如需要寫某一位的值,我們可以先讀出這8個io的值,然後通過與或等c語言運算方式寫進讀出的這個數中,最後一次性8位全部寫進去即可
以上就實現了用一個IP核實現多個引腳單獨控制的問題,具體程式碼看如下:這是我自己寫的,因為我最近搞LCD2864的程式:
// 只有pio_bid_db是雙向的,需要控制方向 void pio_bid_db_write8bits(unsigned char value) { IOWR (PIO_BID_DB_BASE,1,0Xff); // 設定這個雙向io的方向為全部io輸出 IOWR_ALTERA_AVALON_PIO_DATA (PIO_BID_DB_BASE, value); } unsigned char pio_bid_db_read8bits() { IOWR (PIO_BID_DB_BASE,1,0X00); return IORD_ALTERA_AVALON_PIO_DATA (PIO_BID_DB_BASE); } void pio_bid_db_write1bit(unsigned char position,unsigned char value) { unsigned char tmp; tmp = pio_bid_db_read8bits(); tmp &= ~(1<<position); //將tmp的第pos位設定為0 tmp |= value<<position; pio_bid_db_write8bits(tmp); } // 0-7 unsigned char pio_bid_db_read1bit(unsigned char position) { unsigned char tmp; tmp = pio_bid_db_read8bits(); if((tmp & (1 << position)) > 0) return 1; else return 0; } 經過我的測試,完全ok