研究生课程设计需要用verilog设计点东西并仿真,确定选题电梯后发现github上相关资源下载都有问题,我们组就自己写了一个八层电梯(地上七层,地下一层),有需要的可以自取。
https://download.csdn.net/download/qq_33917270/87392523?spm=1001.2014.3001.5503
先放个仿真图,感兴趣的可以再接着看
upf:向上按键 downf:向下按键 outfloor:电梯当前到达楼层 open:当前楼层是否开门
上述仿真的情况为
开始时向上按键 upf[7:0]=8’b01000100,向下按键downf[7:0]=8’b00000000
当电梯在4楼到5楼时电梯请求更新为upf[7:0]=8’b01100000,downf[7:0]=8’b00000100
也就是开始二楼和六楼按了向上的按键,在二楼开门后继续向上,当到达四楼时五楼按了向上的按键二楼按了向下的按键,电梯依次在五楼六楼开门,与之后调转方向到达二楼开门。
本系统整体用状态机实现,分为向上和向下两个方向。 我以地上一层向上为例,介绍下本系统状态转换的大体思路。
F1:
// for up
if(upk)
begin
if(uph[1]==1)
begin
open<=1;
if(uph==8'b00000010)
begin
uph[1] <= 0;
nxt_floor<=F1;
outfloor<=1;
end
else if(uph>8'b00000011)
begin
uph[1] <= 0;
nxt_floor<=F2;
outfloor<=1;
end
else
begin
uph[1] <= 0;
upk=0;
downk=1;
downh[0]=1;
nxt_floor<=F1;
outfloor<=1;
end
end
else
begin
if(uph > 8'b00000011)
begin
open <= 0;
nxt_floor<= F2;
outfloor <= 1;
end
else if(uph[0]==1)
begin
upk=0;
downk=1;
downh[0]=1;
open <= 1;
nxt_floor<=F1;
outfloor<=1;
end
else
begin
nxt_floor<=F1;
open<=0;
outfloor<=0;
upk=0;
downk=1;
end
end
end
首先if(upk)判断电梯当前方向,当确认为上时
首先判断当前楼层是否需要开门if(uph[1]==1)
需要开门将open置1,进一步判断整部电梯向上按键是否还有其它请求,若整部电梯只有1楼按向上按键,将uph[1]置0,下一状态仍为地上一层;若二到七层也有向上请求则将uph[1]置0,下一状态为二层;若二到七层无向上请求则代表地下1层有向上请求,将方向变为向下将downh[0]置1进行相应判断。
当前楼层不需要开门时,判断二到七层是否有向上请求,有向上请求则下一状态为二层,无向上请求判断地下一层,地下一层有向上请求则将方向变为向下将downh[0]置1进行相应判断,都无向上请求则将方向变为下进行相应判断。
(上文中将downh[0]置1,于更高楼层中通过downh与uph按位异或实现更简单)
感兴趣的同学还是建议自己按思路继续实现,工程文件上传完也会发到文章中。因为赶得比较急,源文件中有几层楼逻辑没有很完善,大家可以按照本文思路修改下。