[X]关闭

多路分频器设计

文档创建者:贾文洋
浏览次数:4651
最后更新:2015-12-31
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
最后进行仿真观察波形!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

发表评论已发布 1

贾文洋

发表于 2015-12-31 17:56:14 | 显示全部楼层

大家在学习教程时遇到的问题可以在论坛上发表,共同交流!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则