systemC構建時鐘分頻器
阿新 • • 發佈:2018-07-06
itl fin vpd emp put 文章 mar tail log 時鐘分頻一般有兩種,奇分頻和偶分頻,下面通過類中的普通函數方法分頻:
分頻器代碼:
#include "base.h" #ifndef CLKDIVIDER #define CLKDIVIDER const unsigned int N = 3; SC_MODULE(clk_divider){ sc_in<bool> clk ; sc_out<bool> divided ; sc_signal<bool> e , o ; sc_signal<sc_uint<32> > e_count; sc_signal<sc_uint<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<<clk.pos(); SC_METHOD(prc_clk_odivider); sensitive<<clk.neg(); SC_METHOD(output); sensitive<<e<<o; }; }; #endif
##############################################################################################################################
#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<bool> 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的顯式圖像:
參考文章:
https://blog.csdn.net/ywhfdl/article/details/7641288
systemC構建時鐘分頻器