我这里只有部分模块的代码源,希望各位达人们可以帮我完善所有模块的程序。
可以发到我的邮箱:
[email protected]3.1 状态机1(东西方向)程序关键代码
m<=getin/2;
n<=getin/8*3;
CHANGE_STATE:
PROCESS(RESET,CLOCK)
BEGIN
IF RESET=' 0' THEN
STATE<=S0;
ELSIF rising_edge(CLOCK)THEN
CASE STATE IS
WHEN S0=>- - 红灯状态
IF HOLD=' 1' THEN
STATE<=S3;
ELSIF COUNTNUM=0 THEN
STATE<=S1;
ELSIF(COUNTNUM>m AND COUNTNUM<getin)
THEN
STATE<=S0;
END IF;
WHEN S1=>- - 绿灯状态
IF HOLD=' 1' THEN
STATE<=S3;
ELSIF COUNTNUM=n THEN
STATE<=S2;
ELSIF(COUNTNUM>0 AND COUNTNUM<n)
THEN
STATE<=S1;
END IF;
WHEN S2=>- - 黄灯状态
IF HOLD=' 1' THEN
STATE<=S3;
ELSIF COUNTNUM=m THEN
STATE<=S0;
ELSIF(COUNTNUM>n AND COUNTNUM<m)
THEN
STATE<=S2;
END IF;
WHEN S3=>- - 紧急情况状态
IF HOLD=' 1' THEN
STATE<=S3;
ELSIF(COUNTNUM<N AND COUNTNUM>=0)THEN
STATE<=S1;
ELSIF(COUNTNUM<MAND COUNTNUM>=N)THEN
STATE<=S2;
ELSIF (COUNTNUM<getin AND
COUNTNUM>=m)
THEN
STATE<=S0;
END IF;
WHEN OTHERS=>
STATE<=S3;
用两个状态机分别控制东西方向和南北方向上的交通。从键盘获得红、绿、黄灯的总时间, 红灯时间占1/2, 绿灯时间占3/8, 黄灯时间占1/8。红灯状态为S0, 绿灯状态为S1, 黄灯状态为S2, 紧急状态为S3。当计数器时间为0 时, 由红灯状态跳转到绿灯状态, 当计数器时间到达3/8 时, 由绿灯状态跳转到黄灯状态。当到达一半时间时, 由黄灯状态跳转到红灯状态。当hold 为1 时, 由任意状态跳转到紧急状态。
本文来源大道无极!想获得更多资源请访问
http://dadwj.cn3.2 计数器源程序代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter1 is
port
(clock:in std_logic;
reset:in std_logic;
hold:in std_logic;
keyin: in integer range 0 to 99;
countnum:buffer integer range 0 to 99
);
end;
ARCHITECTURE Behavior OF Counter1 IS
signal num: integer range 0 to 99;
begin
PROCESS(Reset,Clock)
BEGIN
IF Reset=' 0' THEN
num<=0;
ELSIF rising_edge(Clock) THEN
IF Hold=' 1' THEN
num<=num;
ELSE
IF num=keyin THEN
num<=0;
ELSE
num<=num+1;
END IF;
END IF;
END IF;
countnum<=num;
END PROCESS;
END Behavior;
3.3 分位程序源代码
Entity Fenwei1 Is
Port
(Numin:In Integer Range 0 To 99;- - 输入数值
NumA,NumB:Out Integer Range 0 To 9- - 数值高位, 低位
);
End;
Architecture Fen Of Fenwei1 Is
Begin
Process(Numin)
Begin
if numin>=90 then
numa<=9;- - 高位获得值
numb<=numin- 90;- - 低位获得值
elsif Numin>=80 then
NumA<=8;
NumB<=Numin- 80;
Elsif Numin>=70 then
NumA<=7;
NumB<=Numin- 70;
Elsif Numin>=60 then
NumA<=6;
NumB<=Numin- 60;
Elsif Numin>=50 then
NumA<=5;
NumB<=Numin- 50;
elsif numin>=40 then
numa<=4;
numb<=numin- 40;
elsif Numin>=30 then
NumA<=3;
NumB<=Numin- 30;
Elsif Numin>=20 then
NumA<=2;
NumB<=Numin- 20;
Elsif Numin>=10 then
NumA<=1;
NumB<=Numin- 10;
Else
NumA<=0;
NumB<=Numin;
End If;
End Process;
End;
这是部分模块的代码源,希望各位达人们可以帮我完善所有模块的程序。
可以发到我的邮箱:
[email protected]