数电基础
关于时序逻辑设计的部分依然强烈推荐mooc上华科的数字电路与逻辑设计。
计数器可以分为同步和异步计数器,2进制、10进制和任意进制计数器,加法和减法计数器。同步和异步是指触发器是否都由同一个时钟信号控制。一个触发器能存储1位二进制数,所以由n个触发器构成n位寄存器。例如3个jk触发器可以存储000-111种状态。在数电的原理方面,mooc上讲解的很清晰,可以自行学习同步或异步的二进制寄存器、使用复位清零和反馈置数将m进制构成n进制(n
设计规划
本例将采用一个外部时钟信号,一个复位键和一个led灯来实现1s内led闪烁(亮0.5s灭0.5s)。这种计时的功能在fpga中是通过计数器完成的: 经历一个时钟周期,计数器+1 ,我们只需要计算出计数截止的值,就可以完成计时。由于采用的50mhz时钟频率,也就是1s产生510e7个时钟。那么亮灭0.5s就是需要计2.510e7个数。计数器从0-24999999,2^24<24999999<2^25,因此需要25个触发器,即25位寄存器。这个计数过程是:复位键生效时计数器归零,释放后的第一个时钟上升沿开始计数,从0计到2499999时led灯改变状态,计数器归零重新开始计数,到2499999时led灯改变状态...
编写代码
module counter#(parameter cnt_max = 25'd24_999_999 ) ( input wire sys_clk , //系统时钟50mhz input wire sys_rst_n , //全局复位 output reg led_out ); reg [24:0] cnt; //经计算得需要25位宽的寄存器才够500ms //cnt:计数器计数,当计数到cnt_max的值时清零 always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n == 1'b0) cnt <= 25'b0; else if(cnt == cnt_max) cnt <= 25'b0; else cnt <= cnt + 1'b1; //led_out:输出控制一个led灯,每当计数满标志信号有效时取反 always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n == 1'b0) led_out <= 1'b0; else if(cnt == cnt_max) led_out <= ~led_out; endmodule代码注释:与#define 标识符 常量类似,这里使用参数的方式定义常量。在rtl代码中实例化该模块时,如果需要两个不同计数值的计数器,只需要修改常数值。使用testbench仿真时也需要实例化,0.5s才能看到led_out的变化,仿真时间过长。如果我们直接修改参数缩短时间就能看到效果。parameter定义的是局部参数,只在本模块中有效,不会影响实际值。
我们观察cnt和led_out的变化条件:计数器发生改变的条件有两个,一个是时钟上升沿,一个是复位有效(复位下降沿)。计数器发生的改变有两个,要么+1要么清零。清零条件有两个:复位和溢出。因此第一个always块中有三个判断条件:复位和溢出时清零,其他的时候+1。
led_out的变化条件:时钟上升沿和复位有效(复位下降沿)。led灯状态的变化有两个,当复位时led灯为低电平,溢出时取反。
编写testbench
`timescale 1ns/1nsmodule tb_counter();//reg definereg sys_clk;reg sys_rst_n;//wire definewire led_out; //初始化输入信号 initial begin sys_clk = 1'b1; sys_rst_n <= 1'b0; #20 sys_rst_n <= 1'b1; end //sys_clk:每10ns电平翻转一次,产生一个50mhz的时钟信号 always #10 sys_clk = ~sys_clk; //---------------------flip_flop_inst---------------------- counter #( .cnt_max (25'd24 ) ) counter_inst( .sys_clk (sys_clk ), .sys_rst_n (sys_rst_n ), .led_out (led_out ) ); endmodule初始化:时钟高电平,复位低电平,20s延迟后复位高电平。
实例化:此处的参数只对该模块有效,想要改变这个模块里的参数数值,只需要在这里改变即可。这里设置成24是为了方便观察,节省时间。
对比波形
24个时钟脉冲输出就会取反,同理trl文件中24999999个脉冲(0.5s)之后led灯会改变状态,实现1s内闪烁。
分配管脚
全编译后上板验证
led灯在1s内闪烁,且s1一直按led灯会一直亮(s1按下去为低电平,复位有效,led_out=0,led灯亮,和预期一致。
使用单片 EMI 滤波器滤除拥挤环境中的共模噪声
专用5G网络如何塑造企业解决方案的未来
freeRTOS中空闲任务的作用
变频器应用中的干扰问题及对策
高性能复合材料的十大常见应用领域
基于FPGA的计数器设计
紫光集团频遭“被破产”之网媒乱象迷局
激光雷达技术提供商Aeva宣布获得全球顶级车企定点,浅谈加速度传感器原理及其应用
液体流量传感器用于船舶脱硫塔装置进行船舶废气废水处理的方法
交流接触器的型号及含义
44家LED相关企业公布了2019年一季度报告
超软IGBT续流二极管具备行业领先的低损耗特性
用于宽带A/D转换器的变压器耦合前端
聊聊在使用Spring AOP时一个非常常见的概念AspectJ
酶联免疫分析仪的特点及参数
推力测试机显示未连接气源可能的原因有哪些?
荣耀新款无线耳机对比AirPods 从外观上看简直就是克隆体
如何加强输电线路防雷技术?有哪些维护措施?
研华许杰弘:发力IoT边缘智能服务 加速物联网战略中国落地
达芬奇视频处理器如何为智能安防系统带来差异化?