时钟分频一般有两种,奇分频和偶分频,下面通过类中的普通函数方法分频:

分频器代码:

#include "base.h"  #ifndef CLKDIVIDER #define CLKDIVIDER  const unsigned int N =  3;  SC_MODULE(clk_divider){     sc_in
  clk ;     sc_out
 divided ;          sc_signal
 e , o ;          sc_signal
<32> > e_count;     sc_signal
<32> > o_count;          void prc_clk_edivider();     void prc_clk_odivider();     void output();     bool param(unsigned int N);          SC_CTOR(clk_divider){         SC_METHOD(prc_clk_edivider);         sensitive<
<
<
<

##############################################################################################################################

#include "clkdivider.h"  void clk_divider::prc_clk_edivider(){     sc_uint<32> temp = e_count.read();      if( temp == (N/2-1)  )     {         //    对于一位的操作只能用!取反         e = !e ;         e_count = 0 ;     }     else         e_count.write(temp+1) ;          }  void clk_divider::prc_clk_odivider(){     sc_uint<32> temp = o_count.read();      if( temp == (N/2-1)  )     {         //    对于一位的操作只能用!取反         o = !o ;         o_count = 0 ;     }     else         o_count.write(temp+1) ;          }  void clk_divider::output(){     if( param(N) )         divided = e|o ;     else         divided = e ;      } bool clk_divider::param(unsigned N){         return N%2 ; }

##############################################################################################################################

#include "clkdivider.h"  int sc_main(int argc , char * argv[]){     //    signal defination     sc_signal
 q ;          sc_clock clk("clock",1,SC_NS,0.5);          //  istance the component     clk_divider div("fre_divider");     div(clk,q);          sc_trace_file * vcd = sc_create_vcd_trace_file("record");     sc_trace(vcd,clk,"clock");     sc_trace(vcd,q,"divided");           sc_start(1000,SC_NS);     sc_close_vcd_trace_file(vcd);      return 0 ; }

以上就是3分频的分频器的实现,只需改动常变量,那么就可以成为n分频的分频器。

下面是gtkwave的显式图像:

Screenshot from 2018-07-06 20-42-48.png

参考文章: