機能
8word x 8bit SRAM モジュール
信号機能
AD_i[2] = アドレス入力
DB_i[8] = 書き込みデータ入力
CS_i = チップセレクト入力
WEN_i = 書き込みイネーブル入力
REN_i = 読み出しイネーブル入力
DB_o[8] = データ出力
記述特徴
メモリを推論させるためにはmemを使います。
mem メモリ名 [n][m] = { 初期値,初期値, … } ;
上記の例だと、nワードでmビットのメモリ名という名前のメモリが作られます。
{}で初期値を与えることができます。初期値がメモリの数より少ない場合、足りない分は0で初期化されます。
NSL記述例
/* ************************************************************ */
declare RAM_SRAM {
input AD_i[2] ; // Address (in)
input DB_i[8] ; // Write Data (in)
output DB_o[8] ; // Read Data (out)
input CS_i ; // Chip select (in)
input WEN_i ; // Write enable (in)
input REN_i ; // Read enable (in)
}
/* ************************************************************ */
// Declare module
module RAM_SRAM {
/* ************************************************************ */
// Internal operation signals
mem mem_array [4][8] ;
/* ************************************************************ */
// Equation
{
if ( CS_i & WEN_i ) {
mem_array[AD_i] := DB_i ;
}
if ( CS_i & REN_i ) {
DB_o = mem_array[AD_i] ;
} else {
DB_o = 8'h00 ;
}
}
/* ************************************************************ */
}
Verilog変換例
/*
Produced by NSL Core, IP ARCH, Inc. Fri Jun 04 17:55:03 2010
Licensed to :EVALUATION USER:
*/
module RAM_SRAM ( p_reset , m_clock , AD_i , DB_i , DB_o , CS_i , WEN_i , REN_i );
input p_reset, m_clock;
input [1:0] AD_i;
input [7:0] DB_i;
output [7:0] DB_o;
input CS_i;
input WEN_i;
input REN_i;
reg [7:0] mem_array [0:3];
wire _net_0;
wire _net_1;
assign _net_0 = CS_i&WEN_i;
assign _net_1 = CS_i&REN_i;
//synthesis translate_off
always @(posedge m_clock or posedge p_reset)
begin
if ((~_net_1)&_net_1)
begin $display("Warning: assign collision(RAM_SRAM:DB_o) at %d",$time);
if (~_net_1) $display("assert (~_net_1) at 32\n");
if (_net_1) $display("assert (_net_1) at 30\n");
end
end
//synthesis translate_on
assign DB_o =
//synthesis translate_off
((~_net_1)&_net_1)? 8'bx :((~_net_1)|_net_1)?
//synthesis translate_on
((~_net_1)?8'b00000000:8'b0)|
((_net_1)?mem_array[AD_i]:8'b0)
//synthesis translate_off
:8'bx
//synthesis translate_on
;
always @(posedge m_clock)
begin
if (_net_0 )
mem_array[AD_i] <= DB_i;
end
endmodule
/*
Produced by NSL Core, IP ARCH, Inc. Fri Jun 04 17:55:03 2010
Licensed to
*/