FPGA初学-调用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 

保存,编译,点击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 

新建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
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值