1.mis603教程上有这个实例,大家可以进行参考设计,分频器是FPGA学习的基础,大家要熟练掌握。
2.我由于要学习一下MODELSIM的仿真,今天就拿此历程熟悉一下modelsim的仿真过程。
多路分频主要是是实现2/3/4/8分频,教程讲解很详细,不必细说。只是注意3分频的技术重点。
源代码如下:
module fenpin(
input clk_i,
input rst_n_i,
output div2_o,
output div4_o,
output div3_o,
output div8_o
);
//2分频
reg div2_o_r;
always@(posedge clk_i or negedge rst_n_i)
begin
if(!rst_n_i)
div2_o_r<=1'b0;
else
div2_o_r<=~div2_o_r;
end
//计数器产生
reg [1:0] div_cnt1;
always@(posedge clk_i or negedge rst_n_i)
begin
if(!rst_n_i)
div_cnt1<=2'b00;
else
div_cnt1<=div_cnt1+1'b1;
end
//4分频
reg div4_o_r;
always@(posedge clk_i or negedge rst_n_i)
begin
if(!rst_n_i)
div4_o_r<=1'b0;
else if(div_cnt1==2'b00||div_cnt1==2'b10)
div4_o_r<=~div4_o_r;
else
div4_o_r<=div4_o_r;
end
//8分频
reg div8_o_r;
always@(posedge clk_i or negedge rst_n_i)
begin
if(!rst_n_i)
div8_o_r<=1'b0;
else if((~div_cnt1[0])&&(~div_cnt1[1]))
div8_o_r<=~div8_o_r;
else
div8_o_r<=div8_o_r;
end
//3分频
reg [1:0]pos_cnt;
reg [1:0]neg_cnt;
always@(posedge div2_o_r or negedge rst_n_i)
begin
if(!rst_n_i)
pos_cnt<=2'b0;
else if(pos_cnt==2'd2)
pos_cnt<=2'b0;
else
pos_cnt<=pos_cnt+1'b1;
end
always@(negedge div2_o_r or negedge rst_n_i)
begin
if(!rst_n_i)
neg_cnt<=2'b0;
else if(neg_cnt==2'd2)
neg_cnt<=2'b0;
else
neg_cnt<=neg_cnt+1'b1;
end
reg div3_o_r0;
reg div3_o_r1;
always@(posedge div2_o_r or negedge rst_n_i)
begin
if(!rst_n_i)
div3_o_r0<=1'b0;
else if(pos_cnt<2'd1)
div3_o_r0<=1'b1;
else
div3_o_r0<=1'b0;
end
always@(negedge div2_o_r or negedge rst_n_i)
begin
if(!rst_n_i)
div3_o_r1<=1'b0;
else if(neg_cnt<2'd1)
div3_o_r1<=1'b1;
else
div3_o_r1<=1'b0;
end
assign div2_o=div2_o_r;
assign div4_o=div4_o_r;
assign div3_o=div3_o_r0|div3_o_r1;
assign div8_o=div8_o_r;
endmodule
然后进行仿真,撰写testbench,可以将testbench看做一个模块或者设备,和你自己编写的模块进行通信。通过testbench模块向待测模块输出信号作为激励,同时接收从待测模块的输出信号来查看结果。
因此待测模块reg信号变成wire型,wire信号变成reg型。(inout型信号也要变成wire型,同时要用一个reg型信号作为输出寄存器,同时设置一个三态门)。
testbench代码如下:
// Verilog Test Bench template for design : fenpin
//
// Simulation tool : ModelSim (Verilog)
//
`timescale 1 ps/ 1 ps
module fenpin_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg clk_i;
reg rst_n_i;
// wires
wire div2_o;
wire div3_o;
wire div4_o;
wire div8_o;
// assign statements (if any)
fenpin i1 (
// port map - connection between master ports and signals/registers
.clk_i(clk_i),
.div2_o(div2_o),
.div3_o(div3_o),
.div4_o(div4_o),
.div8_o(div8_o),
.rst_n_i(rst_n_i)
);
initial
begin
rst_n_i=0;
clk_i=0;
#1000;
@(posedge clk_i);
rst_n_i=1;
#100000000;
$stop;
$display("Running testbench");
end
always
// optional sensitivity list
// @(event1 or event2 or .... eventn)
begin
// code executes for every event on sensitivity list
// insert code here --> begin
@eachvec;
// --> end
end
always #20 clk_i=~clk_i;
endmodule
最后进行仿真观察波形!
|