|
楼主 |
发表于 2003-11-20 17:08:32
|
显示全部楼层
最近小作:Verilog版的dpll
加减脉冲计数器源代码如下:
module IDCnt(clk,rst,INC,DEC,serout);
input clk,rst,INC,DEC;
output serout;
/////2分频计数器,其输出是相差为pi,占空比为50%的方波
reg div2;
wire cdiv2;
always@(posedge rst or negedge clk)
begin
if(rst) div2<=0;
else div2<=~div2;
end
assign cdiv2=~div2;
////INC与DEC的边沿检测
reg [1:0] INC_det,DEC_det;
wire INC_edge,DEC_edge;
wire ser1,ser2;
assign ser1=div2&clk;
assign ser2=cdiv2&clk;
always@(posedge rst or negedge ser1)
begin
if(rst) INC_det[1]<=0;
else INC_det[1]<=INC;
end
always@(posedge rst or negedge ser1)
begin
if(rst) INC_det[0]<=0;
else INC_det[0]<=INC_det[1];
end
assign INC_edge=~INC_det[1]&INC_det[0];
always@(posedge rst or posedge ser2)
begin
if(rst) DEC_det[1]<=0;
else DEC_det[1]<=DEC;
end
always@(posedge rst or posedge ser2)
begin
if(rst) DEC_det[0]<=0;
else DEC_det[0]<=DEC_det[1];
end
assign DEC_edge=~DEC_det[1]&DEC_det[0];
//////输出的数据来源与状态
reg INC_flag;
reg DEC_flag;
always@(posedge rst or negedge INC)
begin
if(rst) INC_flag<=1'b0;
else INC_flag<=~INC_flag;
end
always@(posedge rst or negedge DEC)
begin
if(rst) DEC_flag<=1'b0;
else DEC_flag<=~DEC_flag;
end
wire iddet;
//assign iddet=INC_edge|DEC_edge;
reg ioed;
always@(posedge rst or posedge INC_edge or posedge DEC_edge)
begin
if(rst) ioed<=1'b0;
else if(INC_edge) ioed<=1'b1;
else ioed<=1'b0;
end
wire detenable;
wire select;
assign select=(ioed&INC_flag&~DEC_flag)|(~ioed&~INC_flag&~DEC_flag)|(~ioed&INC_flag&DEC_flag)|(ioed&~INC_flag&DEC_flag);
assign detenable=select?cdiv2:div2;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////
reg idedge1,idedge2;
always@(posedge rst or negedge clk)
begin
if(rst) idedge1<=1'b0;
else if(detenable) idedge1<=INC_edge;
end
always@(posedge rst or negedge clk)
begin
if(rst) idedge2<=1'b0;
else if(detenable) idedge2<=DEC_edge;
end
reg state;
always@(posedge rst or posedge idedge1 or posedge idedge2)
begin
if(rst) state<=1'b0;
else if(idedge1) state<=~state;
else state<=~state;
end
////输出选择
assign serout=state?ser1:ser2;
endmodule |
|