【FPGA零基础学习之旅#6】ip核基础知识之计数器

这篇具有很好参考价值的文章主要介绍了【FPGA零基础学习之旅#6】ip核基础知识之计数器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🎉欢迎来到FPGA专栏~ip核基础知识之计数器


  • ☆* o(≧▽≦)o *☆~我是小夏与酒🍹
  • 博客主页:小夏与酒的博客
  • 🎈该系列文章专栏:FPGA学习之旅
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️
    【FPGA零基础学习之旅#6】ip核基础知识之计数器

【FPGA零基础学习之旅#6】ip核基础知识之计数器

【FPGA零基础学习之旅#6】ip核基础知识之计数器

一、效果演示

LPM_COUNTER IP核的RTL视图:
【FPGA零基础学习之旅#6】ip核基础知识之计数器
IP核计数器级联的RTL视图:
【FPGA零基础学习之旅#6】ip核基础知识之计数器

二、ip核创建流程

需要注意:本篇博客所使用的Quartus Ⅱ版本为13.0

创建LPM_COUNTER IP核的过程如下所示:

1、点击“Tools”,选择魔术棒“MegaWizard Plug-In Manager”。
【FPGA零基础学习之旅#6】ip核基础知识之计数器
2、选择“Create a new custom megafunction variation”, 创建一个新的自定义兆函数变体(先这么翻译吧)。
该对话框中的三个选项分别是新建一个定制IP核编辑一个现有的IP核复制一个现有的定制IP核
【FPGA零基础学习之旅#6】ip核基础知识之计数器
3、本次项目使用LPM_COUNTER,选择好输出目录
【FPGA零基础学习之旅#6】ip核基础知识之计数器
4、先使用4位的计数器,选择递增计数方式
【FPGA零基础学习之旅#6】ip核基础知识之计数器
5、配置为计数值计数且为10d,有进位输入以及输出
【FPGA零基础学习之旅#6】ip核基础知识之计数器
6、对于该IP核的基础使用,其余选项默认即可,直到Finish。这时我们能在Files中看到counter.qip文件,双击之后显示如下,这仅仅只是IP核的说明文件而已,我们还需要手动添加counter.v文件。
【FPGA零基础学习之旅#6】ip核基础知识之计数器
7、添加counter.v文件。
【FPGA零基础学习之旅#6】ip核基础知识之计数器
8、进入添加文件的界面。
【FPGA零基础学习之旅#6】ip核基础知识之计数器
9、选择当时输出目录下的counter.v文件。
【FPGA零基础学习之旅#6】ip核基础知识之计数器
10、选择文件完成之后,点击Add,并点击Apply
【FPGA零基础学习之旅#6】ip核基础知识之计数器
11、此时就可以在Files中看到我们所添加的counter.v文件了。
【FPGA零基础学习之旅#6】ip核基础知识之计数器
12、将counter.v设置为顶层,并分析与综合
【FPGA零基础学习之旅#6】ip核基础知识之计数器
分析与综合之后的RTL:
【FPGA零基础学习之旅#6】ip核基础知识之计数器
📜可见通过IP核生成的RTL视图与通过自己编写计数器的RTL是存在差异的。通过IP核生成的电路 更接近于真实的电路结构,IP核做了很多结构上的优化,能够使性能大幅度提高

生成的IP核内容如下:

// megafunction wizard: %LPM_COUNTER%
// GENERATION: STANDARD
// VERSION: WM1.0
// MODULE: LPM_COUNTER 

// ============================================================
// File Name: counter.v
// Megafunction Name(s):
// 			LPM_COUNTER
//
// Simulation Library Files(s):
// 			lpm
// ============================================================
// ************************************************************
// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
//
// 13.0.0 Build 156 04/24/2013 SJ Full Version
// ************************************************************


//Copyright (C) 1991-2013 Altera Corporation
//Your use of Altera Corporation's design tools, logic functions 
//and other software and tools, and its AMPP partner logic 
//functions, and any output files from any of the foregoing 
//(including device programming or simulation files), and any 
//associated documentation or information are expressly subject 
//to the terms and conditions of the Altera Program License 
//Subscription Agreement, Altera MegaCore Function License 
//Agreement, or other applicable license agreement, including, 
//without limitation, that your use is for the sole purpose of 
//programming logic devices manufactured by Altera and sold by 
//Altera or its authorized distributors.  Please refer to the 
//applicable agreement for further details.


