例としてPmod KYPDキーボードを使用して、MIPSfpgaに周辺モジュールを接続する

こんにちは この記事では、例としてPmod KYPDキーボードを使用してMIPSfpgaベースのシステムにモジュールを接続する方法を説明します。 また、接続されたモジュールを管理するためのプログラムの作成も紹介します。

画像






→キーボードの説明はこちら



Pmod KYPDは、16進数形式(0〜F)の数字を持つ16ボタンキーボードです。 ポーリングは、各列に論理値0を交互に適用し、行のステータスを読み取ることで行われます。 ポーリング時に列のボタンのいずれかを押すと、対応する行の論理値は1になります。



まず、MIPSfpgaソースが必要です。



ダウンロード手順



次に、 MIPSfpga-plusアドインをダウンロードする必要があります。これにより、UARTでプログラムを記録できます。



スクリプトを実行してプロジェクトを組み立てるには、簡単に説明とインストール手順が必要です。以下が必要です。



-MIPSfpgaのソースをフォルダーに入れます



C:\ MIPSfpga;


ディレクトリ内のMIPSfpga-plus:

C:\ github \ mipsfpga-plus;


次に、フォルダーC:\ github \ mipsfpga-plus \ boardで、ボードを選択します。de0_cvがあり、make_projectスクリプトを実行します。 起動するプロジェクトはC:\ github \ mipsfpga-plus \ board \ de0_cv \ projectにあります。



ボードにプロジェクトがない場合は、論理セルの数に応じて最適なプロジェクトを選択し、宛先を変更できます。



-コンパイラー、リンカーCodescape 、およびUSB-UARTコンバーター(pl2303hxまたはch340など)も必要です。



画像

キーボードとUSB-UARTコンバーターをボードに接続する


キーボードはAHB-Liteバスに直接接続されます。 キーボードをシステムに統合するために、decoder.vモジュールを作成しました。 このモジュールは、次の原則に従って機能します。1ミリ秒ごとに1つの列が調べられます。 その瞬間にこの列のボタンが押された場合。 その後、対応する行は論理値1になります。各行と列の組み合わせは、0〜Fの数字に対応します。この数字はレジスタに書き込まれ、バスを介してプロセッサメモリに転送されます。 ソフトウェアを使用して、メモリのデータがインジケータに表示されます。



モジュールコード
モジュールデコーダー(

入力i_row1

入力i_row2

入力i_row3、

入力i_row4、

入力i_clk、

入力i_rst_n、

出力[3:0] o_col、

出力[3:0] o_number);



reg [3:0] col;



reg [31:0]カウンター。



reg [3:0]番号。



パラメーターZERO = 8'b11100111; //行、列

パラメーターONE = 8'b01110111;

パラメーターTWO = 8'b01111011;

パラメーターTHREE = 8'b01111101;

パラメーターFOUR = 8'b10110111;

パラメーターFIVE = 8'b10111011;

パラメーターSIX = 8'b10111101;

パラメーターSEVEN = 8'b11010111;

パラメーターEIGHT = 8'b11011011;

パラメーターNINE = 8'b11011101;

パラメータTEN = 8'b01111110;

パラメーターELEVEN = 8'b10111110;

パラメーターTWELVE = 8'b11011110;

パラメーターTHIRTEEN = 8'b11101110;

パラメーターFOURTEEN = 8'b11101101;

パラメーターFIFTEEN = 8'b11101011;



常に@(posedge i_clkまたはnegedge i_rst_n)

始める

