Overtone NSL Support

NSLサポートページ



4ビットバイナリカウンタ


機能

4ビット同期式カウンタ回路
– 非同期リセット
– キャリ入力
– 初期値入力
– カウント有効
– キャリ出力

信号機能

PARAM_in[4] = 初期値
LOAD_in = 初期値ロード要求
ENB_in = カウント有効
CARRY_in = キャリ入力

Q_out[4] = データ出力信号
CARRY_out = キャリ出力

解説

4個のフリップフロップを用いて,クロック同期のカウンタを設計します.
PARAM_inに示された値はLOAD_inがHレベルのときに4ビットレジスタにロードされます.
ロードされた値は,ENB_inがHレベルかつCARRY_in()制御信号入力が有効のときに+1加算されレジスタに保持されます.
4ビットレジスタの値がすべてHレベル(4′b1111)であれば,CARRY_out()制御信号出力を有効にします.

留意点

NSLではクロックと非同期リセットは暗黙で使用されます.
CARRY_in()制御入力が有効のときには,instruct構文で記述されたステートメントが実行されます.

NSL記述例

/* ************************************************************ */
declare CNT4 {

    input       PARAM_in[4] ;   // Initial parameter.
    input       LOAD_in ;       // Synchronous PARAM_in load request.
    input       ENB_in ;        // Count enable
    func_in     CARRY_in() ;    // Carry-input from a lower level 4bit
                                // counter's carry-output.

    output      Q_out[4] ;      // Flip-Flop data output
    func_out    CARRY_out() ;   // Carry-output to a higher lovel 4bit
                                // counter's carry-input

}

/* ************************************************************ */
// Declare module
module CNT4 {

/* ************************************************************ */
// Internal operation signals
    reg         Counter_4bit[4] ;       // DタイプF/Fの宣言.

/* ************************************************************ */
// Equation

/* *********************************************** */
/* Pallarel equation */

    {
    /* **** Data output **** */
        Q_out = Counter_4bit ;      // Q_out = Counter_4bit[3:0] is OK.
                                    // Q_out[3:0] = .... is NG.

    /* **** Flip-Flop equation **** */
        if ( LOAD_in )
            Counter_4bit := PARAM_in ;

    /* **** Carry-out equation **** */
        if ( Counter_4bit == 4'b1111 ) {
            CARRY_out() ;
        }
    }

/* *********************************************** */
/* Function independent equation */
    function    CARRY_in {
        if ( ENB_in ) {
            Counter_4bit := Counter_4bit + 4'b1 ;
                            // Must define inclement data bit width !!!
        }
    }

}
/* ************************************************************ */

Verilog変換例

/*
 Produced by NSL Core, IP ARCH, Inc. Fri Jun 04 17:53:36 2010

 Licensed to :EVALUATION USER:
*/

module CNT4 ( p_reset , m_clock , PARAM_in , LOAD_in , ENB_in , CARRY_in , Q_out , CARRY_out );
  input p_reset, m_clock;
  input [3:0] PARAM_in;
  input LOAD_in;
  input ENB_in;
  input CARRY_in;
  output [3:0] Q_out;
  output CARRY_out;
  reg [3:0] Counter_4bit;
  wire _net_0;

   assign  _net_0 = (Counter_4bit)==(4'b1111);
   assign  Q_out = Counter_4bit;
   assign  CARRY_out = _net_0;
always @(posedge m_clock)
  begin

//synthesis translate_off
if ((CARRY_in&ENB_in)&LOAD_in)   Counter_4bit <= 4'bx;
  else
//synthesis translate_on
if (CARRY_in&ENB_in)
      Counter_4bit <= (Counter_4bit)+(4'b0001);
else if (LOAD_in)
      Counter_4bit <= PARAM_in;
end

//synthesis translate_off
always @(posedge m_clock)
  begin
if (((CARRY_in&ENB_in)|LOAD_in=='b1) ||
 ((CARRY_in&ENB_in)|LOAD_in=='b0) ) begin
 if ((CARRY_in&ENB_in)&LOAD_in)
 begin $display("Warning: assign collision(CNT4:Counter_4bit) at %d",$time);

  end
 end
 else
 $display("Warning: register set hazard(CNT4:Counter_4bit) at %d",$time);
  end
//synthesis translate_on
endmodule
/*
 Produced by NSL Core, IP ARCH, Inc. Fri Jun 04 17:53:36 2010

 Licensed to
*/
PAGE TOP