// synopsys translate_off
`timescale 1 ps / 1 ps
// synopsys translate_on
module counter (
	cin,
	clock,
	cout,
	q);

	input	  cin;
	input	  clock;
	output	  cout;
	output	[3:0]  q;

	wire  sub_wire0;
	wire [3:0] sub_wire1;
	wire  cout = sub_wire0;
	wire [3:0] q = sub_wire1[3:0];

	lpm_counter	LPM_COUNTER_component (
				.cin (cin),
				.clock (clock),
				.cout (sub_wire0),
				.q (sub_wire1),
				.aclr (1'b0),
				.aload (1'b0),
				.aset (1'b0),
				.clk_en (1'b1),
				.cnt_en (1'b1),
				.data ({4{1'b0}}),
				.eq (),
				.sclr (1'b0),
				.sload (1'b0),
				.sset (1'b0),
				.updown (1'b1));
	defparam
		LPM_COUNTER_component.lpm_direction = "UP",
		LPM_COUNTER_component.lpm_modulus = 10,
		LPM_COUNTER_component.lpm_port_updown = "PORT_UNUSED",
		LPM_COUNTER_component.lpm_type = "LPM_COUNTER",
		LPM_COUNTER_component.lpm_width = 4;


endmodule

// ============================================================
// CNX file retrieval info
// ============================================================
// Retrieval info: PRIVATE: ACLR NUMERIC "0"
// Retrieval info: PRIVATE: ALOAD NUMERIC "0"
// Retrieval info: PRIVATE: ASET NUMERIC "0"
// Retrieval info: PRIVATE: ASET_ALL1 NUMERIC "1"
// Retrieval info: PRIVATE: CLK_EN NUMERIC "0"
// Retrieval info: PRIVATE: CNT_EN NUMERIC "0"
// Retrieval info: PRIVATE: CarryIn NUMERIC "1"
// Retrieval info: PRIVATE: CarryOut NUMERIC "1"
// Retrieval info: PRIVATE: Direction NUMERIC "0"
// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone IV E"
// Retrieval info: PRIVATE: ModulusCounter NUMERIC "1"
// Retrieval info: PRIVATE: ModulusValue NUMERIC "10"
// Retrieval info: PRIVATE: SCLR NUMERIC "0"
// Retrieval info: PRIVATE: SLOAD NUMERIC "0"
// Retrieval info: PRIVATE: SSET NUMERIC "0"
// Retrieval info: PRIVATE: SSET_ALL1 NUMERIC "1"
// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
// Retrieval info: PRIVATE: nBit NUMERIC "4"
// Retrieval info: PRIVATE: new_diagram STRING "1"
// Retrieval info: LIBRARY: lpm lpm.lpm_components.all
// Retrieval info: CONSTANT: LPM_DIRECTION STRING "UP"
// Retrieval info: CONSTANT: LPM_MODULUS NUMERIC "10"
// Retrieval info: CONSTANT: LPM_PORT_UPDOWN STRING "PORT_UNUSED"
// Retrieval info: CONSTANT: LPM_TYPE STRING "LPM_COUNTER"
// Retrieval info: CONSTANT: LPM_WIDTH NUMERIC "4"
// Retrieval info: USED_PORT: cin 0 0 0 0 INPUT NODEFVAL "cin"
// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT NODEFVAL "clock"
// Retrieval info: USED_PORT: cout 0 0 0 0 OUTPUT NODEFVAL "cout"
// Retrieval info: USED_PORT: q 0 0 4 0 OUTPUT NODEFVAL "q[3..0]"
// Retrieval info: CONNECT: @cin 0 0 0 0 cin 0 0 0 0
// Retrieval info: CONNECT: @clock 0 0 0 0 clock 0 0 0 0
// Retrieval info: CONNECT: cout 0 0 0 0 @cout 0 0 0 0
// Retrieval info: CONNECT: q 0 0 4 0 @q 0 0 4 0
// Retrieval info: GEN_FILE: TYPE_NORMAL counter.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL counter.inc FALSE
// Retrieval info: GEN_FILE: TYPE_NORMAL counter.cmp FALSE
// Retrieval info: GEN_FILE: TYPE_NORMAL counter.bsf FALSE
// Retrieval info: GEN_FILE: TYPE_NORMAL counter_inst.v FALSE
// Retrieval info: GEN_FILE: TYPE_NORMAL counter_bb.v TRUE
// Retrieval info: LIB_FILE: lpm

三、四位计数器仿真与分析

编写测试激励文件:

`timescale 1ns/1ns
`define clock_period 20

module counter_tb;

	reg clk;//计数基准时钟
	reg cin;//进位输入
	
	wire cout;//进位输出
	wire [3:0]q;
	
	counter counter0(
		.cin(cin),
		.clock(clk),
		.cout(cout),
		.q(q)
	);
	
	initial clk = 1;
	always #(`clock_period/2) clk = ~clk;
	
	initial begin
		repeat(20)begin
			cin = 0;
			#(`clock_period*5) cin = 1;
			#(`clock_period) cin = 0;
		end
		#(`clock_period*200);
		$stop;
	end
	
