FC2カウンター FPGAの部屋 私流のVHDLの書き方2
FC2ブログ

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

FPGAの部屋

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

私流のVHDLの書き方2

今日は書くこともなくないのだが私流のVHDLの書き方を少しだけ書こうと思う。今度はVerilogで書こうと思っているのだが、今のところのHDLはVHDLだ。
PCIバスのPCIコマンドの定義とパリティのジェネレータを紹介しようと思う。物はpackage文とpackage body文だ。

library ieee;
use ieee.std_logic_1164.all;

package pci_pack is
    -- PCI Command
    constant PCI_MEM_READ : std_logic_vector := "0110";
    constant PCI_MEM_READ_LINE : std_logic_vector := "1110";
    constant PCI_MEM_READ_MULT : std_logic_vector := "1100";
    constant PCI_MEM_WRITE : std_logic_vector := "0111";
    constant PCI_MEM_WR_INVALIDATE : std_logic_vector := "1111";
    constant PCI_IO_READ : std_logic_vector := "0010";
    constant PCI_IO_WRITE : std_logic_vector := "0011";
    constant PCI_CONFIG_READ : std_logic_vector := "1010";
    constant PCI_CONFIG_WRITE : std_logic_vector := "1011";
    constant PCI_INTERRUPT_ACK : std_logic_vector := "0000";
    constant PCI_SPECIAL_CYCLE : std_logic_vector := "0001";
    constant PCI_DOUBLE_ADDRESS : std_logic_vector := "1101";
    
    function GenParityEven(ad : std_logic_vector; c_be : std_logic_vector)
        return std_logic;
end pci_pack;

package body pci_pack is
    function GenParityEven(ad : std_logic_vector; c_be : std_logic_vector)
        return std_logic is
    variable tempad : std_logic_vector(ad'high downto ad'low);
    variable tempcbe : std_logic_vector(c_be'high downto c_be'low);
    begin
        tempad(ad'low) := ad(ad'low);
        for i in ad'low+1 to ad'high loop
            tempad(i) := tempad(i-1) xor ad(i);
        end loop;
        tempcbe(c_be'low) := tempad(ad'high) xor c_be(c_be'low);
        for i in c_be'low+1 to c_be'high loop
            tempcbe(i) := tempcbe(i-1) xor c_be(i);
        end loop;
        return tempcbe(c_be'high);
    end GenParityEven;
end pci_pack;


package bodyのPCIバス用偶数パリティジェネレータはad(アドレス・データ)、c_be(コマンド・バイトイネーブル)の偶数パリティを返すファンクションだ。ad'low、c_be'highを使っているのでadやc_beが何ビットでも対応することが出来る。
使うときにはこんな感じで使っている。

    pci_even_parity <= GenParityEven(ad(31 downto 0), c_be_b(3 downto 0));
    pci_even_parity64 <= GenParityEven(ad(63 downto 32), c_be_b(7 downto 4));


  1. 2006年10月21日 20:09 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:3

コメント

VHDLの最大というか、唯一の利点は、(others=>'1')と、配列のアトリビュート('high 'low 'range)ですね。
Verilogではこの書き方はできないですよね。
  1. 2006/10/22(日) 09:25:53 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

Verilog2001ではgenerateなどが使えるので、これだったらVerilogでも良いですね。徐々にVerilogに移行しようとは思っていますが、慣れ親しんだVHDLからなかなか抜けられませんね。
Verilogではステートマシンのステートの値を直接書かなければいけないんですよね?それがいやです。
Verilogではレジスタ配列ではビット選択や部分選択はおこなえないですよね?Verilog2001では行えるようですが、以前XSTでやってみたらだめでした。それやこれやでまだ移行していません。
generate文は使いまくっているので、これがないとVerilogには移れないし、3次元配列までは使っているので、このサポートもないと移行できません。
  1. 2006/10/22(日) 09:42:10 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

'rangeとかもありますね。
  1. 2006/10/22(日) 11:04:30 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


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

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