詳細設計レポート付き vivado デジタル パスワード ロック verilog ego1 開発ボード検証

名前: 詳細設計レポート付き vivado デジタル パスワード ロック verilog ego1 開発ボード検証

ソフトウェア: VIVADO

言語: Verilog

コード関数:

1. 少なくとも 4 桁の解錠パスワードを持つダイヤル錠を設計します。

2. 解錠キースイッチの入力コード(8桁以上設定可能、4桁のみ有効、残りはダミー)と設定したパスワードが一致すると解錠制御回路が起動し、F1ランプが点灯します。が点灯、F2 ライトが消灯してロック解除状態を示し、デジタル管を使用して OP を英語大文字で表示します

3. 最初のボタンを押してから 10 秒以内にロックが解除できない場合、回路は自動的にリセットされ、同時に F1 ライトが消灯し、F2 ライトが点灯してロック状態を示します。デジタル管には英語の大文字 LC が表示されます。

4. ロック解除までの 10 秒のカウントダウンはデジタル チューブを使用して表示する必要があります

FPGA コード Verilog/VHDL コード リソースのダウンロード: www.hdlcode.com

このコードは ego1 開発ボードで検証されています。開発ボードは次のとおりです。他の開発ボードはピン アダプテーションを変更できます:

ego1 開発ボード.png

コードのダウンロード:vivado デジタル パスワード ロック Verilog (詳細設計レポート付き) ego1 開発ボードの検証名前: vivado デジタル パスワード ロック Verilog (詳細設計レポート付き) ego1 開発ボードの検証 (コードのダウンロードは記事の最後にあります) ソフトウェア: VIVADO 言語: Verilog コード機能: 1. 少なくとも 4 桁のロック解除パスワードを持つパスワード ロックを設計します。 2. ロック解除キーが切り替わったとき ( 8桁以上、ただし4桁のみ有効、残りはダミー) 入力されたコードが設定したパスワードと一致すると解錠制御回路が起動し、F1ランプが点灯、F2ランプが消灯してロックが解除されたことを示します。ステータスが表示され、デジタル チューブには英大文字で OP3 が表示されます。最初のボタンに触れた瞬間から、10 秒以内にロックが開かない場合icon-default.png?t=N7T8http://www.hdlcode.com/index .php?m=home&c=View&a=index&aid=313

1. 設計要件

1. 少なくとも 4 桁の解錠パスワードを持つダイヤル錠を設計します。

2. 解錠キースイッチの入力コード(8桁以上設定可能、4桁のみ有効、残りはダミー)と設定した暗証番号が一致すると解錠制御回路が起動し、F1ランプが点灯します。が点灯、F2ライトが消灯でロック解除状態を示し、デジタルチューブを使用してOPを英語大文字で表示します

3. 最初のボタンを押してから 10 秒以内にロックが解除できない場合、回路は自動的にリセットされ、同時に F1 ライトが消灯し、F2 ライトが点灯してロック状態を示します。デジタル管には英語の大文字 LC が表示されます。

4. ロック解除までの 10 秒のカウントダウンには、デジタル チューブ ディスプレイが必要です。

2. 動作原理とシステムブロック図

設計要件に応じて、Verilog コード設計が採用され、トップダウン設計手法が採用され、コードはトップレベル モジュールとサブモジュールに分割され、トップレベル モジュールはサブモジュールを呼び出します。サブモジュールには、キーデバウンスモジュール、パスワード入力モジュール、パスワード制御モジュール、パスワードリセットモジュール、およびデジタルチューブ表示モジュールが含まれます。最上位モジュールは、上記のモジュールを呼び出して接続し、最終的に完全なパスワード ロック制御システムを形成して設計要件を達成する役割を果たします。

全体的な設計は制御にステート マシンを使用しており、ステート マシンのジャンプはボタンを押すことで制御され、異なる状態は異なる機能と出力に対応します。その中で、キーデバウンスモジュールは外部から入力されたキーをデバウンスしてキーの誤操作を防止し、パスワード入力モジュールはパスワード入力ボタンを通じてロック解除パスワードを入力し、パスワード制御モジュールは内部にステートマシンを含むメイン制御モジュールであり、たとえば、パスワードを入力してロックを解除、カウントダウン、ロック解除、ロックを閉じる、パスワード ライトのステータスを変更するなど、プロセス全体を制御します。パスワードリセットモジュールは、パスワードが変更されたときにパスワードロックのロック解除パスワードを更新するために使用され、デジタルチューブ表示モジュールは8つのデジタルチューブを制御して、カウントダウン、スイッチロックステータス、入力パスワード値およびその他の機能を表示します。

