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