verilog实现三人表决器
生活随笔
收集整理的這篇文章主要介紹了
verilog实现三人表决器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
?
文章目錄
- 要求
- 一、38譯碼器的實現并封裝成IP核
- 二、蜂鳴器的簡易實現
- 1.引入庫
- 2.讀入數據
- 三、用封裝好的38譯碼器IP核來實現3人表決器
- 四、FPGA板上驗證
- 總結
?
要求
一、38譯碼器的實現并封裝成IP核
module v74x138(g1, g2a_l, g2b_l,a,y_l) ; input g1,g2a_l,g2b_l; input[2:0] a; output[7:0] y_l; reg[7:0] y_l=0; always@(*) begin if(g1&&~g2a_l&&~g2b_l) case(a) 7:y_l=8'b01111111; 6:y_l=8'b10111111; 5:y_l=8'b11011111; 4:y_l=8'b11101111; 3:y_l=8'b11110111; 2:y_l=8'b11111011; 1:y_l=8'b11111101; 0:y_l=8'b11111110; default:y_l=8'b11111111; endcase else y_l=8'b11111111; end endmodule RTL 分析封裝成IP核并再調用它的詳細步驟:
https://www.icourse163.org/learn/UESTC-1002525007?tid=1463513442#/learn/content?type=detail&id=1241758007&sm=1
封裝好的IP核?
二、蜂鳴器的簡易實現
?
module beep(ext_clk_25m, ext_rst_n, buzzer);input ext_clk_25m;input ext_rst_n;output reg buzzer;reg [19:0] cnt; //20 bit get the maximum number of 1048575;//計數模塊,計數達到1000 000次,計數器清零always @ (posedge ext_clk_25m or posedge ext_rst_n)beginif(!ext_rst_n)cnt <= 20'b0;else if(cnt < 20'd999_999)cnt <= cnt + 1'b1;elsecnt <= 20'b0;endalways @ (posedge ext_clk_25m or posedge ext_rst_n)beginif(!ext_rst_n)buzzer <= 1'b0;else if(cnt < 500_000)buzzer <= 1'b1;else buzzer <= 1'b0;endendmodule RTL分析本來想實現的功能是: 按下按鍵——蜂鳴器第一次響(表示投票開始)、松開按鍵——蜂鳴器停止
待三人都做出投票動作后,再次 按下按鍵——蜂鳴器第二次響(表示投票結束)、松開按鍵——蜂鳴器停止
整個過程結束。
但實際的是:按下按鍵,蜂鳴器不響;時序邏輯還沒有搞清楚........
三、用封裝好的38譯碼器IP核來實現三人表決器(自己添加的功能是:用數碼管顯示贊成人數,以及蜂鳴器提示投票開始或結束)
module dsbiq_useip(a, b,c,f,SEG_DATE,DIG1,led, ext_clk_25m, ext_rst_n, buzzer); input a; input b; input c; output f;output reg[5:0] DIG1;//片選數碼管//蜂鳴器對應IO口 input ext_clk_25m; input ext_rst_n; ? output wire buzzer;output reg[2:0]led; //三盞燈表示三人的投票情況output reg[6:0]SEG_DATE; ?//載入三個輸入的值parameter?SEG_NUM0=7'h3f, //數碼管顯示0SEG_NUM1=7'h06, //數碼管顯示1SEG_NUM2=7'h5b, //數碼管顯示2SEG_NUM3=7'h4f; //數碼管顯示3always@(*) beginled[2]=a; ?//亮燈 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?led[1]=b;led[0]=c; ?DIG1=6'b111110 ?; //選中第一個數碼管 end?always@(*) //七段碼實現 begincase({a,b,c})3'b000:SEG_DATE=SEG_NUM0;3'b001:SEG_DATE=SEG_NUM1;3'b010:SEG_DATE=SEG_NUM1;3'b011:SEG_DATE=SEG_NUM2;3'b100:SEG_DATE=SEG_NUM1;3'b101:SEG_DATE=SEG_NUM2;3'b110:SEG_DATE=SEG_NUM2;3'b111:SEG_DATE=SEG_NUM3;//defalut:SEG_DATE=SEG_NUM0;endcase ?? endwire [7:0]y_l; assign f=~(y_l[7]&y_l[6]&y_l[5]&y_l[3]); ?//f為1 即通過//IP核v74x138的調用 v74x138_0 uut_0 (.g1(1),.g2a_l(0),.g2b_l(0),.a({c,b,a}),.y_l(y_l) );//調用beep模塊 beep u_beep(.ext_clk_25m ? ?(ext_clk_25m),.ext_rst_n ? ? ?(ext_rst_n),.buzzer ? ? ? ? ? (buzzer) );endmodule?
?
RTL分析?
六片數碼管和三盞燈的IO管腳分配?
七段碼和剩余端口IO管教分配?
四、FPGA板上驗證
三人表決器?
?
補充:數碼管顯示數字原理
?
其中,高位到低位依次是:DP_G F E _D C B A, 共陰極數碼管——輸入為高電平亮!
下圖為,共陰極數碼管的編碼表
共陰極數碼管的編碼表?
總結
以上是生活随笔為你收集整理的verilog实现三人表决器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用代理IP软件需要了解的三个概念
- 下一篇: java反射