if(i_rst_n == 1'b0)

始める

col <= 4'b1110;

終わり

他に

始める

if(カウンター== 31'b111001001110000111000000)

始める

col <= {col [0]、col [3:1]};

終わり

終わり

終わり



常に@ *

始める

if(i_rst_n == 0)

始める

数値<= 4'b0;

終わり

他に

始める

ケース({i_row1、i_row2、i_row3、i_row4、col [0]、col [1]、col [2]、col [3]})

ゼロ:

始める

数値<= 4'b0000;

終わり

ONE:

始める

数値<= 4'b0001;

終わり

2

始める

数値<= 4'b0010;

終わり

3:

始める

数値<= 4'b0011;

終わり

4

始める

数値<= 4'b0100;

終わり

5

始める

数値<= 4'b0101;

終わり

6:

始める

数値<= 4'b0110;

終わり

7:

始める

数値<= 4'b0111;

終わり

8

始める

数値<= 4'b1000;

終わり

9:

始める

数値<= 4'b1001;

終わり

10:

始める

数値<= 4'b1010;

終わり

イレブン:

始める

数値<= 4'b1011;

終わり

TWELVE:

始める

数値<= 4'b1100;

終わり

サーティーン:

始める

数値<= 4'b1101;

終わり

フォーティーン:

始める

数値<= 4'b1110;

終わり

フィフティーン:

始める

数値<= 4'b1111;

終わり

デフォルト:

始める

数<=数;

終わり

エンドケース

終わり

終わり



常に@(posedge i_clkまたはnegedge i_rst_n)

始める

if(i_rst_n == 0)

始める

カウンター= 31'b0;

終わり

他に

始める

if(counter == 31'b111001001110000111000011)

始める

カウンター= 31'b0;

終わり

他に

始める

カウンター=カウンター+ 1'b1;

終わり

終わり

終わり



o_number = numberを割り当てます。

assign o_col = col;



終了モジュール



画像



上記のモジュールを含むファイルをプロジェクトに接続します。 最上位ファイルにde0_cv.vがあり、次の行を追加します。



`ifdef MFP_PMOD_KYPD .KYPD_DATA ( GPIO_0 [35:28] ), .KEY_0 ( KEY [0] ) `endif
      
      





キーボードの電源を入れるために、レッグGPIO_0 [35]、GPIO_0 [34]を選択します。 mfp_system.vファイルで、入力と出力を追加します。



  inout [7:0] KYPD_DATA, input KEY_0
      
      





mfp_systemモジュールの説明に、次を追加します。



 `ifdef MFP_PMOD_KYPD wire [3:0] KYPD_OUT; `endif `ifdef MFP_PMOD_KYPD decoder decoder ( .i_clk ( SI_ClkIn ), .i_rst_n ( KEY_0 ), .i_row1 ( KYPD_DATA [6] ), .i_row2 ( KYPD_DATA [4] ), .i_row3 ( KYPD_DATA [2] ), .i_row4 ( KYPD_DATA [0] ), .o_col ( {KYPD_DATA [7], KYPD_DATA [5], KYPD_DATA [3], KYPD_DATA [1]} ), .o_number ( KYPD_OUT ) ); `endif
      
      





mfp_ahb_lite_matrix_with_loaderモジュールのインスタンスを作成するとき、入力リストにデータを追加します。



  `ifdef MFP_PMOD_KYPD .KYPD_OUT ( KYPD_OUT ), `endif
      
      





ファイルmfp_ahb_lite_matrix_with_loader.v、mfp_ahb_lite_matrix.v、mfp_ahb_gpio_slave.vに入力を追加します。



 input [3:0] KYPD_OUT
      
      





C:\ github \ mipsfpga-plusフォルダーにあるmfp_ahb_lite_matrix_config.vhファイルで、次の行を追加します。



 `define MFP_PMOD_KYPD_IONUM 4'h5 `define MFP_PMOD_KYPD_ADDR 32'h1f800014
      
      





実際には、これらはレジスタが利用できるアドレスです。 最後に、7セグメントインジケーターに数字を表示するプログラムを作成します。



プログラムコード
#include "mfp_memory_mapped_registers.h"



int main()

{

int n = 0;



(;;)

{



MFP_7_SEGMENT_HEX = MFP_PMOD_KYPD;

MFP_GREEN_LEDS = n ++;



}



0を返します。

}



motorola_s_recordファイルを生成します。



 08_generate_motorola_s_record_file
      
      





USB UARTコンバーターが接続されているCOMポートを確認します。



  11_check_which_com_port_is_used
      
      





ファイル12_upload_to_the_board_using_uartを変更します。



 set a=7 mode com%a% baud=115200 parity=n data=8 stop=1 to=off xon=off odsr=off octs=off dtr=off rts=off idsr=off type program.rec >\.\COM%a%,
      
      





ここで、aはUSB UARTコンバーターが接続されているCOMポート番号です。



最後に、プログラムをダウンロードします。



  12_upload_to_the_board_using_uart
      
      









成功をお祈りします。



All Articles