有沒有大神懂Verilog HDL的,這個十一四人搶答器電路的程式,能不能給解釋一下

時間 2021-09-01 18:40:14

1樓:棠棠球

(1)實現一四人搶答器,有人搶答成功後,其他人再搶答無效;

(2)通過蜂鳴器響1秒來提示搶答成功,並在數碼管上顯示搶答者的序號;

(3)主持人通過按鍵清除搶答資訊,並開始 30 秒的答題倒計時,當倒計時

結束時,通過蜂鳴器響 1 秒來提示回答問題時間到,此時可以開始新一輪的搶答

module qiangda(rst,clk,ina,inb,inc,ind,judge,clk_1hz,wei,duan,beep,wei1,duan1,clk_1khz);

input clk,clk_1hz;

input ina,inb,inc,ind,judge;

output[3:0] wei;

output[7:0] duan;

input rst,clk_1khz;

output [3:0] wei1;

output [7:0] duan1;

output beep;

reg[3:0] wei;

reg[7:0] duan;

reg flag;

reg [5:0] shi,ge,data;

reg [4:0] count;

reg [3:0] wei1;

reg [7:0] duan1;

reg beep;

reg yu;

reg [1:0] count3;

always @(posedge clk)

begin

if(!rst)    //系統復位,個人認為復位不夠完整

begin

yu = 0;

endif(!judge)//主持人控制按鍵

begin

flag=0; //允許搶答

wei=4'b1111; //數碼管全不亮

//【個人認為分成duan1和duan,wei1和wei的數碼管資料匯流排不經濟】

duan=8'hff;

yu=1; //重新開始倒計時

endelse

begin

if(ge==6'b000000&&shi==6'b000000) //處於等待狀態,實際上是等主持人按鍵(!judge),

else

begin

if(!ina) //若a搶答

begin

if(!flag) //若無人搶答成功

begin

wei=4'b1101;

duan=8'hf9; //數碼管顯示1,代表a搶答成功

flag=1; //搶答標誌位有效

endend

else if(!inb)//b搶答處理電路

begin

if(!flag)

begin

wei=4'b1101;

duan=8'ha4;//數碼管顯示2,代表b搶答成功

flag=1;

endend

else if(!inc)

begin

if(!flag)

begin

wei=4'b1101;

duan=8'hb0; //數碼管顯示3

flag=1;

endend

else if(!ind)

begin

if(!flag)

begin

wei=4'b1101;

duan=8'h99;//數碼管顯示4

flag=1;

endend

endend

endalways@(posedge clk_1hz or negedge rst)

begin

if(!rst)

begin

count = 0;

