当前位置:   article > 正文

FPGA初学-调用IP核实现计数器_模200的二进制加法计数器ip核实现、

模200的二进制加法计数器ip核实现、

FPGA初学-调用IP核实现计数器
首先新建工程文件,我将它命名为counter_ip
在这里插入图片描述

点击tools-MegaWizard在这里插入图片描述在这里插入图片描述
在这里插入图片描述选择Up only,增计数模式。点击next
在这里插入图片描述
设置计数器计数到10的时候自动清零(因为计数器是四位的,最大值是15)
选择carry-in和carry-out,具体为啥老师说等到后面讲计数器级联的时候再解释,我也不懂。然后一路next,然后funish。
在这里插入图片描述然后就可以看到qip文件已经添加进来了。
右键files-add/removefiles
在这里插入图片描述
添加counter在这里插入图片描述
新建一个Verilog文件
命名为counter_tb
编写test bench文件

`timescale 1ns/1ns

`define clock_period 20

module counter_tb;
		reg cin;//进位输入
		reg clk;//计数基准时钟
		
		wire cout;//进位输出,当计数达到顶值时,产生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;//延时5个时钟周期之后,让cin信号等于1
							#(`clock_period)cin=0;//再延时一个时钟信号之后让cin信号等于0,此时就产生了一个脉冲信号
							//以上,让高电平保持五个时钟周期,让低电平保持一个时钟周期
						
						
						end 
						#(`clock_period*200);
						$stop;

				end


endmodule 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

保存,编译,点击tools-run simulation tools-rtl simulation

在这里插入图片描述
将q显示成十进制可以看到,计数到9之后就置零了,因为我们一开始在设置ip核的时候设置的是计数10个数清零
在这里插入图片描述下面试一下八位计数

八位计数,我们采用两个计数器级联的模式进行计数。当第一级计满16次之后,cout连接第二级的cin
在这里插入图片描述
奈何电脑显示不行
奈何ipad版本低用不了pencil

在这里插入图片描述新建counter_top.v

module counter_top(cin,clk,cout,q);
		input cin;
		input clk;
		
		output cout;
		output [7:0]q;
		
		
		wire count0;
		counter  counter0(
				.cin(cin),
				.clock(clk),
				.cout(count0),//第一级的cout连接到第二级的cin
				.q(q[3:0])
	);
	
	
			counter  counter1(
				.cin(count0),
				.clock(clk),
				.cout(cout),
				.q(q[7:4])
	);

endmodule 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

新建counter_top_tb.v

`timescale 1ns/1ns

`define clock_period 20

module counter_top_tb;
		reg cin;//进位输入
		reg clk;//计数基准时钟
		
		wire cout;//进位输出,当计数达到顶值时,产生cout脉冲信号输出
		wire [7:0]q;//计数器


counter_top  counter0(
	.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;//延时5个时钟周期之后,让cin信号等于1
							#(`clock_period)cin=0;//再延时一个时钟信号之后让cin信号等于0,此时就产生了一个脉冲信号
							//以上,让高电平保持五个时钟周期,让低电平保持一个时钟周期
						
						
						end 
						#(`clock_period*200);
						$stop;

				end


endmodule 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

最后的结果是在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/607799
推荐阅读
相关标签
  

闽ICP备14008679号