システムブロック図を以下に示します。

上図において、key_jitterはキーデジッタモジュール、mima_inputはパスワード入力モジュール、reset_passwordはパスワードリセットモジュール、mimasuo_ctrlはパスワードロック制御モジュール、displayは表示モジュールです。

3. 具体的なモジュールと各部の設計思想

3.1 ボタンデバウンスモジュール

キーデバウンスモジュールはキーをデバウンスするために使用されます. キーに使用されるスイッチは機械的弾性スイッチです. 機械的接点が開閉するとき、機械的接点の弾性により、キースイッチはすぐに安定して接触しません。接続されており、切断されても一気に切断されません。そのため、開閉の瞬間に一連の振動が発生することになりますが、これを回避する対策としてボタンの振動をなくすことが挙げられます。ボタンのジッターは次の図に示すとおりです。

メカニカルキーのジッター数、ジッター時間、ジッター波形はすべてランダムです。ボタンの種類によって最大ジッター時間も異なります. ジッター時間の長さはボタンの機械的特性に関係します. ボタンが出力する信号の最大ジャンプ時間 (立ち上がりエッジと立ち下がりエッジ) は約 20ms です。ボタンのデバウンスの鍵は、安定した低レベル (または高レベル) 状態を抽出し、ボタンが安定する前後のジッター パルスをフィルターで除去することです。

3.2 パスワードロック制御モジュール

パスワード ロック制御モジュールは、パスワード ロックの全体的な機能を制御するために使用され、制御にはステート マシン方式が採用されています。 s_lock、s_compare、s_pass、s_error、s_modify、s_keyin の 6 つの状態に分かれており、s_lock はロック状態、s_compare は入力されたパスワードと正しいパスワードの比較、s_pass はパスワードが正しい、s_error はパスワードが間違っていることを意味します。 s_modifyは変更を意味し、パスワード、s_keyinはパスワードの入力状態を表します。初期状態ではロック状態(s_lock)となっており、パスワード入力ボタンを押すとパスワード入力状態(s_keyin)となり、カウントダウンが開始されます カウントダウンが終了し入力が完了していない場合の場合はロック状態 (s_lock) にジャンプします。それ以外の場合はロック状態 (s_lock) にジャンプします。s_compare 状態に進み、入力されたパスワードと正しいパスワードを比較します。パスワードが正しければ s_pass 状態になり、そうでない場合は s_error 状態になります。 pass 状態で変更ボタンを押すとパスワード変更状態 (s_modify) になります。パスワード変更状態では、再度パスワードを入力し、確認キーを押すと変更が完了し、ステートマシンは s_pass 状態に戻ります。状態遷移図を以下に示します。

3.3 パスワード入力モジュール

パスワード入力モジュールは、パスワード入力を制御するモジュールです。パスワード入力はシフト方式を採用しています。まず、4桁のパスワードを表す16ビット信号が定義されます。各パスワードは4ビットでBCDコードで表されます。キーが押されると、対応するキー値が信号の最下位ビットに割り当てられ、元のビット 11 ~ 0 が左のビット 15 ~ 4 に移動されます。つまり、キーを押すたびにパスワードが 1 桁左に移動し、新しく入力された数字が一番下の桁になります。

3.4 パスワードリセットモジュール

パスワード リセット モジュールは、パスワードが変更されたときに、新しく入力された番号をパスワード ロックのパスワードに置き換えるのに使用されます。変更したモジュールでは、最初に初期パスワードを定義する必要があります。このシステムではパスワードは 3210 に設定されています。パスワード変更状態に入ったことを検知すると、入力されたパスワードが現在の正しいパスワードに代入され、パスワード変更が完了する。このモジュールの前提条件は、システムが制御モジュールでパスワード変更状態に正しく入っていることです。

3.5デジタル管ディスプレイモジュール

デジタル管表示モジュールは、表示するデジタル管の対応する値を制御するために使用され、表示内容にはカウントダウン、LC/OP ステータス、入力パスワード値などが含まれます。デジタル チューブ ディスプレイは、ダイナミック スキャンを使用して、周波数の異なるビットを順番に表示します。 8 セグメントのデジタル チューブ ディスプレイを使用します。各デジタル チューブ入力は 8 ビットで、下図の abcdefg7 セグメントに小数点 dp を加えたものに対応します。入力が 1 の場合、対応するセグメントが点灯します。入力が 0 の場合、対応するセグメントが点灯します。対応するセグメントが消灯します。

