首页 > 其他分享 >16-流水灯

16-流水灯

时间:2023-06-08 21:44:46浏览次数:30  
标签:cnt led 16 点亮 sys 流水 LED reg

1.流水灯

利用板载的LED灯进行流水灯的设计,让LED灯依次进行点亮,像流水一样,原理就是依次控制LED灯的IO口的高低电平的变化,让LED灯一次

2.FPGA设计

2.1 模块框图和波形

  • 本次的实验是让 led 灯依次闪亮的间隔为0.5s,也就是让 led 灯每次只亮一个,每次亮的时间为 0.5s,这样就速度就比较快了,更像“流水”的效果且肉眼还能够分辨出
  • 依次点亮板载的四个LED灯,实现流水灯的效果,两个灯之间的间隔为0.5s,LED灯一次点亮持续时间为0.5s
  • 板载LED灯低电平时点亮
  • 每个灯持续亮0.5s,需要使用计数器,计数个数为25000_0000,最大计数值为24999_999
  • 声明一个cnt变量进行计数
  • 声明一个cnt_flag产生脉冲信号,计数到最大值-1的时候产生一个周期的脉冲信号
  • led_out信号:当检测到cnt_flag信号为高电平的时候,就点亮一个灯,点亮灯的顺序:4'1110,4'1101,4'1011,4'0111,每经历一个脉冲就左移一位,但是左移是用0进行填充的,也就是说4'1110,左移变为4'1100,这样就是点亮两个灯,如何进行操作?用中间变量进行表示4'0001,4'0010'4'0100,4'1000,输出变量对其进行取反即可

2.2 RTL

module water_led
#(
  parameter CNT_MAX = 24_999_999
)
(
  input wire sys_clk,
  input wire sys_rst_n,
  
  output reg [3:0] led_out
);

  reg [24:0] cnt;
  reg cnt_flag;
  reg [3:0] led_out_reg;

// cnt:计数500ms
always @ (posedge sys_clk or negedge sys_rst_n)
  if(sys_rst_n == 1'b0)
    cnt <= 25'd0;
  else if (cnt == CNT_MAX)
    cnt <= 25'd0;
  else 
    cnt <= cnt + 1'b1; 

//cnt_flag:计数器计数满 500ms 标志信号
always @ (posedge sys_clk or negedge sys_rst_n)
  if(sys_rst_n == 1'b0)
    cnt_flag <= 1'b0;
  else if(cnt_flag == CNT_MAX-1)
    cnt_flag <= 1'b1;
  else
    cnt_flag <= 1'b0;

// led_out_reg
always @ (posedge sys_clk or negedge sys_rst_n)
  if(sys_rst_n == 1'b0)
    led_out_reg <= 4'b0001;
  else if(led_out_reg == 4'b1000 && cnt_flag == 1'b1) // 如果不加这个条件,上板之后经过一级流水,灯全部熄灭
    led_out_reg <= 4'b0001;
  else
    led_out_reg <= led_out_reg << 1;

  assign led_out = ~led_out_reg;
endmodule

2.3 Testbench

`timescale 1ns/1ns

module tb_water_led();
  reg sys_clk;
  reg sys_rst_n;
  
  wire [3:0] led_out;
 
  initial begin
    sys_clk = 1'b1;
    sys_rst_n <= 1'b0;
    #20;
    sys_rst_n <= 1'b1;
  end
  
  always #10 sys_clk = ~sys_clk;

  water_led 
  (
    .CNT_MAX (25'd24)
  )
  water_led_inst
  (
    .sys_clk (sys_clk)
    .sys_rst_n (sys_rst_n)
    .led_out (led_out)
  )
endmodule

3.移位操作

假设被操作数是a[7:0] 8bit数据

// 右移两位
b = a >> 2'd2;
b = {2'b00,a[7:2]} ; // 用拼接符也可以表示移位操作

// 左移两位
b = a << 2'd2;
b = {a[5:0],2'b00};

// 

标签:cnt,led,16,点亮,sys,流水,LED,reg
From: https://www.cnblogs.com/Icer-newer/p/17454143.html

相关文章

  • 180116 EM算法资料整理(博客、论文、工具包、视频、书籍、代码,更新ing)
    BlogsHindon和Jordan理解的EM算法ComputationalStatisticsinPythonEM算法及其推广EM算法及其推广学习笔记从最大似然到EM算法浅解EM算法在缺失数据下的极大似然估计R代码Matlab极大似然估计缺失数据Cos424:InteractingwithDataProbabilityCourse关于EM算法的一些......
  • 8.16 instanceof 关键词
    demo1classPerson{publicvoidrun(){System.out.println("run.....");}}classSupermanextendsPerson{publicvoidfly(){System.out.println("超音速飞....");}publicvoidfire(){System.ou......
  • CodeForces - 616B Dinner with Emma (模拟)水
    TimeLimit: 1000MS MemoryLimit: 262144KB 64bitIOFormat: %I64d&%I64uCodeForces-616BDinnerwithEmmaSubmit StatusDescriptionJackdecidestoinviteEmmaoutforadinner.Jackisamodeststudent,hedoesn'twanttogotoanexpensiveres......
  • 基本功练习_2_16_插入法
    ......
  • 基本功练习_2_16_选择法
    ......
  • Exchange2016撤回邮件成功的必要条件
    问题:现在搭建了Exchange2016,客户端使用了Outlook2013。现在发现Outlook发出去的邮件无法撤回,失败率达到100%。对方收件人没有阅读这封邮件或者删除。请问是什么原因造成的?答案:根据我的了解,要使召回邮件生效,需要有以下必要条件:1.您必须使用Exchange帐户,并且收件人也必须位于同一......
  • 2013年工作中遇到的20个问题(Bug):161-180
    161.用户表和超级用户分成2个表,很不合理,查询的时候,非常复杂。162.leftjoin还是很有“市场”的。机构表Org连接User时,想获得user的名字,可能存在,也可能不存在,leftjoin就适合。##多个leftjoin之间不能使用","隔开selectcg.*,u.loginNamecreatorName,org.nativeNameadvertiser......
  • 如何续订Exchange2016的自签名证书
    续订Exchange自签名证书续订Exchange自签名证书的过程基本上相当于制作了一个新的证书。使用EAC以续订Exchange自签名证书打开EAC并导航到 “服务器>证书”。Inthe Selectserver list,selecttheExchangeserverthatholdsthecertificatethatyouwa......
  • qoj#5016
    考虑对于每个合法的序列\(b\)对应出唯一序列的\(a\):\(a_i\)为所有对应区间\([l_j,r_j]\)包含\(i\)的\(b_j\)的最大值,若没有则为\(1\)。这样填完之后所有\(a_i\)均为其最小可能值,若所有\(b_i\)的值都正确,则序列\(b\)合法。容易发现这样的映射是单射。考虑统计......
  • GitOps 最佳实践(上)| 基于 Amazon EKS 构建 CI/CD 流水线
    GitOps是目前比较理想的方法来实现基于Kuberentes集群的持续部署。了解了 GitOps的概念以及CI/CD流水线的架构,接下来我们将通过以下四个模块逐步完成构建CI/CD流水线的最佳实践:通过IaC部署云基础架构;在AmazonEKS集群上部署FluxCD;利用FluxCD部署GitOps工......