
→キーボードの説明はこちら
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;
終了モジュール
入力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を返します。
}
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
成功をお祈りします。