4.1.3 SRAM
Altera のSRAMをシミュレーションしてみます。H8プロジェクトでは、AlteraのSRAMの特性を生かした設計したいと思っています。筆者もAlteraのSRAMを使いこなしているわけではないので、ここでシミュレーションしながら、使い方を確認しておきたいと思います。
4.1.3.1 Quartus MegaWizard
Wizardに従ってSRAMブロックを作成していきましょう。仕様は
ここで、3ポートを選んだ理由は、H8プロジェクトで使用を予定しているからです。
Quartus上で Tools=>MegaWizard...を選択して、上記仕様を選択していき下図のようになります。
図を見ればお分かりの通り、入力は、全てFFで受けて、出力もFFになっています。2クロック遅れで指定のAddressのDataが出力されます。OPTIONで出力FFなしにすることはできますが、入力のFFは削除できない仕様になっています。
4.1.3.2 RTL シミュレーション
それでは、合成対象ソースです。ram8x256_3port は、Wizardで作成した3ポートRAMです。
module h8_ram(data,wraddress,rdaddress_a,rdaddress_b,wren,clock,qa,qb); parameter modules=1; parameter width=8; input [modules*width-1:0] data; input [7:0] wraddress; input [7:0] rdaddress_a; input [7:0] rdaddress_b; input wren; input clock; output [modules*width-1:0] qa; output [modules*width-1:0] qb; ram8x256_3port u1(.data(data),.wraddress(wraddress),.rdaddress_a(rdaddress_a), .rdaddress_b(rdaddress_b),.wren(wren),.clock(clock),.qa(qa),.qb(qb)); endmodule |
テストベンチソースです。RAMAddress値をDataとしてインクリメンタルに書きます。
その後、一回読み出して終わりです。
`timescale 1ns/1ps module ram_test; reg [7:0] data=0; reg [7:0] wraddress,rdaddress_a,rdaddress_b; reg wren=0; reg clock=0; wire [7:0] qa,qb; integer i; always #10 clock=~clock; initial begin #5; for (i=0; i <=256;i=i+1) begin @(negedge clock); wraddress=i; wren=1; data=i; end @(negedge clock); wren=0; for (i=0; i <=256;i=i+1) begin @(negedge clock); rdaddress_a=i; rdaddress_b=256-i; data=i; end #10; $finish; end h8_ram u1(.data(data),.wraddress(wraddress),.rdaddress_a(rdaddress_a), .rdaddress_b(rdaddress_b),.wren(wren),.clock(clock),.qa(qa),.qb(qb)); endmodule |
RTLプロジェクトは、以下の通りとします。ここで、altera_mf.v は、メガファンクションのRTLライブラリになっています。quartas\eda\sim_lib\下にあります。
WaveformViewerで波形を確認したら、論理合成します。
例によって、simulation\custom下に合成後のゲートソースが出力されます。
4.1.3.3 ポストレイアウト遅延ゲートシミュレーション
遅延シミュレーション用のプロジェクトを作成します。
ゲートのライブラリは、cyclone_atoms.v です。これもquartas\eda\sim_lib\下にあります。
h8_ram.vo が論理合成で生成されたファイルです。プロジェクトは、このフォルダに作成しなければなりません。
上の波形はWrite時、下の波形がRead時です。
Read時、アドレスが読み込まれて(黒カーソル)、赤カーソルの位置から、出力され始めますが、出力遅延分遅れる様子が分かると思います。この出力が利用可能なのは次のPOSエッジなので、結局2クロック遅れてしまうことになります。