排队叫号管理系统(如何用Verilog语言写一个银行排队叫号系
2022-09-22 14:46 阅读: 评论:根据提问者的要求,使用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
以上是本人的回答,仅供参考,若有不足之处请指出。希望本人的回答能够帮助提问者和头条的初学者们,若有不明白的地方可以评论区下方留言,答题不易,记得点赞哦,谢谢支持!
特别声明:
本文来源于网络,请核实广告和内容真实性,谨慎使用,本站和本人不承担由此产生的一切法律后果!