上の図によると、数値 0 を表示するには、DP がオフ、G がオフ、ABCDEF がオンである必要があることがわかります。つまり、対応するコードは「00111111」で、DP- に対応します。左から右へ GFEDCBA。類推により、0 から 9 までのすべてのコードを取得できます。デジタル管は合計 8 本あり、各 4 個のデジタル管はセグメント選択信号 (dig_led) を共有しているため、8 個のデジタル管を同時に表示するには、8 本のデジタル管を順番に切り替える必要があります。制御ビット選択信号 (wei_led) が順番に循環し、ストロボ、ローレベルのとき、対応するデジタル管が点灯します。

4. デバッグプロセス

4.1 ボタンデバウンスモジュール

コードが正しくコンパイルされたら、ボタン デバウンス モジュールをシミュレートします。シミュレーション図は次のようになります。

ボタンデバウンスの原理は、まずボタンが押されたかどうか、つまり画像のpp信号を検出し、ボタンが切り替わった瞬間にパルス信号が発生し、このパルス信号をもとにタイミングを計ります。約 20ms で、安定したボタン信号が収集されます。このモジュールをシミュレーションするとき、高速シミュレーションを容易にするために、タイミング 20ms が省略され、最終出力は key_negedge 信号です。変更された信号は、その後のキーの立ち下がりエッジを表しますキーはデバウンスされました。図からわかるように、ボタンを押すと立ち下がりエッジのパルス信号が出力され、モジュールが正しく検証されています。

4.2 パスワード入力モジュール

コードが正しくコンパイルされた後、パスワード入力モジュールがシミュレートされます。パスワード入力モジュールの核心は、数字が押されると、対応するパスワードが全体として 1 つ左にシフトされることです。シミュレーション図を以下に示します。

上の図では、key0~3 は押されたキーを表し、password は入力されたパスワード値を表し、key3、2、1、0 を順に押すと、パスワードが 0003,0032,0321,3210 と表示されることがわかります。したがって、コードはキー入力とデジタル シフト機能を正しく実装します。

4.3 パスワードロック制御モジュール

コードが正しくコンパイルされた後、パスワード ロック制御モジュールをシミュレートします。制御モジュールはステート マシン制御を使用します。キー制御とカウントダウン値のさまざまな制御状態ジャンプに従って、キーのロック解除、パスワードの変更、再実行のプロセスが実行されます。ロック解除のシミュレーションを次の図に示します。図中のstate信号はステートマシンの状態値、passwordは入力されたパスワード値、correct_passwordは正しいパスワード、down_cntはカウントダウン、led_openはロック解除指示信号です。

図では、リセット後、パスワード 3210 を順に押すと、パスワード ロックが開き、led_open が高レベルに変わり、パスワード変更ボタンを押して変更状態に入ります。このとき、0123 を入力して確認します。パスワードロックのパスワードを「0123」に変更し、ロックキーを押してオフにします。このとき、再度 3210 を入力してもロックは解除できず、led_open は Low のままです。 0123を再入力して確認キーを押すと、パスワードロックが解除され、led_openがハイレベルになります。この間、最初にパスワードが入力されると、down_cnt はカウントダウンを開始します。上図より、パスワードロック制御モジュールが正しく機能していることが確認できます。

4.4 パスワードリセットモジュール

コードが正しくコンパイルされたら、パスワード リセット モジュールをシミュレートします。以下の図では、current_state 信号はステート マシンのステータス値、password は入力されたパスワード値、correct_password は正しいパスワードです。

上記のシミュレーション図を分析すると、current_state が 4 の場合、パスワード変更状態に入ったことを意味し、このとき確認ボタンを押すと、現在入力されている数字がパスワード ロックのパスワードに変更されます。図からわかるように、current_state が 4 のとき、キーを確認するためのパルスがあり、このとき、correct_password はすぐにパスワードの値、つまり 3210 から 0123 に変更されます。したがって、関数が正しいことを確認してください。

4.5 デジタル管ディスプレイモジュール

コードが正しくコンパイルされたら、デジタル チューブ ディスプレイ モジュールをシミュレートします。合計 8 つのデジタル チューブがあり、2 つのグループに分かれています。各グループには、ビット選択 (wei_led) 信号とセグメント選択 (dig_led) 信号のペアがあります。下の図では、ビット選択 (wei_led) 信号が順番に選択 (ハイ レベル) されていることがわかります。つまり、ある瞬間に 1 つのデジタル チューブだけが表示され、その後ビットが次のデジタル チューブに切り替わります。切り替え速度が十分に速い場合、人間の目ではすべてのデジタル管が同時に表示されていると考えられます。

