FPGA学习笔记-3、计数器设计与验证

计数器

1、设计定义:

  • 实验现象:LED在计数器的控制下,每500ms状态翻转一次,即LED亮灭的一个周期为1s。
  • FPGA所用的时钟为50mHZ或100mHZ,频率较高,对应的周期为20ns或10ns,而要想得到500ms的时间,则需要对系统时钟进行计数。
    -LED每500ms翻转一次,所以让计数器每记满500ms就使能一次,LED翻转,500ms记完后,计数器清零,之后重新计数。
    • 500ms=500_000_000ns / 20=25_000_000 个时钟周期。

2、设计输入:

//使用时序逻辑来进行设计
//module 模块名(端口列表:时钟信号(50M),复位信号(低电平有效),输出(led))
module counter(Clk50M,Res_n,led);


//对端口属性进行定义
	input Clk50M;//系统时钟50M
	input Res_n;//全局复位,_n表示低电平复位
	
	output reg led;//led作为寄存器类型的输出,led低电平有效
	//一共需要计数25_000_000次,为了表达这个数,将其转化为16进制位17D7840,则需要4*6+1=25位的寄存器才能完全表达
	//最高位为1,所以只需要1位来表示
	reg [24:0]cnt;

	
//逻辑描述,计数器的计数进程	
	always@(posedge Clk50M or negedge Res_n)//时序逻辑常见写法,分别以时钟信号的上升沿和复位信号的下降沿为敏感信号
	if(Res_n == 1'b0)//开发板复位键默认高电平,当按键按下时变为低电平,即判断当复位键按下时
		cnt <= 25'd0;//时序逻辑中的赋值号"<=",复位键按下,计数器cnt赋值为25位宽的十进制的0
	else if(cnt == 25'd24_999_999)//实际计数是从0开始的,所以从0到24_999_999,此时计数记满,将计数器清零
		cnt <= 25'd0;
	else
		cnt <= cnt +1'b1;//在没有复位或者记满的情况下,每来一个时钟的上升沿,计数器自加1
	
	
//led输出控制进程	
	always@(posedge Clk50M or negedge Res_n)
	if(Res_n == 1'b0)//同上
		led <= 1'b1;//复位时,LED输出高电平
	else if(cnt == 25'd24_999_999)
		led <= ~led;//LED翻转,"~":按位取反,当下一次记满500后,再次取反
	else
		led <= led;//在没有复位或者记满是,保持现有状态,这两行可以省略

		
endmodule

3、分析与综合

//声明仿真步进和精度
`timescale 1ns/1ns
`define clock_period 20//为了让代码具有通用性,所以定义一个时钟周期参数。表明时钟周期为20ns

module counter_tb;
	//声明激励信号源
	reg clk;//故意将激励信号源写成小写,好和下面端口名区分
	reg res_n;
	
	wire led;

	//声明端口名
	counter counter0(
		.Clk50M(clk),
		.Res_n(res_n),
		.led(led)
	);

	initial clk = 1;//习惯性让时钟在一开始位于1(有好处),位于0也可以
	//系统时钟为50M,则周期为20ns,让clk每延时10ns翻转一次,即得到20ns的时钟信号
	always #(`clock_period/2)//"`"表示调用一个宏定义参数,同开头的"`" 
		clk = ~clk;
		
		//产生复位信号	
	initial begin
		res_n = 1'b0;//低电平,系统处于复位状态
		#(`clock_period * 200);//延时200个系统周期
		res_n = 1'b1;//复位释放
		//没有控制逻辑,只有时钟和复位信号,其他由系统内部自己运行,所以只需要让系统运行一段时间后停下来即可
		#2000000000;//设置的LED亮灭一次为1s,所以要让仿真的时间大于1s才能看清实验现象
		$stop;
	
	end	


endmodule
  • 如果出现编译没有问题,而不能仿真的情况,再通过仿真报错文件修改quarters的代码后,记得重新编译后再进行仿真操作。
  • 后仿真会很慢,为了更早的观察到实验现象,可以将计数次数减小。待到后仿真无误之后再将其更正。但要记得重新进行全编译。

4、电路模型-RTL视图

  • 左侧窗口:

  • 在这里插入图片描述

    • Analysis & Synthesis —> Netlist Viewer ----> RT Viewer
      在这里插入图片描述
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
开始有计划写这本书的时候, Altera 还叫 Altera, 还没有加入 Intel 的大家庭, Xilinx 的 ZYNQ 也才刚刚开始有人探索, Altera 大学计划第一次将亚洲创新大赛由传统的 SOPC 大赛 换成了 SOC 大赛,软核变硬核,性能翻几番。 那个时候,能出一本认认真真讲 FPGA 设计的 书, 会得到非常高的评价。 而我,则由于工作变动, 中间拖沓了半年,当半年后再来准备动 笔时,才恍然领悟到, Altera 即将成为 Intel 的可编程事业部, 基于嵌入式硬核的 SOC FPGA 芯片开始获得了大量的关注,已经有不少大的小的公司在着手这方面的教学内容与板卡设 计。原本计划编写的内容在新技术新产品面前,好像显得非常的不值一提。 总感觉当大家把 目光都投在了前沿的可编程 SOC 上的时候,我再编写这样一本单纯讲解 FPGA 数字逻辑设计 的书会显得与时代脱节。 于是,编书的动力没有了那么强烈, 这事,又这么放了下来。 在这期间,我也向着 SOC FPGA 做了积极努力的探索, 学习了 Cyclone V SOC 的开发流 程, 从裸机到基于 Linux 嵌入式系统,实现了 FPGA 和 ARM Cortex-A9 CPU 之间的双向控制和 数据传输。 在做完这之后,就感觉遇到了瓶颈, 瓶颈主要来自于两个方面,第一是对 Linux 软件开发不熟悉,而 SOC FPGA 的处理器端应用又恰好需要对 Linux 的底层和应用都需要一 定的了解。 另一方面是对 FPGA 设计经验的欠缺,使用到 SOC FPGA 架构的场合,往往都是 一些较为复杂的系统,在系统中,本身就对 FPGA设计内容要求较高, 如视频流的处理, 运算加速逻辑的设计, 通信接口的实现等。 所以, 欠缺了任何一方面的知识, 在使用 SOC FPGA 架构的时候都会困难重重。如果 FPGA 方面没有踏实的功底,那么使用 SOC FPGA 也仅 仅只能是当做通用的嵌入式处理器使用, 无法将其结构的优势发挥出来 。 如果没有 ARM 嵌 入式处理器方面的踏实功底, SOC FPGA 也仅仅只能是个 FPGA。 所以, 编写这样一本单纯讲解 FPGA 数字逻辑的书还是非常有意义的,因为这才是真正合理应用 SOC FPGA 优势架构的 基础。
FPGA自学笔记设计验证是一本关于FPGA(可编程逻辑门阵列)的自学资料,介绍了FPGA的基本原理、设计流程和验证方法。该PDF文件是该自学笔记的电子版,便于学习者在线阅读和下载。 FPGA是一种可编程的硬件设备,其内部包含了大量的逻辑门和存储器单元,能够根据需要进行程序设计和逻辑配置。FPGA设计验证是实现FPGA自定义功能的关键步骤。 该自学笔记首先介绍了FPGA的基本原理,包括FPGA的构造和工作原理。然后详细介绍了FPGA设计流程,包括功能规格、设计草图、逻辑编码、功能仿真和综合等步骤。每个步骤都有详细的说明和实例,便于学习者理解和掌握。 此外,笔记还介绍了FPGA验证方法,包括功能仿真和时序分析。功能仿真用于验证设计是否满足功能要求,时序分析用于确定设计的最高工作频率。这些验证方法对于设计的正确性和可靠性至关重要。 FPGA自学笔记设计验证的PDF文件提供了方便的学习材料。学习者可以通过阅读该文件了解FPGA的基本原理和设计流程,并通过实例进行实践。这将帮助学习者掌握FPGA设计验证技能,从而能够独立完成FPGA项目的开发和调试。 总之,《FPGA自学笔记设计验证》是一本全面介绍FPGA设计验证的教材,PDF格式的电子版方便学习学习和实践。通过学习该书,学习者可以全面了解FPGA的工作原理和设计方法,并具备独立开发和验证FPGA项目的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值