1. 程式人生 > >FPGA nios軟核雙向IO以及單獨引腳的輸入輸出控制的實現

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