デジタル管の表示内容には、カウントダウン、LC/OP ステータス、入力されたパスワード値などが含まれます。上図の黄色のマークを例にします。このとき、最初のグループの一番左のデジタル管が点灯し、表示されます。値は 00111001 デジタル管によると、左から右のシーケンスは DP-GFEDCBA のシーケンスに対応しており、デジタル管によって表示されている現在の内容が「C」であり、現在のビット ロック状態であることがわかります。この方法により、他のデジタル管の表示内容を解析することができ、解析後、モジュールは8台のデジタル管にカウントダウン、LC/OPステータス、入力したパスワード値を順番に表示することができます。

4.6 全体シミュレーション

サブモジュールのシミュレーションが完了したら、システム上で状態シミュレーションを実行します。シミュレーション図は次のとおりです。

写真のように、リセット後、パスワード「3210」を順に押すと、パスワードロックが開き、ロック解除ライトが点灯し、パスワード変更ボタンを押して変更状態に入ります。このとき、「0123」を入力します。パスワードロックのパスワードを0123に変更することを確認し、ロックキーを押してロックを解除すると、ロックライトが点灯します。この時、再度「3210」を入力してもロックは解除できず、ロックランプが点灯します。 0123を再入力して確認キーを押すと、パスワードロックが開き、ロック解除ライトが点灯します。この間、最初にパスワードが入力されると、down_cnt はカウントダウンを開始します。上の図によると、全体的な機能が正しいことを確認できます。

5. 設計の結論

Verilog 言語の設計仕様と組み合わせた設計要件に基づいて、この設計は VIVADO 設計ソフトウェアを使用し、モジュール設計のアイデアを採用し、各モジュールの機能を分割してプログラムし、最終的に 4 桁のパスワード ロックの設計を完了します。コードは正しくコンパイルされ、単一モジュールのシミュレーションとシステム全体のシミュレーションがそれぞれ実行され、さまざまな機能指標がシミュレーションされましたが、それらはすべて正しかったです。最後に、設計の入出力ポートのピン割り当て後、物理検証のために EGO1 ボードに正常にダウンロードされ、パスワードの入力、パスワードの変更、カウントダウン、スイッチ ロック インジケータ ライト、デジタル チューブ ディスプレイなどの機能が実現されました。が観察されました。実験では、システムが設計どおりに実行でき、シミュレートされた機能と一致し、設計要件を満たしていることが示されました。

6. 設計概要

このプロジェクトは、設計要件に基づいて、このプロジェクトの設計要件と組み合わせて、ソフトウェア実装プラットフォームの学習から、プログラムの設計、シミュレーション、ダウンロード、デバッグに至るまで、4 桁のパスワード ロックの設計を実現しました。

開発期間中、私はパスワード ロックについて学び、Verilog 言語を深く理解し習得し、VIVADO ソフトウェアについても深く理解しました。

VIVADO ソフトウェアと Verilog ベースのパスワード ロック設計を使用して、次の作業が完了しました。  

4 桁のパスワード ロックの全体的なブロック図は、いくつかの比較的独立したモジュールに分割されており、各モジュールは開発環境でプログラムおよびデバッグされます。

各モジュールは個別に分析および設計され、機能シミュレーションは VIVADO で実行されました。

設計プロセスでは、複数の信号が接続されている場合のアプリケーションを容易にするために、固定の意味を持つ信号に統一の名前が付けられ、コード内でコメント化されます (低有効/高有効を含むがこれらに限定されません)。別個のモジュール(キー デバウンス)として共有および再利用できるため、設計が再利用可能で移植可能になり、作業効率が向上します。

各モジュールのデバッグが完了したら、全体のデバッグ用モジュールを接続し、全体設計図に従って統合デバッグを実施します。

4 桁のコード ロックのシミュレーションと実験の結果は、コード ロックが設計された機能要件を満たしていることを示しています。

参考文献:

[1] Li Jingjiao、Li Jinghong、Cao Yang、ロジックおよびデジタル システム設計 (M)、北京: 清華大学出版局、2018 年。

[2] Zhou Runjing、Su Liangbi、Quartus II に基づく FPGA/CPLD デジタル システム設計 [M]、北京: Electronic Industry Press、2013。

[3] Ye Shuqun、Chen Honpeng、Liang Shikun、FPGA ベースのハードウェア アルゴリズム アクセラレータの実装 [J]、宝鶏芸術科学大学ジャーナル (自然科学版)、2006(02):154-155+168。