endmodule

仿真结果:
【FPGA零基础学习之旅#6】ip核基础知识之计数器
可以观察到在仿真结果中出现了毛刺,在这里可以先理解为:由于IP核生成的计数器的电路更接近于真实的电路结构,且已经经过了布局布线的优化,所以会出现毛刺。对于更具体的原因,不需要深究。

当进位输入一个高电平之后,q计数1次;当进位输入10次高电平之后,q计数10次,同时产生一个进位输出高电平

四、计数器级联与仿真

先上RTL视图:
【FPGA零基础学习之旅#6】ip核基础知识之计数器
通过创建顶层文件的方式,调用两次IP核生成的计数器,并实现级联。

其中,Ucounter0实现的是低四位的计数,Ucounter1实现高四位的计数。当低四位计算10次之后,Ucounter0的cout产生一个进位输出,传入给Ucounter1作为进位输入。

在顶层文件中实现级联:

module counter_top(
	input 	cin,
	input 	clk,
	output 	[7:0]q,
	output 	cout
);
	
	wire cout0;
		
	counter Ucounter0(
		.cin(cin),
		.clock(clk),
		.cout(cout0),
		.q(q[3:0])
	);
	
	counter Ucounter1(
		.cin(cout0),
		.clock(clk),
		.cout(cout),
		.q(q[7:4])
	);

endmodule

在分析与综合之前,先把counter_top.v设置为顶层。

测试激励文件:

`timescale 1ns/1ns
`define clock_period 20

module counter_top_tb;

	reg clk;//计数基准时钟
	reg cin;//进位输入
	
	wire cout;//进位输出
	wire [7:0]q;
	
	counter_top counter_top_0(
		.cin(cin),
		.clk(clk),
		.cout(cout),
		.q(q)
	);
	
	initial clk = 1;
	always #(`clock_period/2) clk = ~clk;
	
	initial begin
		repeat(300)begin
			cin = 0;
			#(`clock_period*5) cin = 1;
			#(`clock_period) cin = 0;
		end
		#(`clock_period*200);
		$stop;
	end
	
endmodule

为了便于观察计数效果,可以将计数值改为hex格式
【FPGA零基础学习之旅#6】ip核基础知识之计数器

hex格式
十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F表示,其中A ~ F相当于十进制的10~15,这些称作十六进制数字。例如十进制数57,在二进制写作111001,在16进制写作39。
现在的16进制则普遍应用在计算机领域,这是因为将4个位元(Bit)化成单独的16进制数字不太困难。1个字节(Byte)可以表示成2个连续的16进制数字

观察仿真结果,当计数值到达99,即计数了100次时,cout产生一个高电平脉冲:
【FPGA零基础学习之旅#6】ip核基础知识之计数器

【FPGA零基础学习之旅#6】ip核基础知识之计数器

🧸结尾文章来源地址https://www.toymoban.com/news/detail-486086.html


  • ❤️ 感谢您的支持和鼓励! 😊🙏
  • 📜您可能感兴趣的内容:
  • 【stm32开发】stm32+oled最小系统板资料(原理图、PCB、示例代码)【六一】
  • 【FPGA零基础学习之旅#5】产生非等占空比信号
  • 【Arduino TinyGo】【最新】使用Go语言编写Arduino-环境搭建和点亮LED灯
  • 【全网首发开源教程】【Labview机器人仿真与控制】Labview与Solidworks多路支配关系-四足爬行机器人仿真与控制
    【FPGA零基础学习之旅#6】ip核基础知识之计数器

