让心去旅行!

3分频的verilog实现(转载)

上一篇 / 下一篇  2006-09-11 17:14:11 / 天气: 晴朗 / 心情: 高兴

verilog实现3分频
f9adD AJ2z144770
1Am%e8@ g U144770分析思路:
J%J [(g$W144770首先考虑输入输出,作为分频电路,有一个时钟输入端,clk,输出端div3,再加一个复位端(这里不加也可)
Th`:N7] ys144770所以输入 clk,rst
a0pI$Ui*r5]144770       输出 div3
-y-j)R&J v;k|5s,Q&y144770再考虑状态转换的问题
(r*nW^2w t*eh'I#? X144770      既然是3分频,应该有3种状态,0、0、1 or 1、1、0(0、1、1)EDA中国门户网站6qU"CwCB
在时钟的作用下,应该不停的在这三种状态下转换,并且输出仅仅依赖于当前的状态
MT7aQ'G f F144770EDA中国门户网站:^0LVWH
代码如下:
9V&d5q:a5e@1I5X144770
Jf/{9aiDO144770//Moore fsm
Am:u9k'mJE144770// Written by keaty,University of SoutheastEDA中国门户网站)g%w[5`Y'Z

w!pq&m Q144770module div_fsm (clk,rst,div3);
l1QE8v l.\%DW144770input                clk,rst;EDA中国门户网站M_2F u&?-uY$kN
output                div3;EDA中国门户网站_&s-v OB*k(^K4L
reg                div3;EDA中国门户网站&`1j%sYyh}

N6P EC#X1I8d144770parameter[1:0]  S0=2'd0,EDA中国门户网站H0Dk9Rp.W B3OQ
                S1=2'd1,EDA中国门户网站z!h~!oW${z'h6\
                S2=2'd2;EDA中国门户网站],TY7[0ip#~WEJ.M

o9f;wI/a p144770reg[1:0]                state,next_state;
:CEaD3A144770EDA中国门户网站]-TT\-jJQyn F
always @ (posedge clk)EDA中国门户网站.b7h_qqo*^ d0]
beginEDA中国门户网站8e1KaK~ _
        if(!rst) state<=S0;
W$V0iL?144770        else     state<=#1 next_state;EDA中国门户网站9G6i1Q n'U
end
G8L7jlM u}(u}144770EDA中国门户网站1Y'm4C2U-p no
always @ (state)
Q_m i*vD144770beginEDA中国门户网站!T"QB!P;hM#j
        //default values
&G"Q B)k&I|K~:P#|oA144770        next_state=S0;EDA中国门户网站D0YCo @6r&~,]
        case (state)EDA中国门户网站$qgf1E:Z4}1z)c
                S0: beginEDA中国门户网站)m c8B%u Uy!b%wX7?
                         next_state=S1;EDA中国门户网站nS}6N5^O[
                         div3=0;EDA中国门户网站~2O _ U[
                    end
Y0~/w5U6ML9s144770                    
gk2_ \+SK'g6g9n144770                S1: begin
-kD;^g2VS.}D5X}|144770                         next_state=S2;EDA中国门户网站4Xf p8BCsq
                         div3=0;
$t;U4I:sY u8D D144770                    end
zH{d(`9M9re144770                             
n3a+x S4xT$TQq144770                S2: begin
Q:L]F3x)u_ ?144770                         next_state=S0;
.jummn r"I0A:L144770                         div3=1;
(P1Z}/^r(X@x/I ]144770                    endEDA中国门户网站 g L.I6i#JKu.Q y
                    EDA中国门户网站 W%|YD+oVId7q
                        endcase
8W9c m@4X"xL144770endEDA中国门户网站,X D)Xb(S
endmoduleEDA中国门户网站9sQk4U&g.U Df/I

d${)~#ir4A144770
&[V&lj}Q4vg144770// test benches
_.m#Y1t1@.F3D1V!G144770module div_fsm_t;
PEY?${` | N-z144770reg         clk,rst;EDA中国门户网站"A1Rn6|/h6q fBX,hU
wire        div3;EDA中国门户网站iG*c9Hy
EDA中国门户网站'K.D4m2R3uM^ `
div_fsm U1(clk,rst,div3);
z)dw%Vk \144770EDA中国门户网站By-`&d%T)AT+HK
initial begin
5P/b5XP T2J4SQ144770        clk=0; rst=0;
:_L9xw^Cx144770        #300   rst=1;
$u nI%^'X[ gp144770end
&DOt"h iH,Y144770
\q U5e"x9_ @n6W w144770always #50 clk=~clk;
C U|I&@i#`2iBO"u144770endmoduleEDA中国门户网站g.|:@PaJ7E

+`\u"T:{0|Oa#G144770所有的整数分频器都可以按照次方法来实现。

TAG:

演绎精彩的个人空间 引用 删除 演绎精彩   /   2006-09-13 22:02:12
module f3c(clk, reset,clk_out);
     
input clk, reset;
output clk_out;

wire clk_out;
reg clk_out1, clk_out2;

reg [1:0] count1, count2;
     
always @(posedge clk or negedge reset)
   if(!reset)
      begin
         count1 <= 0;
         clk_out1 <= 0;
      end  
  else if(count1 == 1 )
      begin
         clk_out1 <= ~clk_out1;
         count1 <= count1 + 1;
      end
  else if(count1 == 2)
      begin
        clk_out1 <= ~clk_out1;
        count1 <= 0;
      end
  else
        count1 <= count1 + 1;
   
always @(negedge clk or negedge reset)
   if(!reset)
      begin
         count2 <= 0;
         clk_out2 <= 0;
      end  
  else if(count2 == 1)
      begin
         clk_out2 <= ~clk_out2;
         count2 <= count2 + 1;
      end
  else if(count2 == 2)
      begin
        clk_out2 <= ~clk_out2;
        count2 <= 0;
      end
  else
        count2 <= count2 + 1;
           
assign clk_out = (!clk_out1 )&& (!clk_out2);         
        
endmodule
演绎精彩的个人空间 引用 删除 演绎精彩   /   2006-09-13 21:59:23
module devide_3(ref_clk,rst_n,clkout);
input  ref_clk,rst_n;
output clkout;

reg div1,div2;
reg [1:0]count;

always@(posedge ref_clk or negedge rst_n)
   begin
        if(!rst_n)
                count <= 0;
       else if(count[1:0]==2'b10)
                count <= 0;
        else
                count <= count+1;
   end
   
   
always@(posedge ref_clk or negedge rst_n)
   begin
        if(!rst_n)
                div1 <= 0;
        else if(count[1:0] == 2'b00)
                div1 <= ~div1;
        else
                div1 <= div1;
   end


always@(negedge ref_clk or negedge rst_n)
begin
        if(!rst_n)
                div2 <= 0;
        else if(count[1:0]== 2'b10)
                div2 <= ~div2;
        else
                div2 <= div2;
end

assign clkout = div1^div2;
endmodule
演绎精彩的个人空间 引用 删除 演绎精彩   /   2006-09-13 21:58:31
楼上的,你的这个代码有点问题的,我给你们两个三分频代码看。
阳光灿烂的天空 引用 删除 shidai   /   2006-09-13 11:12:46
也是在网上看的50%的三分频,请大家参考评论
module devide_3(ref_clk,reset,clkout);
input  ref_clk,reset;
output clkout;

reg [1:0]count;

always@(posedge ref_clk)
begin
        if(!reset)
                count <= 0;
        else
                if(count[1:0]==2'b10)
                        count <= 0;
                else
                        count <= count+1;
end
reg div1,div2;
always@(posedge ref_clk)
begin
        if(count[1:0] == 2'b00)
                div1 <= ~div1;
        else
                div1 <= div1;
end

always@(negedge ref_clk)
begin
        if(count[1:0]== 2'b10)
                div2 <= ~div2;
        else
                div2 <= div2;
end

assign clkout = div1^div2;
endmodule

不如楼主的容易记忆理解
阳光灿烂的天空 引用 删除 shidai   /   2006-09-13 11:07:36
是的,占空比不是50%,但第二个有毛刺可以改成三段式的写法就可以,
不过这个方法还是很好的,清晰,简单
dieyi31的个人空间 引用 删除 dieyi31   /   2006-09-12 23:53:21
这样有两个问题
一占空比非50%
二状态转换容易出毛刺,状态01变10时其中状态输出的第二位会有毛刺
不推荐这样的设计
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-08-28  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 12726
  • 日志数: 106
  • 图片数: 9
  • 文件数: 4
  • 建立时间: 2006-05-07
  • 更新时间: 2008-06-17

RSS订阅

Open Toolbar