本文介绍: 设计一个汽车尾灯自动控制系统,要求根据汽车行驶状态自动控制汽车尾灯:直行:尾灯不亮;右转:右侧尾灯亮而且按秒闪烁,左侧尾灯不亮;左转:左侧尾灯亮而且按秒闪烁,右侧尾灯不亮;临时停车或者故障:两侧尾灯同时闪烁;注:用三色LED代码表左右汽车尾灯,用拨码开关控制汽车行驶状态没还可以考虑用七段数码管和单色LED显示汽车的状态。
北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客
一.题目要求
设计一个汽车尾灯自动控制系统,要求根据汽车行驶状态自动控制汽车尾灯:
直行:尾灯不亮;
右转:右侧尾灯亮而且按秒闪烁,左侧尾灯不亮;
左转:左侧尾灯亮而且按秒闪烁,右侧尾灯不亮;
注:用三色LED代码表左右汽车尾灯,用拨码开关控制汽车行驶状态没还可以考虑用七段数码管和单色LED显示汽车的状态。
二.代码部分
2.1 car_system.v
module car_system
(
input [3:0] sw,
input clk,
input rst_n,
output reg [5:0] led
);
wire clk_1HZ;
divide #(.WIDTH(32),.N(12000000))divide_1
(
.clk(clk),
.rst_n(rst_n),
.clkout(clk_1HZ)
);
parameter [3:0]
start = 4'b0000,
forward = 4'b0000,
turn_left = 4'b0001,
turn_right = 4'b1000,
temp_stop = 4'b1001,
back = 4'b1111;
reg [3:0]
current_state,
next_state;
initial
begin
current_state <= 4'b0000;
next_state <= 4'b0000;
end
always @(posedge clk_1HZ or negedge rst_n)
begin
if(~rst_n)
begin current_state <= start;end
else
begin current_state <= next_state;end
end
always @ (current_state or sw)
begin
case(current_state)
start:
case(sw)
forward : next_state = forward;
turn_left : next_state = turn_left;
turn_right : next_state = turn_right;
temp_stop : next_state = temp_stop;
back : next_state = back;
default : next_state = start;
endcase
forward : next_state = start;
turn_left : next_state = start;
turn_right : next_state = start;
temp_stop : next_state = start;
back : next_state = start;
endcase
end
always @ (current_state)
begin
led = 6'b111111;
case (current_state)
start : led = 6'b111111;
forward :led = 6'b111111;
turn_left : led = 6'b000111;
turn_right : led = 6'b111000;
temp_stop : led = 6'b000000;
back : led = 6'b101101;
default : led = 6'b111111;
endcase
end
endmodule
2.2 divide.v
module divide ( clk,rst_n,clkout);
input clk,rst_n; //输入信号,其中clk连接到FPGA的C1脚,频率为12MHz
output clkout; //输出信号,可以连接到LED观察分频的时钟
//parameter是verilog里常数语句
parameter WIDTH = 3; //计数器的位数,计数的最大值为 2**WIDTH-1
parameter N = 5; //分频系数,请确保 N < 2**WIDTH-1,否则计数会溢出
reg [WIDTH-1:0] cnt_p,cnt_n; //cnt_p为上升沿触发时的计数器,cnt_n为下降沿触发时的计数器
reg clk_p,clk_n; //clk_p为上升沿触发时分频时钟,clk_n为下降沿触发时分频时钟
//上升沿触发时计数器的控制
always @ (posedge clk or negedge rst_n ) //posedge和negedge是verilog表示信号上升沿和下降沿
//当clk上升沿来临或者rst_n变低的时候执行一次always里的语句
begin
if(!rst_n)
cnt_p<=0;
else if (cnt_p==(N-1))
cnt_p<=0;
else cnt_p<=cnt_p+1; //计数器一直计数,当计数到N-1的时候清零,这是一个模N的计数器
end
//上升沿触发的分频时钟输出,如果N为奇数得到的时钟占空比不是50%;如果N为偶数得到的时钟占空比为50%
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
clk_p<=0;
else if (cnt_p<(N>>1)) //N>>1表示右移一位,相当于除以2去掉余数
clk_p<=0;
else
clk_p<=1; //得到的分频时钟正周期比负周期多一个clk时钟
end
//下降沿触发时计数器的控制
always @ (negedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_n<=0;
else if (cnt_n==(N-1))
cnt_n<=0;
else cnt_n<=cnt_n+1;
end
//下降沿触发的分频时钟输出,和clk_p相差半个时钟
always @ (negedge clk)
begin
if(!rst_n)
clk_n<=0;
else if (cnt_n<(N>>1))
clk_n<=0;
else
clk_n<=1; //得到的分频时钟正周期比负周期多一个clk时钟
end
assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p; //条件判断表达式
//当N=1时,直接输出clk
//当N为偶数也就是N的最低位为0,N(0)=0,输出clk_p
//当N为奇数也就是N最低位为1,N(0)=1,输出clk_p&clk_n。正周期多所以是相与
endmodule
三.管脚分配
四.实现效果
拨码开关 | 效果显示 | |
---|---|---|
初始状态 | 0000 | LED全不亮 |
直行 | 0000 | LED全不亮 |
左转 | 0001 | LED左三个亮灭交替 |
右转 | 1000 | LED右三个亮灭交替 |
临时停车 | 1001 | LED左三个&&右三个 亮灭交替 |
倒车 | 1111 | LED左一个&&右一个 亮灭交替 |
原文地址:https://blog.csdn.net/bc202205/article/details/134734515
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_25734.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。