FPGA学习记录(2): 计数器的编写

FPGA学习记录(2):计数器编写

注:使用的是野火的征途mini FPGA开发板(参考野火系列视频)

1.定时点亮led灯

  • 目标

    • 利用计数器定时1s,实现0.5s灯亮,0.5s灯灭
  • 模拟框图

在这里插入图片描述

开发板使用的是50MHz的晶振也就是
频率f = 50MHz = 5*10^7KHz
所以t=1/f= 2*10^7
所以计数1s所需要的计数为
M=1/t=25000000
因为是从0开始计数所以计数的最大值为
M=24_999_999
通过计算器可以知道M为25位宽的

定义两个寄存器变量,cnt与cnt_flag
cnt用于计数
cnt_flag用来控制led亮灭的变化
起始让cnt_flag为低电平,每当cnt计数到最大值的的一半时即达到0.5s时
改变cnt_flag的状态,这样就可以实现0.5s灯亮,0.5灯灭
  • 波形图绘制

在这里插入图片描述

  • 代码编写

    • rtl代码

      /*-------------------------    
      Function:定时1s,点亮led
      Date:2020/2/12
      Reference:"野火"
      Author:Troke
      ---------------------------*/
      module counter
      #(
      	parameter CNT_MAX =  25d'24_999_999 //定义参数变量
      )
      (
      	input	wire	sys_clk,      //定义时钟线
          input	wire	sys_rst_n,    //定义复位信号
          
          output	reg		led_out
      );
          /*定义两个寄存器变量,一个用于计数,一个用于控制led*/
          reg	[24:0]	cnt;
          reg		    cnt_flag;
          /*对cnt的编写*/
          always@(posedge sys_clk or negedge sys_rst_n)
              if(sys_rst_n == 1'b0)
                  cnt <= 25'd0;        	//起始给cnt赋值为0
          	else if (cnt == (CNT_MAX))
              	cnt <= 25'd0;			//当cnt计数到最大值时,重新赋值为0
          	else
                  cnt <= cnt + 25'd1; 	//其他情况让cnt自加
          /*对cnt_flag的编写*/
          always@(posedge sys_clk or negedge sys_rst_n)
              if(sys_rst_n == 1'b0)
                  cnt_flag <= 1'b0;		//起始给cnt_flag赋值低电平
          	else if (cnt ==(CNT_MAX-25'd1))
              	cnt_flag <= ~cnt_flag;	//当计数到最大值减1时,改变cnt_flag的状态
          	else
      			cnt_flag <= cnt_flag;   //其他情况cnt_flag保持原来的状态
          
          /*对led_out的编写*/
          always@(posedge sys_clk or negedge sys_rst_n)
              if(sys_rst_n == 1'b0)
                  led_out <= 1'b0;		//起始给led_out赋值低电平
         	    else if (cnt_flag == 1'b1)	
              	led_out <= ~led_out;	//当cnt_flag改变状态时,改变led的状态
         	    else
              	led_out <= led_out;		//其他情况保持led状态
          
      endmodule
      
    • testbench代码

      `timescale 1ns/1ns
      module tb_counter();
          
      reg	sys_clk;
      reg	sys_rst_n;
      wire led_out;
          
      initial
          begin
             sys_clk = 1'b0;
             sys_rst_n <= 1'b0;
             #20
             sys_rst_n <= 1'b1;
          end
      always #10 sys_clk = ~sys_clk;
          
      counter
      #(
          .CNT_MAX(25'd 24) //设置参数变量的值
      )
      counter_inst
      (
          .sys_clk	(sys_clk),    
          .sys_rst_n	(sys_rst_n),   
          
          .led_out	(led_out)
      );    
          
      endmodule
      
  • 仿真结果

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 处理器的基本结构 处理器是计算机中最重要的组成部分之一,它负责执行指令、存储和处理数据。处理器的基本结构包括运算器、控制器、寄存器、存储器和总线。 - 运算器:负责执行算术和逻辑运算,包括加法、减法、乘法、除法、与、或、非等操作。 - 控制器:负责管理指令的执行顺序和处理器的操作模式,包括指令译码、指令执行、分支控制、中断处理等。 - 寄存器:处理器内部的一种高速存储器,用于暂时存储指令和数据。常见的寄存器包括累加器、程序计数器、指令寄存器等。 - 存储器:计算机用于存储程序和数据的设备,包括内存、硬盘、U盘等。 - 总线:计算机内部各个组成部分之间传输数据和指令的通道,包括地址总线、数据总线和控制总线。 2. 处理器的指令集和编程模型 处理器的指令集是处理器能够执行的操作的集合,包括算术操作、逻辑操作、传输操作等。不同的处理器有不同的指令集,例如x86指令集、ARM指令集等。 编程模型是指程序员在编写程序时所使用的抽象模型,它描述了程序员如何使用处理器的指令集来编写程序。常见的编程模型包括传统的CISC模型和现代的RISC模型。 3. 处理器的性能指标 处理器的性能指标包括时钟频率、IPC、吞吐量和延迟等。 - 时钟频率:处理器内部时钟的运行频率,通常以GHz为单位。 - IPC(Instructions Per Cycle):每个时钟周期内处理器执行的指令数量。 - 吞吐量:单位时间内处理器能够执行的指令数量。 - 延迟:指令从发出到执行完成所需要的时间。 4. 处理器的发展历程 处理器的发展历程经历了从单核心到多核心的演变,以及从CISC模型到RISC模型的转变。 - 单核心处理器:早期的计算机使用单核心处理器,处理器的性能主要依赖于时钟频率的提升。 - 多核心处理器:随着计算机应用的发展,多核心处理器逐渐被引入计算机中,可以同时执行多个任务,提高了计算机的并行处理能力。 - RISC模型:在处理器的指令集设计上,RISC模型强调简洁、规范的指令集,使得处理器的设计更加高效,提高了处理器的性能。 5. 处理器的未来发展方向 处理器的未来发展主要集中在以下几个方向: - 集成度的提高:将更多的处理器核心、缓存、内存控制器等集成到处理器中,提高处理器的性能。 - 异构计算:在处理器中引入异构计算单元,例如GPU、FPGA等,提高处理器的计算能力。 - 量子计算:引入量子计算的技术,实现更高效的计算处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值