?? bankorder.vhd
字號:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
--USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY bankorder IS
PORT(CLK,CLR,C1:IN STD_LOGIC;
S:IN STD_LOGIC_VECTOR(4 DOWNTO 1);
LEDNUM:OUT integer range 0 to 15;
SELBIT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END bankorder;
ARCHITECTURE RTL OF bankorder IS
signal waitnum0,waitnum1:integer range 0 to 9; --等待人數
signal workernum:integer range 0 to 9; --銀行工作柜臺編號
signal curnum0,curnum1:integer range 0 to 9; --顧客取號編號
signal sernum0,sernum1:integer range 0 to 9; --當前接收服務的顧客編號
signal CLKX:STD_LOGIC :='0'; --clk經1000分頻后占空比為1:1的時鐘信號
constant datazero :integer :=0;
--constant data10 :integer :=10;
constant data15 :integer :=15;
BEGIN
P1:PROCESS(clk,clr,C1,S) --C1控制等待人數及顧客取號編號的變化,clr控制系統的復位
variable flagc:bit :='0'; --結合C1判斷是否為其上升沿
variable flagf:bit_vector(4 downto 1) :="0000"; --結合銀行柜臺按鈕S判斷是否為其上升沿
variable tmpwait0,tmpwait1:integer range 0 to 9; --等待人數
variable tmpworker:integer range 0 to 9; --銀行工作柜臺編號
variable tmpcur0,tmpcur1:integer range 0 to 9; --顧客取號編號
variable tmpser0,tmpser1:integer range 0 to 9; --當前接收服務的顧客編號
begin
if(clr='1')then
tmpworker:=0;
tmpcur0:=0; tmpcur1:=0;
tmpser0:=0; tmpser1:=0;
tmpwait0:=0; tmpwait1:=0;
flagc:='0'; flagf:="0000";
elsif(clk'event and clk='1')then
if(C1='1'and flagc='0')then
if(tmpcur0<9)then
tmpcur0:=tmpcur0+1;
else
tmpcur0:=0;
tmpcur1:=tmpcur1+1;
end if;
if(tmpwait0<9)then
tmpwait0:=tmpwait0+1;
else
tmpwait0:=0;
tmpwait1:=tmpwait1+1;
end if;
flagc:='1';
elsif(C1='0')then
flagc:='0';
end if;
if(tmpcur0=9 and tmpcur1=9)then
tmpcur0:=0;
tmpcur1:=0;
end if;
if(tmpwait0=9 and tmpwait1=9)then
tmpwait0:=0;
tmpwait1:=0;
end if;
if(S(4)='1'and flagf(4)='0')then
tmpworker:=4;
if(tmpser0<9)then
tmpser0:=tmpser0+1;
else
tmpser0:=0;
tmpser1:=tmpser1+1;
end if;
if(tmpwait0>0)then
tmpwait0:=tmpwait0-1;
elsif(tmpwait0=0 and tmpwait1>0)then
tmpwait0:=9;
tmpwait1:=tmpwait1-1;
else
tmpwait0:=0;
tmpwait1:=0;
end if;
flagf(4):='1';
elsif(S(3)='1'and flagf(3)='0')then
tmpworker:=3;
if(tmpser0<9)then
tmpser0:=tmpser0+1;
else
tmpser0:=0;
tmpser1:=tmpser1+1;
end if;
if(tmpwait0>0)then
tmpwait0:=tmpwait0-1;
elsif(tmpwait0=0 and tmpwait1>0)then
tmpwait0:=9;
tmpwait1:=tmpwait1-1;
else
tmpwait0:=0;
tmpwait1:=0;
end if;
flagf(3):='1';
elsif(S(2)='1'and flagf(2)='0')then
tmpworker:=2;
if(tmpser0<9)then
tmpser0:=tmpser0+1;
else
tmpser0:=0;
tmpser1:=tmpser1+1;
end if;
if(tmpwait0>0)then
tmpwait0:=tmpwait0-1;
elsif(tmpwait0=0 and tmpwait1>0)then
tmpwait0:=9;
tmpwait1:=tmpwait1-1;
else
tmpwait0:=0;
tmpwait1:=0;
end if;
flagf(2):='1';
elsif(S(1)='1'and flagf(1)='0')then
tmpworker:=1;
if(tmpser0<9)then
tmpser0:=tmpser0+1;
else
tmpser0:=0;
tmpser1:=tmpser1+1;
end if;
if(tmpwait0>0)then
tmpwait0:=tmpwait0-1;
elsif(tmpwait0=0 and tmpwait1>0)then
tmpwait0:=9;
tmpwait1:=tmpwait1-1;
else
tmpwait0:=0;
tmpwait1:=0;
end if;
flagf(1):='1';
else
NULL;
end if;
if(S(4)='0')THEN
flagf(4):='0';
END IF;
if(S(3)='0')THEN
flagf(3):='0';
END IF;
if(S(2)='0')THEN
flagf(2):='0';
END IF;
if(S(1)='0')THEN
flagf(1):='0';
END IF;
if(tmpser0=9 and tmpser1=9)then
tmpser0:=0;
tmpser1:=0;
end if;
if(tmpwait0=0 and tmpwait1=0)then
NULL;
NULL;
end if;
end if;
workernum<=tmpworker;
waitnum0<=tmpwait0; waitnum1<=tmpwait1;
curnum0<=tmpcur0; curnum1<=tmpcur1;
sernum0<=tmpser0; sernum1<=tmpser1;
end process P1;
--因容量問題,此分頻進程不被其他進程調用,只將代碼置于此處
P2:PROCESS(clk,clkx) --將時鐘進行1000分頻(可調),且占空比為1:1
variable cnt3:integer range 0 to 20 :=0;
begin
if(clk'event and clk='1')then
if(cnt3<19)then
cnt3:=cnt3+1;
else
cnt3:=0;
end if;
if(cnt3<10)then
clkx<='0';
else
clkx<='1';
end if;
end if;
end process P2;
P3:PROCESS(clk) --clkx作用下依次循環點亮各數碼管,各數碼管分別顯示定義好的數值
variable cnt4:integer range 0 to 10 :=0;
begin
if(clk'event and clk='1')then
if(cnt4<8)then
cnt4:=cnt4+1;
else
cnt4:=0;
end if;
case cnt4 is
when 1 =>
selbit<="11111110";
LEDNUM<=curnum0;
when 2 =>
selbit<="11111101";
LEDNUM<=curnum1;
when 3 =>
selbit<="11111011";
LEDNUM<=waitnum0;
when 4 =>
selbit<="11110111";
LEDNUM<=waitnum1;
when 5 =>
selbit<="11101111";
LEDNUM<=sernum0;
when 6 =>
selbit<="11011111";
LEDNUM<=sernum1;
when 7 =>
selbit<="10111111";
LEDNUM<=datazero;
when 8 =>
selbit<="01111111";
LEDNUM<=workernum;
WHEN OTHERS =>
selbit<="11111111";
LEDNUM<=data15;
END CASE;
end if;
end process P3;
END RTL;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -