機能
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
*/