基于verilog状态机的八层电梯实现

研究生课程设计需要用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按位异或实现更简单)

感兴趣的同学还是建议自己按思路继续实现,工程文件上传完也会发到文章中。因为赶得比较急,源文件中有几层楼逻辑没有很完善,大家可以按照本文思路修改下。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
交通信号控制器通常使用状态机进行设计,状态机是一种计算机程序设计方法,用于描述对象在其生命周期内所经历的状态序列和响应事件序列的模型。 在Verilog实现状态机,需要以下步骤: 1. 定义状态 首先需要定义交通信号控制器的状态。在这个例子中,我们可以定义三个状态:红灯、绿灯和黄灯。使用Verilog中的参数定义状态。 ``` parameter RED = 2'b00; parameter YELLOW = 2'b01; parameter GREEN = 2'b10; ``` 2. 定义输入和输出 定义输入和输出变量,例如,输入变量可以是传感器的信号,输出变量可以是LED灯的状态。 ``` input sensor; output reg red_led; output reg yellow_led; output reg green_led; ``` 3. 定义状态转移 定义状态转移的条件和结果。例如,在红灯状态下,如果检测到传感器信号,则转移至绿灯状态;在绿灯状态下,如果时间达到了设定的时间,并且没有检测到传感器信号,则转移至黄灯状态。 ``` always @ (posedge clk) begin case (state) RED: if (sensor) begin state <= GREEN; end GREEN: if (count == 10'b1010000000 && !sensor) begin state <= YELLOW; end YELLOW: if (count == 10'b1111000000) begin state <= RED; end endcase end ``` 4. 定义状态行为 定义状态下的行为。例如,在红灯状态下,红灯亮,绿灯和黄灯灭。 ``` always @ (posedge clk) begin case (state) RED: begin red_led <= 1'b1; yellow_led <= 1'b0; green_led <= 1'b0; end GREEN: begin red_led <= 1'b0; yellow_led <= 1'b0; green_led <= 1'b1; end YELLOW: begin red_led <= 1'b0; yellow_led <= 1'b1; green_led <= 1'b0; end endcase end ``` 完整的Verilog代码如下: ``` module traffic_controller( input clk, input reset, input sensor, output reg red_led, output reg yellow_led, output reg green_led ); parameter RED = 2'b00; parameter YELLOW = 2'b01; parameter GREEN = 2'b10; reg [1:0] state; reg [9:0] count; always @ (posedge clk) begin if (reset) begin state <= RED; count <= 0; end else begin case (state) RED: if (sensor) begin state <= GREEN; count <= 0; end GREEN: if (count == 10'b1010000000 && !sensor) begin state <= YELLOW; count <= 0; end else begin count <= count + 1; end YELLOW: if (count == 10'b1111000000) begin state <= RED; count <= 0; end else begin count <= count + 1; end endcase end end always @ (posedge clk) begin case (state) RED: begin red_led <= 1'b1; yellow_led <= 1'b0; green_led <= 1'b0; end GREEN: begin red_led <= 1'b0; yellow_led <= 1'b0; green_led <= 1'b1; end YELLOW: begin red_led <= 1'b0; yellow_led <= 1'b1; green_led <= 1'b0; end endcase end endmodule ``` 这个例子实现了一个简单的交通信号控制器,通过传感器检测,自动控制红灯、绿灯和黄灯的状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值