任意整数分频器 verilog代码实现,testbench仿真

直接上代码吧,将奇数以及偶数分频合并在一起,需要注意当分频数为1时情况的书写

module test01(
		input clk_in,
		input rst_n,
		output clk_out);
                

		localparam div_width = 3, //分频计数器位宽
		            fre_div = 7; //分频数
		
		reg clk_even;
		reg [div_width-1:0] clk_even_cnt;  //偶数计数器
		reg clk_1,clk_2;
		wire clk_odd;
		reg [div_width-1:0] clk_1_cnt,clk_2_cnt; //奇数计数器

                     assign clk_out = (fre_div == 1'b1)? clk_in : (fre_div[0]? clk_odd : clk_even); //输出
                     assign clk_odd = clk_1 | clk_2;

//偶数分频情况
	 	always @ (posedge clk_in or negedge rst_n)
			begin
			       if (!rst_n)
			            begin
				            clk_even <= 1'b0;
    				        clk_even_cnt <= 0;
			            end
		           else if (clk_even_cnt == fre_div/2-1)
                        begin
				            clk_even <= ~clk_even;
    				        clk_even_cnt <= clk_even_cnt + 1'b1;
			            end
                   else if (clk_even_cnt == fre_div - 1)
                        begin
				            clk_even <= ~clk_even;
    			            clk_even_cnt <= 0;
			            end
		           else
                        begin
			             	clk_even <= clk_even;
    				        clk_even_cnt <= clk_even_cnt + 1'b1;
			            end
			end


//奇数分频情况
       always @ (posedge clk_in or negedge rst_n)
			begin
			      if (!rst_n)
			            begin
				           clk_1 <= 1'b0;
    				       clk_1_cnt <= 0;
			            end
		          else if (clk_1_cnt  == (fre_div-1)/2)
                        begin
				           clk_1 <= ~clk_1;
    				       clk_1_cnt  <= clk_1_cnt + 1'b1;
			            end
                 else if (clk_1_cnt  == fre_div - 1)
                        begin
				           clk_1 <= ~clk_1;
    				       clk_1_cnt  <= 0;
			            end
		        else
                        begin
				           clk_1 <= clk_1;
    				       clk_1_cnt  <= clk_1_cnt  + 1'b1;
			            end
			end

      always @ (negedge clk_in or negedge rst_n)
			begin
			       if (!rst_n)
			           begin
				         clk_2 <= 1'b0;
    				     clk_2_cnt <= 0;
			           end
		          else if (clk_2_cnt  == (fre_div-1)/2)
                       begin
				         clk_2 <= ~clk_2;
    				     clk_2_cnt  <= clk_2_cnt  + 1'b1;
			           end
                 else if (clk_2_cnt  == fre_div - 1)
                        begin
  				           clk_2 <= ~clk_1;
  				           clk_2_cnt  <= 0;
			           end
		        else
                       begin
				         clk_2 <= clk_1;
    				     clk_2_cnt  <= clk_2_cnt  + 1'b1;
			            end
			end

endmodule

测试文件

`timescale 1ns / 1ps

module sim_test_01;
             reg clk_in;
             reg rst_n;
             wire clk_out;
             
      test01 mo(
		.clk_in(clk_in),
		.rst_n(rst_n),
		.clk_out(clk_out)); 
             
             initial 
                    begin
                          clk_in = 1'b0;
                          rst_n = 1'b1;
                          #20 rst_n = 1'b0;
                          #20 rst_n = 1'b1;
                    end
              
             always #10 clk_in = ~clk_in;
             
endmodule

分频数div_fre为1时
在这里插入图片描述
分频数div_fre为偶数时
在这里插入图片描述
分频数div_fre为奇数时
在这里插入图片描述

欢迎批评指正!

  • 12
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值