差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
10._交通灯 [2018/12/13 17:39]
zhijun [Verilog代码]
10._交通灯 [2021/10/05 23:40] (当前版本)
gongyu
行 1: 行 1:
-=====简易交通灯=====+## 简易交通灯
  
 本节将向您介绍Verilog语法之中的精髓内容——状态机,并且将利用状态机实现十字路口的交通灯。 本节将向您介绍Verilog语法之中的精髓内容——状态机,并且将利用状态机实现十字路口的交通灯。
  
 \\ \\
-====硬件说明与实现项目框图==== +### 1. 硬件说明与实现项目框图 
--------+ 
 +//
 {{ ::​jiaotongdeng.png?​300 |}} {{ ::​jiaotongdeng.png?​300 |}}
 +//
 上图为十字路口交通示意图分之路与主路,要求如下: 上图为十字路口交通示意图分之路与主路,要求如下:
-* 交通灯主路上绿灯持续15s的时间,黄灯3s的时间,红灯10s的时间; +  ​* 交通灯主路上绿灯持续15s的时间,黄灯3s的时间,红灯10s的时间; 
-* 交通灯支路上绿灯持续7s的时间, 黄灯持续3秒的时间,红灯18秒的时间;+  * 交通灯支路上绿灯持续7s的时间, 黄灯持续3秒的时间,红灯18秒的时间; 
 + 
 +//
 {{ ::​状态机框架.png?​300 |}} {{ ::​状态机框架.png?​300 |}}
 +//
 根据上述要求,状态机设计框架分析如下: 根据上述要求,状态机设计框架分析如下:
-* S1:​主路绿灯点亮,支路红灯点亮,持续15s的时间; +  ​* S1:​主路绿灯点亮,支路红灯点亮,持续15s的时间; 
-* S2:​主路黄灯点亮,支路红灯点亮,持续3s的时间; +  * S2:​主路黄灯点亮,支路红灯点亮,持续3s的时间; 
-* S3:​主路红灯点亮,支路绿灯点亮,持续10s的时间; +  * S3:​主路红灯点亮,支路绿灯点亮,持续10s的时间; 
-* S4:​主路红灯点亮,支路黄灯点亮,持续3s的时间; +  * S4:​主路红灯点亮,支路黄灯点亮,持续3s的时间; 
-{{ ::​状态示意图.png?​300 |}} +// 
-====Verilog代码==== +{{ ::​状态示意图.png?​500 |}} 
-------+// 
 + 
 +### 2. Verilog代码 
 首先是时钟分频部分: 首先是时钟分频部分:
 <code verilog> <code verilog>
行 55: 行 63:
  //DEFINE PARAMETER  //DEFINE PARAMETER
  //​*******************  //​*******************
- parameter WIDTH = 3;​ + parameter WIDTH = 3; 
- parameter N = 5;+ parameter N = 5;
   
  //​*******************  //​*******************
行 72: 行 80:
  //​********************  //​********************
  //REGS  //REGS
- reg [WIDTH-1:​0] cnt_p,​cnt_n;​ + reg [WIDTH-1:​0] cnt_p,​cnt_n;​ 
- reg clk_p,​clk_n;​+ reg clk_p,​clk_n;​
  
  assign clkout = (N==1)?​clk:​(N[0])?​(clk_p&​clk_n):​clk_p;​  assign clkout = (N==1)?​clk:​(N[0])?​(clk_p&​clk_n):​clk_p;​
行 140: 行 148:
 module traffic module traffic
 ( (
- clk ,    //时钟+ clk ,    //时钟
  rst_n , ​   //复位  rst_n , ​   //复位
- out      //​三色led代表交通灯+ out      //​三色led代表交通灯
 ); );
  
行 149: 行 157:
    
  parameter ​     S1 = 4'​b00, ​   //​状态机状态编码  parameter ​     S1 = 4'​b00, ​   //​状态机状态编码
- S2 = 4'​b01,​ + S2 = 4'​b01,​ 
- S3 = 4'​b10,​ + S3 = 4'​b10,​ 
- S4 = 4'b11;+ S4 = 4'b11;
   
- parameter time_s1 = 4'd15, //​计时参数 + parameter time_s1 = 4'd15, //​计时参数 
- time_s2 = 4'​d3,​ + time_s2 = 4'​d3,​ 
- time_s3 = 4'd10+ time_s3 = 4'd7
- time_s4 = 4'd3;+ time_s4 = 4'd3;
  //​交通灯的控制  //​交通灯的控制
- parameter led_s1 = 6'​b101011,​ // LED2 绿色 LED1 红色 + parameter led_s1 = 6'​b101011,​ // LED2 绿色 LED1 红色 
- led_s2 = 6'​b110011,​ // LED2 蓝色 LED1 红色 + led_s2 = 6'​b110011,​ // LED2 蓝色 LED1 红色 
- led_s3 = 6'​b011101,​ // LED2 红色 LED1 绿色 + led_s3 = 6'​b011101,​ // LED2 红色 LED1 绿色 
- led_s4 = 6'​b011110;​ // LED2 红色 LED1 蓝色+ led_s4 = 6'​b011110;​ // LED2 红色 LED1 蓝色
    
  reg [3:0] timecont;  reg [3:0] timecont;
行 170: 行 178:
  //​产生1秒的时钟周期  //​产生1秒的时钟周期
  divide #​(.WIDTH(32),​.N(12000000)) CLK1H (  divide #​(.WIDTH(32),​.N(12000000)) CLK1H (
- .clk(clk),​ + .clk(clk),​ 
- .rst_n(rst_n),​ + .rst_n(rst_n),​ 
- .clkout(clk1h));​ + .clkout(clk1h));​
  //​第一段 同步逻辑 描述次态到现态的转移  //​第一段 同步逻辑 描述次态到现态的转移
  always @ (posedge clk1h or negedge rst_n)  always @ (posedge clk1h or negedge rst_n)
行 186: 行 193:
  begin  begin
  if(!rst_n) begin  if(!rst_n) begin
- next_state = S1;+         ​next_state = S1;
  end  end
  else begin  else begin
行 273: 行 280:
 \\  ​ \\  ​
 \\  ​ \\  ​
-====引脚分配==== + 
--------+### 3. 引脚分配 
 小脚丫上正好有4路按键和4路开关,可以用来作为输入信号分别控制数码管的输出。按照下面表格定义输入输出信号 小脚丫上正好有4路按键和4路开关,可以用来作为输入信号分别控制数码管的输出。按照下面表格定义输入输出信号
 \\ \\
行 287: 行 295:
 配置好以后编译下载程序。您也可以试试修改程序,观察修改代码对于FPGA内部电路所造成的影响。\\ 配置好以后编译下载程序。您也可以试试修改程序,观察修改代码对于FPGA内部电路所造成的影响。\\
  
-====小结==== +### 4. 小结 
-------+
 状态机是一类很重要的时序逻辑电路,是许多数字系统的核心部件,掌握状态机的使用是利用FPGA与CPLD进行开发的一项必会技能,本小节的交通灯程序即是利用三段式状态机描述方法实现的,希望读者能够快速掌握这项技能。 状态机是一类很重要的时序逻辑电路,是许多数字系统的核心部件,掌握状态机的使用是利用FPGA与CPLD进行开发的一项必会技能,本小节的交通灯程序即是利用三段式状态机描述方法实现的,希望读者能够快速掌握这项技能。