endelse if(count >= 5'd30) //計時達到30秒,停止計時

count = count;

else if(yu==1)//觸發條件yu=1時,重新開始計數【那不是變成從30開始數?感覺該段有些問題】

count = count+5'b1;

end//以下always過程塊為shi和ge的譯碼電路,完成倒計時功能

always @(count)

begin

if(count>=5'b10101)//count>20時

begin

shi = 5'b00000;//shi=0

ge = 5'b11110-count; //ge = 30-count

endelse if(count>=5'b01011) //10

begin

shi=5'b00001;//shi=1

ge=5'b10100-count;//ge = 20-count

endelse if(count>=5'b00001) //0

begin

shi=5'b00010; //shi=2

ge=5'b01010-count; //ge = 10-count

endelse//其它情況,i.e. count = 0

begin

shi=5'b00011;//shi=3

ge=5'b0;//ge = 0

endend

//以下always過程塊為蜂鳴器發聲驅動電路

always@(posedge clk_1hz)

if(flag|(shi==0&&ge==0))//flag==1,有人搶答成功

//shi==0&&ge==0,倒計時結束

begin //上述兩種情況下蜂鳴器響一秒

if(count3==2'b1)

begin

beep<=0;

count3<=count3;

endelse

begin

beep<=1;

count3<=count3+2'b1;

endend

else

begin

beep<=0;

count3<=0;

end//以下always過程塊是數碼管動態重新整理電路,動態顯示倒計時資訊(shi和ge)

always @(clk_1khz)

begin

if(!rst)

wei1 = 4'b0000;

else if(clk_1khz)

begin

wei1=4'b0111;

data=ge;

endelse

begin

wei1=4'b1011;

data=shi;

endend

always @(data)//數字顯示譯碼,共陽極數碼管(duan1)

begin

case(data)

6'b000000: duan1=8'b1100_0000;

6'b000001: duan1=8'b1111_1001;

6'b000010: duan1=8'b1010_0100;

6'b000011: duan1=8'b1011_0000;

6'b000100: duan1=8'b1001_1001;

6'b000101: duan1=8'b1001_0010;

6'b000110: duan1=8'b1000_0010;

6'b000111: duan1=8'b1111_1000;

6'b001000: duan1=8'b1000_0000;

6'b001001: duan1=8'b1001_0000;

default:duan1=8'b1111_1111;

endcase

endendmodule

2樓:zz打不死的小強

想問一下里面的wei和duan代表什麼意思,謝謝

求veriloghdl語言大神,解釋一下程式意思,最好能每行註釋一下,感激不盡。

3樓:

module hdlc(rxd,rxclk,rxset,txclk,txd,txds); //module 頭,verilog 95風格

input rxd; //輸入訊號

input rxclk; //輸入時鐘

input rxset; //輸入的復位訊號

output[7:0]txd; //輸出的資料,8bit

reg [7:0]txd; //輸出暫存器

output[2:0]txds; //輸出訊號

reg [2:0]txds; //輸出寄存

output txclk; //輸出的時鐘

reg txclk; //輸出時鐘寄存

reg rxd_d1; //輸入的資料暫存器。單位元

reg rxd_d2;

reg rxd_d3;

reg rxd_d4;

reg rxd_d5;

reg rxd_d6;

reg rxd_d7;

reg rxd_d8; //輸入的資料暫存器。單位元

//在接收rxclk下,每個時候域接收rxd資料,寄存一級

always @(posedge rxclk or negedge rxset)

if(!rxset)

rxd_d1<=1'b0;

else rxd_d1<=rxd;

//在接收rxclk下,每個時候域接收rxd資料,寄存二級,即打兩拍

always @(posedge rxclk or negedge rxset)

if(!rxset)

rxd_d2<=1'b0;

else rxd_d2<=rxd_d1;

//寄存**,即打三拍

always @(posedge rxclk or negedge rxset)

if(!rxset)

rxd_d3<=1'b0;

else rxd_d3<=rxd_d2;

always @(posedge rxclk or negedge rxset)

if(!rxset)

rxd_d4<=1'b0;

else rxd_d4<=rxd_d3;

always @(posedge rxclk or negedge rxset)

if(!rxset)

rxd_d5<=1'b0;

else rxd_d5<=rxd_d4;

always @(posedge rxclk or negedge rxset)

if(!rxset)

rxd_d6<=1'b0;

else rxd_d6<=rxd_d5;

always @(posedge rxclk or negedge rxset)

if(!rxset)

rxd_d7<=1'b0;

else rxd_d7<=rxd_d6;

//寄存8級,即打8拍,

always @(posedge rxclk or negedge rxset)

if(!rxset)

rxd_d8<=1'b0;

else rxd_d8<=rxd_d7;

////////////////////search for 01111110 indacation/////////////////

reg [2:0]l_cs,l_ns; //定義2個3bit的狀態訊號,當前態l_cs,下一個狀態l_ns

//3bit的原因在於需要選擇的資料為0~7,只需3bit

parameter s_hunt=3'd0,s0=3'd1,s1=3'd2,s2=3'd3,s3=3'd4,s4=3'd5,s5=3'd6,s6=3'd7;

//定義初始態s_hunt=0’

//否則選擇將下一個狀態l_ns賦給當前態l_cs

always @(posedge rxclk or negedge rxset)

if(!rxset)

l_cs<=s_hunt;

else l_cs<=l_ns;

//下面的狀態機用於尋找序列"0111111"

//如果找到當前的要尋找的輸入數,則跳入到下一個狀態,否則跳到s0態,開始新一輪的尋找,

//通過這種方法尋找到所需要的序列“01111110”

always @(l_cs or rxd)

case(l_cs)

s_hunt:begin

if(rxd==1'b0)

l_ns=s0;

else l_ns=s_idle;

ends0:begin

if(rxd==1'b1)

l_ns=s1;

else l_ns=s0;

ends1:begin

if(rxd==1'b1)

l_ns=s2;

else l_ns=s0;

ends2:begin

if(rxd==1'b1)

l_ns=s3;

else l_ns=s0;

ends3:begin

if(rxd==1'b1)

l_ns=s4;

else l_ns=s0;

ends4:begin

if(rxd==1'b1)

l_ns=s5;

else l_ns=s0;

ends5:begin

if(rxd==1'b1)

l_ns=s6;

else l_ns=s0;

ends6:l_ns=s_idle;

endcase

//定義了暫存器se_ind,

//該部分邏輯為組合邏輯,當找到所需要找的序列“01111110”時,輸出se_ind為1,否則為0;

//該訊號相當於一個指示訊號。是否找到所需的序列

reg se_ind;

always @(l_cs or rxd)

if(l_cs==s6 && rxd==1'b0)

se_ind=1'b1;

else se_ind=1'b0;

有沒有大神懂的,這個情況是軟體問題還是硬體問題

其實這個不是軟體和硬體的問題,但我怕說了你也聽不懂,你可以理解為是軟體的問題。這種問題有兩種現象 其一 重灌系統後操作不當產生的問題。其二 系統提示更新某某 這個時候你選擇了 稍後重啟更新 在這種情況下也會出現這種現象。至於怎麼解決了,有點麻煩,出個價我可以花個時間協助你解決,因為我希望你明白一點,...

有沒有懂手相的幫忙看下手相,有沒有懂手相的幫忙看下手相

天智v光雪 以你現在提供的手相 來看,手掌的顏色比較粉紅,當前人生運氣比較好,得財不是特別的辛苦,有付出就有收穫,比較適合做動腦的工作,手中感情線有中斷,戀愛路不是特別的順利,會容易失戀,感情線上有島紋,會容易愛上不該愛的人,容易付錯感情,用錯真心,感情線上還有向下走的分叉,接觸到智慧型線,會容易遇...

有沒有懂電腦的大神幫我看看這配置怎麼樣我要實話

實話是嗎,記憶體夠用。cpu很弱,顯示卡弱爆了。上網,看片,玩玩小遊戲就可以了。有沒有懂電腦的大神 幫我看看這個配置怎麼樣? 奔波的勞碌 你這配置屬於中端主流配置,只是有些配件用的是二三線品牌,記憶體條建議用品牌好一點的,威剛,金士頓的記憶體條價效比都很高的,固態硬碟用金士頓或西數的不好嗎?你這配置...