【FPGA】Verilog实现交通信号灯
更新:
其余各部分代码已公布。
-------------------------------------------------------------------------------------------------------
大二数字电路的课程设计中,有一份日常作业使用Xilinx FPGA实现简易交通信号灯,但很可惜当时时间有限,没能最终完成。正好在这一学期选修SOPC设计课程,同样采用了Xilinx FPGA,故打算重新完成交通信号灯的相关内容。
本项目采用Digilent公司生产的BASYS3开发板,基于Xilinx FPGA,该板子目前可以在马云家买到,不过价格偏贵,在校学生可在digilent官网申请以更低价格买入。
大致的框架如下,只是个构思,还很不完善,后续会进行修改。比如现在我目前并没有把计时功能完全从State模块中摘出来,只是用Timer实例化了一个1s计时器在里面,并且用count计数。

TOP代码
module BASYS_BIGPROJECT_Top
(
input clk,
output wire[:]Trans_light,
output wire[:]Num_choose,
output wire[:]Num_data
); wire [:]state_connect;
wire [:]count_connect;
//wire [6:0]Num_data_connect;
BASYS_BIGPROJECT_State state(
.clk(clk),
.state(state_connect),
.count(count_connect)
); BASYS_BIGPROJECT_Display display(
.clk(clk),
.count(count_connect),
.state(state_connect),
.Trans_light(Trans_light),
.Num_choose(Num_choose),
.Num_data(Num_data)
); endmodule
State代码
module BASYS_BIGPROJECT_State(
input clk,
output [:]state,
output [:]count
); reg [:]reg_state = ;
reg [:]reg_count = ;
wire cnt_connect; Freq_divider clk_1s(
.clk(clk),
.rst(),
.count(cnt_connect)
); //states for lights
parameter MR_BG = 'b00;
parameter MR_BY = 'b01;
parameter MG_BR = 'b11;
parameter MY_BR = 'b10; //green led for 4s, yellow led for 2s
always@(posedge cnt_connect)
begin
case(reg_state)
MR_BG:begin //main red, branch green
if(reg_count<) begin
reg_state <= MR_BG;
reg_count <= reg_count + ;
end
else begin
reg_state <= MR_BY;
reg_count <= 'b000;
end
end
MR_BY:begin //main red, branch yellow
if(reg_count<) begin
reg_state <= MR_BY;
reg_count <= reg_count + ;
end
else begin
reg_state <= MG_BR;
reg_count <= 'b000;
end
end
MG_BR:begin //main green, branch red
if(reg_count<) begin
reg_state <= MG_BR;
reg_count <= reg_count + ;
end
else begin
reg_state <= MY_BR;
reg_count <= 'b000;
end
end
MY_BR:begin //main yellow, branch red
if(reg_count<) begin
reg_state <= MY_BR;
reg_count <= reg_count + ;
end
else begin
reg_state <= MR_BG;
reg_count <= 'b000;
end
end
endcase
end
assign state = reg_state;
assign count = reg_count; endmodule
Display代码
module BASYS_BIGPROJECT_Display
(
input clk,
input [:]state,
input [:]count,
output [:]Trans_light,
output [:]Num_choose,
output [:]Num_data
); reg [:]reg_light = ;
reg [:]reg_Num_digit = ;
reg [:]reg_Num_choose = 'b1110;
wire [:]Num_data_connect;
wire refresh; reg [:]Data_Main = ;
reg [:]Data_Branch = ;
//divider for refresh
Freq_divider #()play(
.clk(clk),
.rst('b0),
.count(refresh)
);
//Decode the digit
Digital_decode decoder(
.clk(clk),
.data(reg_Num_digit),
.Trans_num(Num_data_connect)
); //switch the light
always @(posedge clk)
begin
case(state)
'b00:begin
reg_light <= 'b100001;
Data_Main <= - count;
Data_Branch <= - count;
end
'b01:begin
reg_light <= 'b100010;
Data_Main <= - count;
Data_Branch <= - count;
end
'b11:begin
reg_light <= 'b001100;
Data_Main <= - count;
Data_Branch <= - count;
end
'b10:begin
reg_light <= 'b010100;
Data_Main <= - count;
Data_Branch <= - count;
end
endcase
end //Scanned display for digit
always @(posedge refresh)
begin
if(reg_Num_choose == 'b1110)
begin
reg_Num_choose <= 'b1011;
reg_Num_digit <= Data_Main;
end
else
begin
reg_Num_choose <= 'b1110;
reg_Num_digit <= Data_Branch;
end
end assign Trans_light = reg_light;
assign Num_choose = reg_Num_choose;
assign Num_data = Num_data_connect;
endmodule
Tools代码
module Freq_divider
#(parameter N = )
(
input clk,
input rst,
output [N-:]freq_div,
output count
);
reg [N-:]regN = ;
always@(posedge clk)
begin
if(rst)
regN <= ;
else
regN <= regN+;
end
assign freq_div = regN;
assign count = (regN == **N-)?'b1:1'b0;
endmodule module Digital_decode
(
input clk,
input [:]data,
output [:]Trans_num
); reg [:]reg_Trans_num = ; always@(posedge clk)
begin
case(data)
'd0: reg_Trans_num <= 8'b0000_0011;
'd1: reg_Trans_num <= 8'b1001_1111;
'd2: reg_Trans_num <= 8'b0010_0101;
'd3: reg_Trans_num <= 8'b0000_1101;
'd4: reg_Trans_num <= 8'b1001_1001;
'd5: reg_Trans_num <= 8'b0100_1001;
'd6: reg_Trans_num <= 8'b0100_0001;
'd7: reg_Trans_num <= 8'b0001_1111;
'd8: reg_Trans_num <= 8'b0000_0001;
'd9: reg_Trans_num <= 8'b0000_1001;
default: reg_Trans_num <= 'b0001_0001;
endcase
end
assign Trans_num = reg_Trans_num;
endmodule
【FPGA】Verilog实现交通信号灯的更多相关文章
- FPGA Verilog HDL 系列实例--------步进电机驱动控制
[连载] FPGA Verilog HDL 系列实例 Verilog HDL 之 步进电机驱动控制 步进电机的用途还是非常广泛的,目前打印机,绘图仪,机器人等等设备都以步进电机为动力核心.那么,下面我 ...
- 用Micro:bit做交通信号灯
交通信号灯项目在控制技术中,有点像"Hello world!" 是一个入门级的范例. 对于孩子来说,交通灯跟日常生活息息相关,他们都熟悉,充分知道需要做什么这是一个让孩子开始的好项 ...
- WPF用Blend写的交通信号灯
原文:WPF用Blend写的交通信号灯 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/article/details/1 ...
- [FPGA]Verilog 60s秒表计时器(最大可计时间长达9min)
[FPGA]Verilog 60s秒表计时器 1.引述 这次的实验来自于本人本科课程数电结课时的自选题目.由于这次上传是后知后觉,学校已将小脚丫板子回收,所以在这篇文章中没法贴出代码结果的效果图了,但 ...
- [FPGA] Verilog 燃气灶控制器的设计与实现
燃气灶控制器的设计与实现 一.引述 本次实验所用可编程器件型号为MAXII EPM1270T144C5(其引脚表见本人另一博文:可编程实验板EPM1270T144C5使用说明),通过可编程实验板实现一 ...
- xilinx 赛灵思fpga verilog hdl 教程
http://www.eefocus.com/article/08-03/37231s.html http://wenku.baidu.com/link?url=5mdkMmm4BGGi7gRdgSk ...
- [FPGA]Verilog实现JK触发器组成的8421BCD码十进制计数器
目录 概述 电路分析 代码实现 参考文献 概述 本文以异步时序计数器为例,用Verilog实现以\(JK\)触发器组成的8421BCD码十进制异步计数器,并用ModelSim软件进行仿真验证. 电路分 ...
- [FPGA]Verilog实现可自定义的倒计时器(24秒为例)
目录 想说的话... 样例_边沿检测计数器 代码讲解 仿真演示 拓展_自定义倒计时数和倒计时间隔 代码讲解 仿真演示 总结 实例_24秒倒计时器 想说的话... 本次实现的是一个24秒倒计时器,功能顾 ...
- [FPGA]Verilog实现8位串并转换器HC595
目录 想说的话... 正文 IC介绍_HC595 电路连接图 功能表 逻辑图 代码实现 代码已经更新,新的代码按照电路编写,忠实于原电路的逻辑,已注于文末(11/16) 修复并行输出数据出错的bug, ...
随机推荐
- js javascript 如何获取某个值在数组中的下标
js 某个值在数组中的下标javascript中知道一个数组中的一个元素的值,如何获取数组下标JS 获取数组某个元素下标 函数方法 采用prototype原型实现方式,查找元素在数组中的索引值js查找 ...
- Flink使用SideOutPut替换Split实现分流
以前的数据分析项目(版本1.4.2),对从Kafka读取的原始数据流,调用split接口实现分流. 新项目决定使用Flink 1.7.2,使用split接口进行分流的时候,发现接口被标记为deprac ...
- 获得用户的真实ip HTTP_X_FORWARDED_FOR
工作中经常会有有获得用户真实ip的情况,HTTP_X_FORWARDED_FOR总是忘记,所以我这里记录下来吧. 在PHP 中使用 [“REMOTE_ADDR”] 来取得客户端的 IP 地址,但如果客 ...
- POJ 1321 棋盘问题 题解
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 70224 Accepted: 33254 Description 在一 ...
- RNN循环神经网络学习——概述
循环神经网络(Recurrent Neural NetWork,RNN)是一种将节点定向连接成环的人工神经网络,其内部状态可以展示动态时序行为. 循环神经网络的主要用途是处理和预测序列数据.循环神经网 ...
- switch实现成绩打等级
#include <stdio.h> int main() { int grade; scanf_s("%d", &grade); grade = grade ...
- Go语言调度器之调度main goroutine(14)
本文是<Go语言调度器源代码情景分析>系列的第14篇,也是第二章的第4小节. 上一节我们通过分析main goroutine的创建详细讨论了goroutine的创建及初始化流程,这一节我们 ...
- Spring(003)-消费返回list的rest服务
通过spring提供的RestTemplate就可以访问rest服务.首先需要创建一个RestTemplate,这个需要手动来创建bean @Configuration public class De ...
- day33_8_15 并发编程4,线程池与协程,io模型
一.线程池 线程池是一个处理线程任务的集合,他是可以接受一定量的线程任务,并创建线程,处理该任务,处理结束后不会立刻关闭池子,会继续等待提交的任务,也就是他们的进程/线程号不会改变. 当线程池中的任务 ...
- InfoQ一波文章:AdaSearch/JAX/TF_Serving/leon.bottou.org/Neural_ODE/NeurIPS_2018最佳论文
和 Nested Partition 有相通之处? 伯克利提出 AdaSearch:一种用于自适应搜索的逐步消除方法 在机器学习领域的诸多任务当中,我们通常希望能够立足预先给定的固定数据集找出问题的答 ...