目录
一、前言
完成工程设计之后,通常需要编写对应的测试文件对设计进行功能仿真验证。因为测试文件中对外是只有输入输出端口,并无信号,而测试文件就是通过编写输入信号的形式,连接到设计文件对应的输入端口,通过输出端口来确认逻辑是否正确。时钟又是最最基础的信号,无时钟信号类似手机不联网。本节将结合实际modelsim来讲解测试文件中时钟的写法。
二、时钟信号
从信号特点看,可分为占空比为50%和非50%,实现语句可分为always语句和forever语句
2.1 设计源文件
为方便查看时钟信号,功能很简单,输出信号等于输入信号
module clock(clk_in,clk_out );
input [7:0] clk_in;
output [7:0]clk_out;
assign clk_out=clk_in;
endmodule
2.2 测试文件
测试代码
`timescale 1ns / 1ns
module tb_clk( );
reg [7:0]tb_clkin;
wire clkout_50_always;
wire clkout_rand_always;
wire clkout_50_forever;
wire clkout_rand_forever;
parameter PERIOD = 10;
//always实现占空比为50%的时钟信号
always
begin
tb_clkin[0] = 1'b0;
#(PERIOD/2) tb_clkin[0] = 1'b1;
#(PERIOD/2);
end
clock dut0(.clk_in(tb_clkin[0]),.clk_out(clkout_50_always));
//always实现指定占空比的时钟信号
parameter DUTY_CYCLE = 0.7; //占空比为0.7
always begin
tb_clkin[1] = 1'b0;
#(PERIOD-(PERIOD*DUTY_CYCLE)) tb_clkin[1] = 1'b1;
#(PERIOD*DUTY_CYCLE);
end
clock dut1(.clk_in(tb_clkin[1]),.clk_out(clkout_rand_always));
//forever实现占空比为50%的时钟信号
initial
begin
tb_clkin[2] = 1'b0;
#(PERIOD/2);
forever
#(PERIOD/2) tb_clkin[2] = ~tb_clkin[2];
end
clock dut2(.clk_in(tb_clkin[2]),.clk_out(clkout_50_forever));
//forever实现指定占空比的时钟信号
initial
forever
begin
tb_clkin[3] = 1'b0;
#(PERIOD-(PERIOD*DUTY_CYCLE)) tb_clkin[3] = 1'b1;
#(PERIOD*DUTY_CYCLE);
end
clock dut3(.clk_in(tb_clkin[3] ),.clk_out(clkout_rand_forever));
endmodule
2.3 仿真结果
四种时钟信号如下图,占空比和周期符合设计
2.4 参考资料
Vivado软件language templates