显示页面 讨论 修订记录 反向链接 本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。 =====简易交通灯===== 本节将向您介绍Verilog语法之中的精髓内容——状态机,并且将利用状态机实现十字路口的交通灯。 \\ ====硬件说明与实现项目框图==== ------- 上图为十字路口交通示意图分之路与主路,要求如下: * 交通灯主路上绿灯持续15s的时间,黄灯3s的时间,红灯10s的时间; * 交通灯支路上绿灯持续7s的时间, 黄灯持续3秒的时间,红灯18秒的时间; 根据上述要求,状态机设计框架分析如下: * S1:主路绿灯点亮,支路红灯点亮,持续15s的时间; * S2:主路黄灯点亮,支路红灯点亮,持续3s的时间; * S3:主路红灯点亮,支路绿灯点亮,持续10s的时间; * S4:主路红灯点亮,支路黄灯点亮,持续3s的时间; ====Verilog代码==== ------ 首先是时钟分频部分 <code verilog> //******************************************************** // Copyright(c)2016, STEP FPGA // All rights reserved // File name : divide.v // Module name : divide // Author : STEP // Email : info@stepfpga.com // Data : 2016/08/01 // Version : V1.0 // Description : // // Modification history // ---------------------------------------------------------------------------- // Version // Description // //******************************************************** //******************* //DEFINE MODULE PORT //******************* module divide ( //INPUT clk , rst_n , //OUTPUT clkout ); //******************* //DEFINE PARAMETER //******************* parameter WIDTH = 3; parameter N = 5; //******************* //DEFINE INPUT //******************* input clk,rst_n; //******************* //DEFINE OUTPUT //******************* output clkout; //******************** //OUTPUT ATTRIBUTE //******************** //REGS reg [WIDTH-1:0] cnt_p,cnt_n; reg clk_p,clk_n; assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p; //Sequential logic style always @ (posedge clk) begin if(!rst_n) cnt_p<=0; else if (cnt_p==(N-1)) cnt_p<=0; else cnt_p<=cnt_p+1; end always @ (negedge clk) begin if(!rst_n) cnt_n<=0; else if (cnt_n==(N-1)) cnt_n<=0; else cnt_n<=cnt_n+1; end always @ (posedge clk) begin if(!rst_n) clk_p<=0; else if (cnt_p<(N>>1)) clk_p<=0; else clk_p<=1; end always @ (negedge clk) begin if(!rst_n) clk_n<=0; else if (cnt_n<(N>>1)) clk_n<=0; else clk_n<=1; end endmodule </code> \\ \\ ====引脚分配==== ------- 小脚丫上正好有4路按键和4路开关,可以用来作为输入信号分别控制数码管的输出。按照下面表格定义输入输出信号 \\ ^信号 ^引脚 ^信号 ^引脚 ^ |seg_data_1(0) |M7 |seg_data_2(0) |L14 ^ |seg_data_1(1) |M8 |seg_data_2(1) |M13 ^ |seg_data_1(2) |M9 |seg_data_2(2) |M14 ^ |seg_data_1(3) |M10 |seg_data_2(3) |N14 ^ \\ \\ ^信号 ^引脚 ^信号 ^引脚 ^ |seg_led_1(0) |A10 |seg_led_2(0) |C12 ^ |seg_led_1(1) |C11 |seg_led_2(1) |B14 ^ |seg_led_1(2) |F2 |seg_led_2(2) |J1 ^ |seg_led_1(3) |E1 |seg_led_2(3) |H1 ^ |seg_led_1(4) |E2 |seg_led_2(4) |H2 ^ |seg_led_1(5) |A9 |seg_led_2(5) |B12 ^ |seg_led_1(6) |B9 |seg_led_2(6) |A11 ^ |seg_led_1(7) |F1 |seg_led_2(7) |K1 ^ |seg_led_1(8) |C9 |seg_led_2(8) |A12 ^ \\ 配置好以后编译下载程序。这样可以通过按键或者开关来控制相应的数码管显示数字。如果你想显示16进制的AbCDeF在数码管,可以试试修改程序。这时候一定要定义一个16*9的存储器来初始化。 \\ ====小结==== ------ 了解了小脚丫数码管的工作原理,在下个实验我们将进行到有趣的时序逻辑。首先是如何控制[[5. 时钟分频|时钟分频]]。