到了这里,关于【FPGA零基础学习之旅#6】ip核基础知识之计数器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA设计开发(基础课题):74LS160计数器芯片设计

    一、设计目的 1、学会用HDL语言设计时序电路; 2、用HDL语言设计74LS160计数器芯片的数字功能。 二、设计原理 计数器是最常用的寄存器逻辑电路,从微处理器的地址发生器到频率计都需要用到计数器。一般计数器可以分为两类:加法计数器和减法计数器。加法计数器每来一个

    2024年02月08日
    浏览(57)
  • (学习笔记-IP)IP基础知识

    IP在TCP/IP参考模型中处于第三层,也就是 网络层。 网络层的主要作用是: 实现主机与主机之间的通信,也叫点对点的通信。  网络层与数据链路层的关系: MAC的作用是实现 直连 的两个设备之间通信,而IP负责 没有直连 的两个网络之间进行通信传输  因此 计算机网络中需要

    2024年02月16日
    浏览(52)
  • 从1开始学习FPGA——FPGA的一些基础知识(1)

            这应该是笔者的第一篇CSDN博客了,之所以起名叫从1开始学习FPGA,原因在于笔者已经有一定的FPGA基础,并且使用FPGA完成了一些项目。但是基本没有系统成理论的学习FPGA,经常是用到哪看到哪,导致很多之前用过的东西往往经过一段时间就忘了。开始写CSDN博客更多的

    2024年04月10日
    浏览(48)
  • 网络基础学习:ip地址的知识

    IP地址是指用于标识在网络上的设备或节点的一组数字,它是Internet协议(IP)中使用的一种地址格式。 IP地址通常由32位二进制数表示,被分成4个8位的十进制数,每个十进制数之间用点分隔符分开。IP地址用于在因特网上寻找其他设备并进行数据通信,类似于邮政地址用于寻

    2024年02月04日
    浏览(51)
  • FAST迅捷路由的IP基础知识学习

    因此我们认为路由的过程就是将不同的IP地址网段的IP包进行转发。就相当于我们一个地方出发去另一个地方一样,会有很多路,那么你就需要从中选择一条你认为比较合适的路。那么实现这一功能的设备我们就称之为路由器。所以我们称路由器是数据包的运输工具。     一

    2024年02月05日
    浏览(43)
  • FPGA_学习_01_基础知识(有点劝退,心灵弱小者勿入)

    有些人喜欢直接拿开发板看教程开干,我认为了解点历史发展没什么坏处,一些FPGA的基础知识也是同样重要的。 有个粉丝评论说建议把 总结 写在前面,估计多半是被中间大段文字折磨后看到我说其实大段文字也可以浏览浏览就行了。 总结 :如果你能从头看到尾,说明你是

    2024年02月11日
    浏览(40)
  • 音视频之旅 - 基础知识

    像素 像素是图像的基本单元,一个个像素就组成了图像。你可以认为像素就是图像中的一个点。在下面这张图中,你可以看到一个个方块,这些方块就是像素 分辨率 图像(或视频)的分辨率是指图像的大小或尺寸。我们一般用像素个数来表示图像的尺寸。比如说一张1920x1

    2024年02月04日
    浏览(45)
  • FPGA-计数器的实现

    计数器是依托时钟实现的,在时钟沿(一般在上升沿)进行检测,实现计数加1; 计数是从0开始计数的,所以计数值为(M-1),其中M为计数的值。比如计数到10,我们实现时到9即可; 这里为计数器的第一种实现方法,该方法非最优方法,我们只需要了解即可,后续我们会介

    2024年02月04日
    浏览(41)
  • 【FPGA】Verilog:计数器 | 异步计数器 | 同步计数器 | 2位二进制计数器的实现 | 4位十进制计数器的实现

    目录 Ⅰ. 实践说明 0x00 计数器(Counter) 0x01 异步计数器(Asynchronous Counter)

    2024年02月05日
    浏览(57)
  • 【FPGA】Verilog:升降计数器 | 波纹计数器 | 约翰逊计数器 | 实现 4-bit 升降计数器的 UP/DOWN

    目录 Ⅰ. 理论部分 0x00 升降计数器(UP DOWN Counter) 0x01 波纹计数器(Ripple Counter)

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包