做一下筆記,關於奇數分頻

奇數分頻之前本科做過很多,現在突然又忘了,最近在整理代碼,把一些簡單的小代碼整理起來,以便以後隨時查看。

奇數分頻採用時鐘的上升沿和下降沿分別計數分頻得到兩個佔空比不爲50%的時鐘信號,然後在進行或操作得到輸出的佔空比爲50%的時鐘。

下面是奇數分頻的小代碼,親測可以實現。

//奇數分頻代碼

//作者:昌磊

//單位:電子科技大學

//時間:2017.9.28

module odd_divide(
      clk,
		rst_n,
		clk_odd,
		clk_up,
		clk_down,
      cnt_down,
      cnt_up		
);
input clk;
input rst_n;


output clk_odd;
output clk_up;
output clk_down;


output cnt_up;
output cnt_down;


reg clk_up;
reg clk_down;


reg [3:0]cnt_up;
reg [3:0]cnt_down;


parameter N1=3,N2=6;//假設爲N分頻,則,N1=(N-1)/2,N2=N-1


assign clk_odd=clk_down|clk_up;


always@(posedge clk or negedge rst_n)
    if(rst_n==1'b0)
	    begin 
		   clk_up<=0;
	    end
	 else if(cnt_up==N1)
	         begin 
				clk_up<=~clk_up;
				end
	 else if(cnt_up==N2)
	         begin 
			   clk_up<=~clk_up;
				end	
    else clk_up<=clk_up;
	 
always@(negedge clk or negedge rst_n)
    if(rst_n==1'b0)
	    begin 
		   clk_down<=0;
	    end
	 else if(cnt_down==N1)
	         begin 
				clk_down<=~clk_down;
				end
	 else if(cnt_down==N2)
	         begin 
			   clk_down<=~clk_down;
				end	
    else clk_down<=clk_down;
/********************************************/
always@(posedge clk or negedge rst_n)
    if(rst_n==1'b0)
		    cnt_up<=4'd0;
	 else if(cnt_up==N2)
	       cnt_up<=4'd0; 
	      else
          cnt_up<=cnt_up+1'b1;
	
always@(negedge clk or negedge rst_n)
    if(rst_n==1'b0)
	      cnt_down<=4'd0;
	 else if(cnt_down==N2)
	       cnt_down<=4'd0;
			else
			 cnt_down<=cnt_down+1'b1;


endmodule 


//測試代碼

`timescale 1 ns/1 ns


module odd_divide_simulation();


reg clk;
reg rst_n;


wire clk_odd;
wire clk_up;
wire clk_down;
wire [3:0]cnt_down;
wire [3:0]cnt_up;




/***********************/


odd_divide U1(
    .clk(clk),
	 .rst_n(rst_n),
	 .clk_odd(clk_odd),
	 .clk_up(clk_up),
	 .clk_down(clk_down),
	 .cnt_down(cnt_down),
    .cnt_up(cnt_up)
	 );


/*************************/


initial 
begin
    rst_n=0; #1000;rst_n=1;
	 clk =0;forever #25 clk=~clk;
end
endmodule 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章