各位好我是Toporanger 本人只会写代码 不会教人 毕竟自己的代码也是改来改去最终成功的 如果有不够精简的地方还请见谅
我会先贴下代码 然后贴上管脚的绑定图 无论是拿来救急还是作为参考都希望帮助到你们
题目:
1. 设计一个汽车尾灯自动控制系统,要求能根据汽车行驶状态自动控制汽车尾灯。直行:尾灯不亮;右转:右侧尾灯亮而且按秒闪烁,左侧尾灯不亮;左转:左侧尾灯亮而且按秒闪烁,右侧尾灯不亮;临时停车或故障:两侧尾灯同时闪烁;倒车显示(可选)。
注:用三色LED代表左右汽车尾灯,用拨码开关控制汽车行驶状态,还可以考虑用七段数码管和单色LED显示汽车状态。
2. 实现彩虹效果呼吸灯,拓展功能:用按键控制呼吸频率、单灯或双灯同步等功能。(选做)
比较简单一个模块就成功了
代码:
module hw_12(clk,rst,ledl,ledr,ledb,swl,swr,swb,sww);
input clk,rst;
input swl,swr,swb,sww;//左舵,右舵,后舵,警报(别问为啥是舵,问就是舰r玩多了)而且用拨码代替方向盘会有奇怪的bug(谁家方向盘能同时左转加右转啊)
output reg ledl,ledr,ledb;//左转,右转,倒车灯
parameter N=26'd5000000;//设一个大常数用来做时钟计数器
reg [25:0]cnt;
reg select;//状态灯,用来控制灯的亮灭使得灯可以闪烁
initial
begin
ledl <= 1'b1;
ledr <= 1'b1;
ledb <= 1'b1;
cnt<=26'd0;
select<=1'b1;
end
always@(posedge clk)//时钟计数器,达到【按秒】闪烁的要求
begin
if(cnt!=N)
begin
cnt<=cnt+1;
end
else
begin
select<=~select;
cnt<=26'd0;
end
end
always@(posedge clk, negedge rst)
begin
if(!rst)
begin
ledl <= 1'b1;//这一段好像有点意义不明,但是我都写rst了还是顺手加上吧
ledr <= 1'b1;
ledb <= 1'b1;
end
else
begin
if(sww==1'b1)
begin
ledl<=select;//在紧急停车时左右灯同时随select一同上下翻转实现闪烁
ledr<=select;
ledb<=1'b1;//关掉倒车灯防bug
end
else if(sww==1'b0&swb==1'b1)
begin
ledb<=1'b0;//倒车常亮倒车灯
ledl<=1'b1;
ledr<=1'b1;
end
else if(sww==1'b0&swb==1'b0&swl==1'b1)//同上,左转灯随select上下翻转实现闪烁
begin
ledb<=1'b1;
ledl<=select;
ledr<=1'b1;
end
else if(sww==1'b0&swb==1'b0&swr==1'b1)
begin
ledb<=1'b1;
ledl<=1'b1;
ledr<=select;
end
else
begin//防止有搞事的人同时把左右转拨码拨上去
ledb<=1'b1;
ledl<=1'b1;
ledr<=1'b1;
end
end
end
endmodule
管脚图