5.1 流水灯实践

电路板唯一淘宝地址是:店内搜索页-亮点嵌入式-淘宝网 (taobao.com)https://brightpoint.taobao.com/

讨论可以去:英飞凌FMCW雷达解决方案Position2Go【问答+试用】 (eeboard.com)
一组发光LED,在控制系统的控制下按照设定的顺序和时间来发亮和熄灭,这样就能形成一定的视觉效果。如果通过设计,实现LED灯依次点亮,那么就形成流水灯。
本节的内容就是设计这样的控制系统,实现12位流水灯,并进行仿真及下载到电路板验证。

1 流水灯的关键信息

1.1 状态及其变化

(1)状态
需要存储当前的状态,12个灯中有一个是亮的,定义12个触发器构成的12位寄存器ledtemp保存当前的状态。
在这里插入图片描述
(2)时钟
流水灯的流转时间设置为半秒钟(500ms/2Hz)比较合适,系统的唯一时钟来源是由电路板上的有源晶振所产生的时钟连接到FPGA,是50MHz的时钟clk,因此需做25,000,000分频

备注:学习板上晶振为 50MHz,也就是说时钟周期为 20ns,这样可以计算得出 500ms =500_000_000ns/20ns = 25_000_000,即需要计数器计数 25_000_000 次,也就是需要一个至少25 位的计数器(225>25_000_000>224)。且每当计数次数达到需要清零并重新计数。
(3)状态变化
将寄存器ledtemp的初始值设置为12’b0000_0000_0001,divclk的每个上升边沿,对ledtemp进行向左移位,当移到12’b1000_0000_0000之后,再次移位应移为12’b0000_0000_0001。

16进制的表示方法:001H——002H——004H——008H——010H…………800H——001H

1.2 分频设计

要进行25,000,000分频,采用计数器的方式。当计数值达到12,500,000时令divclk翻转,这样divclk的一个周期就是25,000,000个clk时钟周期。
12,500,000 = 24’b1011 1110 1011 1100 0010 0000

需要一个寄存器变量存储计数值,12,500,000的十六进制是BEBC20为24位,因此需要设计24位以上的寄存器保存计数值。
循环状态为:0 --> 12,500,000 --> 0 --> 12,500,000 --> 0 --> 12,500,000

1.3 约束设计

一个时钟输入12个数码管输出
在这里插入图片描述

2 流水灯工程的vivado实现

2.1 设计文件

module pipeline_12led(
input clk,//时钟输入
output [11:0] led //LED输出
    );
reg [11:0] ledtemp = 12'b0000_0000_0001; //led初始值
reg [31:0] divclk_cnt = 0; //32位计数器,定义到24位就可以
reg divclk = 0; //低频时钟

assign led=ledtemp; //实现将寄存器变量值赋给LED输出
parameter halfduty_cntvalue= 12500000;
//parameter halfduty_cntvalue= 125;//缩小仿真时间,验证功能
always@(posedge clk) begin //把系统时钟分频 50/2500 0000= 2HZ
    if(divclk_cnt==halfduty_cntvalue)begin //计数满后翻转
        divclk =~ divclk; 
        divclk_cnt = 0;
    end
    else begin
        divclk_cnt = divclk_cnt+1'b1;
    end
end

always@(posedge divclk) begin 
    if(ledtemp[11] == 1)
        ledtemp = 12'b0000_0000_0001;//实现循环位移
    else 
        ledtemp = ledtemp << 1;//左移1位
end
endmodule

2.2 仿真文件

`timescale 1ns / 1ps
module sim_pipeline_12led(   );
reg clk_sim;
wire [11:0] led_sim;

pipeline_12led pipeline_12led(
    .clk(clk_sim),//时钟输入
    .led(led_sim) //LED输出
    );
initial begin
    clk_sim = 0;
end   
always #10 clk_sim = ~clk_sim; 
endmodule

2.3 约束文件

我没有买板子,没有进行板级测试
编写约束文件代码
保存工程
综合
实现
生成比特流文件
下载到实验板测试

set_property PACKAGE_PIN D4 [get_ports clk] 
set_property PACKAGE_PIN P9 [get_ports {led[0]}]
set_property PACKAGE_PIN R8 [get_ports {led[1]}]
set_property PACKAGE_PIN R7 [get_ports {led[2]}]
set_property PACKAGE_PIN T5 [get_ports {led[3]}]
set_property PACKAGE_PIN N6 [get_ports {led[4]}]
set_property PACKAGE_PIN T4 [get_ports {led[5]}]
set_property PACKAGE_PIN T3 [get_ports {led[6]}]
set_property PACKAGE_PIN T2 [get_ports {led[7]}]
set_property PACKAGE_PIN R1 [get_ports {led[8]}]
set_property PACKAGE_PIN G5 [get_ports {led[9]}]
set_property PACKAGE_PIN H3 [get_ports {led[10]}]
set_property PACKAGE_PIN E3 [get_ports {led[11]}]
set_property IOSTANDARD LVCMOS33 [get_ports clk] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[4]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[5]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[6]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[7]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[8]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[9]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[11]}]

2.4 仿真结果

//我们把设计文件中的
parameter halfduty_cntvalue= 12500000;
//改为
parameter halfduty_cntvalue= 125;//缩小仿真时间,验证功能的正确性

led_sim用16进制表示
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值