機能
フリップフロップ4個を用いたレジスタ回路.同期リセット機能付き
信号機能
D_in[4] = データ入力信号
SR_in = 同期リセット入力信号
ENB_in = データ保持の有効入力信号
Q_out[4] = データ出力信号
解説
4個のフリップフロップを用いて,クロックに同期してD_in信号の値をQ_outに反映します.
SR_inがHレベルのときは同期リセットとして,初期値を保持します.
ENB_inがHレベルのときはD_inの値をQ_outに反映し,ENB_inがLレベルのときはQ_inは値を保持し続けます.
留意点
NSLではクロックと非同期リセットは暗黙で使用されます.
同期リセットを行なう場合には,reg構文で宣言されたレジスタに初期値を与えません.
非同期式リセットを行ないたい場合には,FF_4bit_AR.nslを参照してください.
Q_outのような出力信号に対して直接レジスタ記述は行なえません.
(I/OピンにF/Fがあるかどうかはシリコン次第であるため)
レジスタの値を出力したい場合には,内部で宣言したレジスタの値を出力信号に接続する論理式を書きます.
NSL記述例
/* ************************************************************ */
declare FF_4bit_sr {
input D_in[4] ; // D input
input SR_in ; // Synchronous RESET input
input ENB_in ; // Data hold enable input
output Q_out[4] ; // Flip-Flop data output
}
/* ************************************************************ */
// Declare module
module FF_4bit_sr {
/* ************************************************************ */
// Internal operation signals
reg Dtype_FF[4] ; // Declare D-type F/F
/* ************************************************************ */
// Equation
{
/* **** Data output **** */
Q_out = Dtype_FF ; // Q_out = Dtype_FF[3:0] ; is acceptable
// Q_out[3:0] = .... is not acceptable
/* **** Flip-Flop equation **** */
// Statement variation #1
if ( SR_in )
Dtype_FF := 4'b0 ; // Set INITIAL value
else
if ( ENB_in )
Dtype_FF := D_in ; // Capture NEW data
/*
// Statement variation #2
if ( SR_in ) {
Dtype_FF := 4'b0 ; // Set INITIAL value
} else {
if ( ENB_in ) {
Dtype_FF := D_in ; // Capture NEW data.
}
}
*/
/*
// Statement variation #3 : Using ALTERNATE syntax
alt {
SR_in : Dtype_FF := 4'b0 ; // Set INITIAL value
ENB_in : Dtype_FF := D_in ; // Capture NEW data.
}
*/
}
}
/* ************************************************************ */
Verilog変換例
/*
Produced by NSL Core, IP ARCH, Inc. Fri Jun 04 17:54:14 2010
Licensed to :EVALUATION USER:
*/
module FF_4bit_sr ( p_reset , m_clock , D_in , SR_in , ENB_in , Q_out );
input p_reset, m_clock;
input [3:0] D_in;
input SR_in;
input ENB_in;
output [3:0] Q_out;
reg [3:0] Dtype_FF;
assign Q_out = Dtype_FF;
always @(posedge m_clock)
begin
//synthesis translate_off
if (((~SR_in)&ENB_in)&SR_in) Dtype_FF <= 4'bx;
else
//synthesis translate_on
if ((~SR_in)&ENB_in)
Dtype_FF <= D_in;
else if (SR_in)
Dtype_FF <= 4'b0000;
end
//synthesis translate_off
always @(posedge m_clock)
begin
if ((((~SR_in)&ENB_in)|SR_in=='b1) ||
(((~SR_in)&ENB_in)|SR_in=='b0) ) begin
if (((~SR_in)&ENB_in)&SR_in)
begin $display("Warning: assign collision(FF_4bit_sr:Dtype_FF) at %d",$time);
end
end
else
$display("Warning: register set hazard(FF_4bit_sr:Dtype_FF) at %d",$time);
end
//synthesis translate_on
endmodule
/*
Produced by NSL Core, IP ARCH, Inc. Fri Jun 04 17:54:14 2010
Licensed to
*/