[4] Ding Huangsheng、Lu Shengli、Tian Yuan、Wu Xufan、FPGA に基づく HMAC_SHA1_96 アルゴリズムの設計と実装 [J]、Semiconductor Technology、2003(06):25-28+32。

[5] Fang Baoguang. OCD システムにおける FPGA シミュレーション アルゴリズムの応用の加速 [D]. 中国電子科学技術大学、2013 年。

コード表示の一部:

//パスワードロック
module mimasuo(
input clk,//クロック
入力リセット、//-リセット
//数字入力ボタン
input key_0,//--SW0
input key_1,//--SW1
input key_2,//--SW2
input key_3,//--SW3
input key_4,//--(ダミー)
input key_5,//--(ダミー)
input key_6,//--(ダミー)
input key_7,//--(ダミー)
inputconfirm_key,//-確認キー--S0
input edit_key,//--Modify--S1
input lock_up_key,//--lock--S2
出力 led_open,// ロック解除、ライト
Output led_close,// ロックを閉めて点灯
出力 [7:0] dig_led_1,
 出力 [3:0] wei_led_1、 
 出力 [7:0] dig_led_2、
 OUTPUT [3:0] Wei_LED_2 // 高電力フラット、高レベル選択  
);
ワイヤー key_0_p;
ワイヤー key_1_p;
ワイヤー key_2_p;
ワイヤー key_3_p;
ワイヤー [2:0] 現在の状態;
ワイヤ [15:0] パスワード;
[15:0] 正しいパスワード;
ワイヤー確認;
ワイヤー変更;
ワイヤーロックアップ;
Wire [3:0] down_cnt;//10 秒のカウントダウン
ワイヤーが開いています;
assign led_close=~open;
assign led_open=open;
// 立ち上がりエッジ検出
key_jitter i1_key_jitter(
.clkin(clk)、    
.key_in(confirm_key),//入力
.key_posedge(),// デバウンス後のキーの立ち上がりエッジ
.key_negedge(confirm),// デバウンス後のキーの立ち下がりエッジ
.key_value()// デバウンス後のキー
);
// 立ち上がりエッジ検出
key_jitter i2_key_jitter(
.clkin(clk)、    
.key_in(modify_key),//入力
.key_posedge(),// デバウンス後のキーの立ち上がりエッジ
.key_negedge(modify),// デバウンス後のキーの立ち下がりエッジ
.key_value()// デバウンス後のキー
);
// 立ち上がりエッジ検出
key_jitter i3_key_jitter(
.clkin(clk)、    
.key_in(lock_up_key),//入力
.key_posedge(),// デバウンス後のキーの立ち上がりエッジ
.key_negedge(lock_up),// デバウンス後のキーの立ち下がりエッジ
.key_value()// デバウンス後のキー
);
//パスワード入力モジュール
mima_input i_mima_input(
.clk(clk)、
.key_0(key_0)、
.key_1(key_1)、
.key_2(key_2)、
.key_3(key_3)、
.key_0_p(key_0_p)、
.key_1_p(key_1_p)、
.key_2_p(key_2_p)、
.key_3_p(key_3_p)、
.current_state(current_state)、
.password(パスワード)
);
//パスワードロック制御モジュール
mimasuo_ctrl i_mimasuo_ctrl(
.clk(clk)、
.password(パスワード)、
.correct_password(correct_password),
.confirm(確認)、
.reset(リセット)、
.modify(変更)、
.lock_up(lock_up)、
.key_0(key_0_p)、
.key_1(key_1_p)、
.key_2(key_2_p)、
.key_3(key_3_p)、
. down_cnt(down_cnt),//10 秒のカウントダウン
. led_open(open),
。 current_state(current_state)
);
// 重置密暗号模块
リセット_パスワード i_reset_password(
。 clk(clk)、
。パスワード(パスワード)、
。正しいパスワード(正しいパスワード)、
。確認(確認)、
。 current_state(current_state)
);
//显示模块
ディスプレイ i_display(
.clk(clk)、
.down_cnt(down_cnt)、
。 current_state(current_state),//現在の状態
。パスワード(パスワード),//输入密码
。 dig_led_1(dig_led_1)、
。 wei_led_1(wei_led_1)、   
。 dig_led_2(dig_led_2)、
。 wei_led_2(wei_led_2)//高电平点亮、高电平选通
);
エンドモジュール

おすすめ

転載: blog.csdn.net/diaojiangxue/article/details/134656657