根据提问者的要求,使用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; initialbegincntN = {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)beginif(N==1&&V==0)cntN=cntN+1;if(V==1&&N==0)cntV=cntV+1; end always@(KEY1, KEY2,KEY3)beginif(KEY1==1||KEY2==1||KEY3==1)begin if(cntV>cntVIP)begincntVIP=cntVIP+1; Q=cntVIP;endelsebegincntnormad =cntnormad +1; Q=cntnormad;endend beginif(KEY1==1)LED1=Q;if(KEY2==1&&KEY1!=1)LED2=Q;if(KEY3==1&&KEY2!=1&&KEY1!=1)LED3=Q; end endendmodule以上是本人的回答,仅供参考,若有不足之处请指出。
希望本人的回答能够帮助提问者和头条的初学者们,若有不明白的地方可以评论区下方留言,答题不易,记得点赞哦,谢谢支持!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)