title: FPGA
date: 2020/11/08
cover: /img/fpga.png
categories: FPGA学习
tags: FPGA学习
FPGA 学习 10 基础 counter IP 核的使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-amSxguPJ-1627394885887)(img/blog_img/fpga/image-20210720112353055.png)]
主要功能 :当cin为高电平,且时钟上升沿到来的时,计数器开始计数,否则不进行计数。
q[3:0] : 表示的是输出的当前计数值。
cout : 表示计数器计满的进位信号。
主要目的: 通过学习调用IP 核,掌握基本 IP 的使用(调用)流程.,并且使用了 两个IP核模块实现级联,完成 0-99的计数功能.
LPM(Library Parameterized Modules) 即 :参数化的宏功能模块库
IP 核配置操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xTKjFCdc-1627394885891)(img/blog_img/fpga/image-20210329142846696.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F2o0MXPV-1627394885893)(img/blog_img/fpga/image-20210329142926447.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFnurDih-1627394885895)(img/blog_img/fpga/image-20210329142956412.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FRndToch-1627394885896)(img/blog_img/fpga/image-20210329143014652.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VqFcphsx-1627394885897)(img/blog_img/fpga/image-20210329143040650.png)]
可以看到,当cin为高电平的时候,且时钟上升沿到来的时,计数器开始计数,否则不会进行计数
counter_tb.v 文件
`timescale 1ns/1ns
`define clock_period 20
module counter_tb ;
reg cin ; //进位输入( +1)
reg clk; //计数基准时钟
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 (25) begin // repeat : 这里表示重复5次
cin = 0; //先初始化 cin =0 ; 低电平
#(`clock_period * 5) cin = 1 ; //隔5个时钟周期后,cin =1 变为高电平
#(`clock_period) cin = 0 ; //隔1个时钟周期后,cin =0 变为低电平
end
#(`clock_period * 200) ;
$stop ;
end
endmodule
counter_top.v文件
module counter_top(
cin ,
clk ,
cout ,
q
);
input cin ;
input clk ;
output cout;
output [7:0]q ;
wire cout_0 ;
counter counter_0(
.cin(cin),
.clock(clk),
.cout(cout_0),
.q(q[3:0])
);
counter counter_1(
.cin(cout_0),
.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 ; //进位输入( +1)
reg clk; //计数基准时钟
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 (320) begin // repeat : 这里表示重复5次
cin = 0; //先初始化 cin =0 ; 低电平
#(`clock_period * 5) cin = 1 ; //隔5个时钟周期后,cin =1 变为高电平
#(`clock_period) cin = 0 ; //隔1个时钟周期后,cin =0 变为低电平
end
#(`clock_period * 200) ;
$stop ;
end
endmodule