FC2カウンター FPGAの部屋 DDR SDRAMコントローラをVHDLからVerilog2001へ書き換える1
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

DDR SDRAMコントローラをVHDLからVerilog2001へ書き換える1

Verilogの勉強としてSpartan3E Starter KitのDDR SDRAMコントローラをVHDLからVerilog2001へ書き換えてみることにした。VerilogにすればMicron社のDDR SDRAMモデルも使うことが出来る。(VerilogのモデルはWebサイトにあるから)
VHDLで書いたファイルは”DDR SDRAMコントローラのシミュレーション(FMFライブラリを作る)”からたどることが出来る。
Verilogで書くに当たっての条件は下の通りだ。
1.VHDLでPackage文で書いていた各VHDLファイルで使用していたデータバス幅などの定義はVerilogでも別ファイルにしたい。これは`includeで大丈夫か?
2.Verilog2001で書きたい。generate等が使えないといやだ。
3.`default_nettype noneを定義して、データ型の宣言のチェックを厳密にする。

1.のVHDLでのPackageはこのように書いてある。(一部)


library ieee;
use ieee.std_logic_1164.all;

package ddr_controller_pack is
    constant DDR_ADDRESS_WIDTH : integer := 13;
    constant DDR_COLUMN_ADDRESS_WIDTH : integer := 10;
    constant USER_INPUT_ADDRESS_WIDTH : integer := DDR_ADDRESS_WIDTH + DDR_COLUMN_ADDRESS_WIDTH + 2;
    constant MAX_REFRESH_COUNT_LENGTH : integer := 6;
    constant MAX_REFRESH_COUNT : std_logic_vector(MAX_REFRESH_COUNT_LENGTH-1 downto 0) := "110000"; -- 48


このPackageをVHDLファイルの先頭でLibrary宣言してUSEで使用を宣言している。

library work;
use work.ddr_controller_pack.all;

entity addr_fifo is
    port(
        clk : in std_logic;
        reset : in std_logic;
        din : in std_logic_vector(USER_INPUT_ADDRESS_WIDTH-1 downto 0);


このように入力ポートや出力ポートのデータ幅にCONSTANT値を使用している。このようにVerilogでも書きたい。Verilogではparameterか`defineで同様に書けるようだということがわかった。これを別ファイルにして呼びたいので`includeを使うことにした。それでparameterか`defineのどっちを使うかだが`defineで定義すると`INPUT_VALのように文字列に`をつけなければならないようなので止めてparameterで行くことにした。(でも多分`defineで定義しなければだめなのもあることだろう)
VHDLの論理合成用パッケージddr_controller_pack_synth.vhdに相当するVerilogの環境設定値インクルードファイルをddr_parameters_synth.vhとした。.vhとしたのはDDR SDRAMモデルをMicronからダウンロードした際にDDR SDRAMパラメータが書いてあったファイル名がddr_parameters.vhだったから、これでいいのかなと思ったわけだ。ISEでインプリするときにどうなのかはまだわからない。とりあえずModelSimでシミュレーションすることを目指そうと思う。
ddr_parameters_synth.vhの一部を下に示す。

    parameter DDR_ADDRESS_WIDTH = 13;
    parameter DDR_COLUMN_ADDRESS_WIDTH = 10;
    parameter USER_INPUT_ADDRESS_WIDTH = DDR_ADDRESS_WIDTH + DDR_COLUMN_ADDRESS_WIDTH + 2;

    parameter MAX_REFRESH_COUNT_LENGTH = 6;
    parameter MAX_REFRESH_COUNT = 6'b110000; // 48 MAX_REFRESH_COUNTは、DDR SDRAMのクロックを16分周したク


このddr_parameters_synth.vhをインクルードする位置をC言語と同様に最初にしたのだがModelSimでコンパイルするとエラーが出てだめだった。

`include "../ddr_parameters_synth.vh"

module addr_fifo(clk, reset, din, read_write, wr_en, rd_en, dout, rw_out, full, empty, next_dout, next_rw_out, almost_empty, almost_full);


ここでインクルードするとparameterで書いてあるのでだめだと思いmodule宣言の後に書くことにした。

module addr_fifo(clk, reset, din, read_write, wr_en, rd_en, dout, rw_out, full, empty, next_dout, next_rw_out, almost_empty, almost_full);
`include "../ddr_parameters_synth.vh"


こうすると無事にコンパイルできた。
`defineで書くと多分最初にインクルードしても大丈夫なのだろう。コンパイラでは`includeの位置に読み込んできたファイルを展開するだけだと思われる。

Verilogに詳しい方、ここは違うとか、こうすると良いとか指摘してください。よろしくお願いします。

足の骨の骨折は今のところあまり痛くないので良かった。でも皮膚の色は変色していていかにも折れていますと主張しているようだ。
  1. 2006年12月03日 08:43 |
  2. 入門Verilog
  3. | トラックバック:1
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/363-a12660fe
この記事にトラックバックする(FC2ブログユーザー)

電気事典VHDLについて

VHDLVHDL(VHSIC Hardware Description Language)は、デジタル回路設計用の、ハードウェア記述言語(HDL)の一種である。EDA分野における標準の一つとしてFPGAやASICなどの設計に使われている。.wikilis{font-size:10px;color:#
  1. 2007/02/08(木) 23:34:19 |
  2. 電気事典