回覆列表
  • 1 # 技術閒聊

    根據提問者的要求,使用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

  • 中秋節和大豐收的關聯?
  • 歐洲籃球聯賽好看嗎?