FPGA初学-调用IP核实现计数器

FPGA初学-调用IP核实现计数器
首先新建工程文件,我将它命名为counter_ip
FPGA初学-调用IP核实现计数器_第1张图片

点击tools-MegaWizardFPGA初学-调用IP核实现计数器_第2张图片FPGA初学-调用IP核实现计数器_第3张图片
FPGA初学-调用IP核实现计数器_第4张图片选择Up only,增计数模式。点击next
FPGA初学-调用IP核实现计数器_第5张图片
设置计数器计数到10的时候自动清零(因为计数器是四位的,最大值是15)
选择carry-in和carry-out,具体为啥老师说等到后面讲计数器级联的时候再解释,我也不懂。然后一路next,然后funish。
FPGA初学-调用IP核实现计数器_第6张图片然后就可以看到qip文件已经添加进来了。
右键files-add/removefiles
FPGA初学-调用IP核实现计数器_第7张图片
添加counterFPGA初学-调用IP核实现计数器_第8张图片
新建一个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

FPGA初学-调用IP核实现计数器_第9张图片
将q显示成十进制可以看到,计数到9之后就置零了,因为我们一开始在设置ip核的时候设置的是计数10个数清零
FPGA初学-调用IP核实现计数器_第10张图片下面试一下八位计数

八位计数,我们采用两个计数器级联的模式进行计数。当第一级计满16次之后,cout连接第二级的cin
FPGA初学-调用IP核实现计数器_第11张图片
奈何电脑显示不行
奈何ipad版本低用不了pencil

FPGA初学-调用IP核实现计数器_第12张图片新建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 

最后的结果是FPGA初学-调用IP核实现计数器_第13张图片

你可能感兴趣的:(FPGA初学笔记,fpga,verilog)