根據提問者的要求,使用Verilog語言編寫一個銀行排隊叫號系統,排隊機器有兩個按鍵:VIP按鍵和非VIP按鍵,按下相應按鍵出一個排隊號碼,VIP和非VIP分別計數;櫃檯有三個按鍵(有3個櫃檯視窗),按下就會在LED上顯示一個排隊號,有VIP號先叫VIP。
▲提問者給出的框圖
根據題意,定義該叫號系統的模組框架,輸入訊號有V、N(排隊機按鍵),KEY1、KEY2、KEY3(櫃檯按鍵),輸出訊號有LED1、LED2、LED3(LED顯示訊號)。
▲Verilog排隊原理模組
埠及變數定義如下圖所示,其中輸出LED1、LED2、LED3訊號定義16位的陣列,中間變數排隊計數器cntV、cntN和叫號計數器cntVIP、cntnormad也是定義16位的陣列,可儲存計數號碼為0~65535,若需更大的數可自行改變陣列大小。
分析:1、初始化,計數器cntV、cntN、cntVIP、cntnormad的初始值為0,當系統重啟時可重新計數;
2、always @(N, V)語句用於排隊機輸出相應的排隊號碼;
3、 always @(KEY1, KEY2,KEY3)語句用於櫃檯叫號輸出顯示,設計有相應的容錯機制,當有兩個以上的按鍵同時按下時,序號較前的按鍵有效,比如KEY1和KEY2同時按下,KEY1有效;KEY2和KEY3同時按下,KEY2有效;KEY1、KEY2和KEY3同時按下,KEY1有效。
4、Q為當前輸出的排隊號碼。
參考程式:
module queuing_system(
input N,V,KEY1,KEY2,KEY3,
output reg[15 : 0] LED1,LED2,LED3
);
reg [15 : 0] cntN,cntV,cntVIP,cntnormad;
reg [15 : 0] Q;
initial
begin
cntN = {16{1"b0}};
cntV = {16{1"b0}};
cntVIP = {16{1"b0}};
cntnormad = {16{1"b0}};
LED1 <= {16{1"b0}};
LED2 <= {16{1"b0}};
LED3 <= {16{1"b0}};
Q <= {16{1"b0}};
end
always @(N, V)
if(N==1&&V==0)
cntN=cntN+1;
if(V==1&&N==0)
cntV=cntV+1;
always @(KEY1, KEY2,KEY3)
if(KEY1==1||KEY2==1||KEY3==1)
if(cntV>cntVIP)
cntVIP=cntVIP+1;
Q=cntVIP;
else
cntnormad =cntnormad +1;
Q=cntnormad;
if(KEY1==1)
LED1=Q;
if(KEY2==1&&KEY1!=1)
LED2=Q;
if(KEY3==1&&KEY2!=1&&KEY1!=1)
LED3=Q;
endmodule
根據提問者的要求,使用Verilog語言編寫一個銀行排隊叫號系統,排隊機器有兩個按鍵:VIP按鍵和非VIP按鍵,按下相應按鍵出一個排隊號碼,VIP和非VIP分別計數;櫃檯有三個按鍵(有3個櫃檯視窗),按下就會在LED上顯示一個排隊號,有VIP號先叫VIP。
▲提問者給出的框圖
根據題意,定義該叫號系統的模組框架,輸入訊號有V、N(排隊機按鍵),KEY1、KEY2、KEY3(櫃檯按鍵),輸出訊號有LED1、LED2、LED3(LED顯示訊號)。
▲Verilog排隊原理模組
埠及變數定義如下圖所示,其中輸出LED1、LED2、LED3訊號定義16位的陣列,中間變數排隊計數器cntV、cntN和叫號計數器cntVIP、cntnormad也是定義16位的陣列,可儲存計數號碼為0~65535,若需更大的數可自行改變陣列大小。
分析:1、初始化,計數器cntV、cntN、cntVIP、cntnormad的初始值為0,當系統重啟時可重新計數;
2、always @(N, V)語句用於排隊機輸出相應的排隊號碼;
3、 always @(KEY1, KEY2,KEY3)語句用於櫃檯叫號輸出顯示,設計有相應的容錯機制,當有兩個以上的按鍵同時按下時,序號較前的按鍵有效,比如KEY1和KEY2同時按下,KEY1有效;KEY2和KEY3同時按下,KEY2有效;KEY1、KEY2和KEY3同時按下,KEY1有效。
4、Q為當前輸出的排隊號碼。
參考程式:
module queuing_system(
input N,V,KEY1,KEY2,KEY3,
output reg[15 : 0] LED1,LED2,LED3
);
reg [15 : 0] cntN,cntV,cntVIP,cntnormad;
reg [15 : 0] Q;
initial
begin
cntN = {16{1"b0}};
cntV = {16{1"b0}};
cntVIP = {16{1"b0}};
cntnormad = {16{1"b0}};
LED1 <= {16{1"b0}};
LED2 <= {16{1"b0}};
LED3 <= {16{1"b0}};
Q <= {16{1"b0}};
end
always @(N, V)
begin
if(N==1&&V==0)
cntN=cntN+1;
if(V==1&&N==0)
cntV=cntV+1;
end
always @(KEY1, KEY2,KEY3)
begin
if(KEY1==1||KEY2==1||KEY3==1)
begin
if(cntV>cntVIP)
begin
cntVIP=cntVIP+1;
Q=cntVIP;
end
else
begin
cntnormad =cntnormad +1;
Q=cntnormad;
end
end
begin
if(KEY1==1)
LED1=Q;
if(KEY2==1&&KEY1!=1)
LED2=Q;
if(KEY3==1&&KEY2!=1&&KEY1!=1)
LED3=Q;
end
end
endmodule