FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

2006年02月

VHDLで書いてあるものをVerilog-HDLで書き直している。
VHDLではこう書いてある。


type sftd_2dvec IS ARRAY (3 downto 0) of std_logic_vector(7 downto 0);
type shiftin is array (3 downto 0) of std_logic;
signal sreg_out : sftd_2dvec;
signal shtin : shiftin;


GSREG : for K in 3 downto 0 generate
 process(reset, clk) begin
  if reset='1' then
   sreg_out(k) <= (others => '0');
  elsif clk'event and clk='1' then
   if sreg_ena = '1' then
    if all_sreg_load='1' then -- Load
     sreg_out(k) <= sreg_in(k);
    else -- shift
     sreg_out(k)(7 downto 1) <= sreg_out(k)(6 downto 0);
     sreg_out(k)(0) <= shtin(k);
    end if;
   end if;
  end if;
 end process;
end generate GSREG;


これをVerilog-HDLでこう書いたらエラー。

reg [7:0] sreg_out [3:0];
reg [3:0] shtin;


always @(posedge clk or posedge reset) // shift register
 for(i=0; i<4; i=i+1)
  if(reset)
   sreg_out[i] <= 8'h0;
  else if(clk)
   if(sreg_ena)
    if(all_sreg_load)
     sreg_out[i] <= sreg_in[i];
    else begin
     sreg_out[i][7:1] <= sreg_out[i][6:0];
     sreg_out[i][0] <= shtin[1];
    end


改定 入門Verilog HDL記述の61ページに”レジスタ配列ではビット選択や部分選択はおこなえない”と書いてあった。なんと不便な!!
ちょっとむっとしたが回避策を取る。
wire [7:0] temp0, temp1, temp2, temp3;を宣言して、

assign temp0 = sreg_out[0];
assign temp1 = sreg_out[1];
assign temp2 = sreg_out[2];
assign temp3 = sreg_out[3];

always @(posedge clk or posedge reset) // shift register
 for(i=0; i<4; i=i+1)
  if(reset)
   sreg_out[i] <= 8'h0;
  else if(clk)
   if(sreg_ena)
    if(all_sreg_load)
     sreg_out[i] <= sreg_in[i];
    else begin
     case(i)
      0: sreg_out[i] <= {temp0[6:0], shftin[1]};
      1: sreg_out[i] <= {temp1[6:0], shftin[1]};
      2: sreg_out[i] <= {temp2[6:0], shftin[1]};
      default: sreg_out[i] <= {temp3[6:0], shftin[1]};
     endcase
    end


こう書いた。これでいいのだろうか?とりあえずエラーはなくなったが。。。
どうなんだろうか?あまりレジスタ配列は使わない方がいい?
レジスタ配列でのビット選択や部分選択はVerilog 2001ではOKと本には書いてあるが、XSTが対応していないのだろうか?
ぜひ対応してもらいたい。

ISE8.1で論理合成しようとしているがどうもおかしいようだ。
前にもおかしいということを書いたが、ISE6.1とISE7.1のXSTで論理合成してエラーが出ていないがISE8.1で論理合成しようとするとエラーが出てしまう。

library ieee;
use ieee.std_logic_1164.all;
library work;
use work.lpm_pack.all;
use work.pipe_reg_pack.all;

entity id_ex_reg is
 generic(
  depth : integer := 13;
  width : integer := 8);
 port(
  data : in std_2dvec_idex;
  clk : in std_logic;
  enable : in std_logic := '1';
  aclr, aset : in std_logic := '0';
  shift_reg : in std_logic := '0';
  shift : in std_logic := '0';
  shift_in : in std_logic_vector(width-1 downto 0);
  sclr : in std_logic := '0';
  q : out std_2dvec_idex;
  shift_out : out std_logic_vector(width-1 downto 0));
end id_ex_reg;

というようなentityの部分なのだがwidthにgenericのところで8を入れられているはずなのだが、
has two possible definitions in this scope.
というエラーが出てしまう。ここに2つの定義があるというような意味だろうと思うが、これではだめなのか?
width-1の部分を7にするとエラーが無くなる。
なんか、ISE8.1のXSTは相当変更があるような感じである。ずっとこうなるんだったらVHDLの書き方を変えなければならないかな???

----------------
家のパソコンでは上のようにだめだったが、職場の購入ISE8.1でプロジェクト変換しコンパイルしたら正常に論理合成できた。家に帰ったら原因を調査してみる。

大変失礼しました。ガセビアになってしまいました。
家のプロジェクトにはlpm_pack.vhdが入ってませんでした。
入れたら正常にに論理合成できました。お騒がせしてすみません。
たーぼさんこれに懲りずにまたコメントお願いします。

2/28
寝るのに布団に入ってから、どうもおかしいのに気が付いた。
lpm_pack.vhdはアルテラを使っていた名残でLPMをVHDLで作って使っていた時のもの。dffenaやshiftreg等のcomponent宣言しか入っていないはず。それなのにエラーが出るのはおかしい。
正常に論理合成できるプロジェクトのuse work.lpm_pack.all;をコメントアウトしてやってみたが、思い通りに論理合成できた。何か他にもどこかおかしかったようだ。これ以上の原因追求は前のプロジェクトを捨ててしまったので終わりとする。

ソーテックのデスクトップパソコンが来たので昨日セットアップした。
まずはキーボードを取り出す。黒いキーボードでなかなかかっこいい。キータッチも軽くて、まるで昔の富士通のキーボードのようで好きだ。キーボードだけ私もほしい。
sotec_1_060224.jpg

本体は銀色と黒でかっこいい。白のパソコンしかかったこと無かったので新鮮だ。
まずはノーマル状態でセットして電源を入れてみる。お決まりのプレインストールWindowsの手続きをしてWindowsが起動。
なんじゃこれ、ISPのアイコンだらけ。やれNiftyやDIONやNTTや。。。がっかり何もアイコンないと思っていたのに。これをまずはアンインストール。これが大変。
アンインストールしてもデスクトップにアイコンがまだ張り付いている。しつこい!!
ISPのアイコンをゴミ箱に入れた。
とりあえずこれでパソコンを開けてハードウェアの増設。
中を開けると案外すっきり。IDEコネクタとDVDドライブ、HDDの位置がいいのでケーブルが這い回らない。DIYパソコンとは違う?ソーテックをここで少し見直す。マザーもどこのメーカーかは確認しなかったがしっかり作ってありそう。
メモリが256MByteしかないので、333MHzだが後256MByte増設。400MHzと333MHzなので333MHzになるが、少ないよりは良いだろう。
ディスプレイがDVI入力なのでDVI出力のグラフィックカードをAGPソケットに追加する。ブランクブラケットではなく、きりかけるようなただの鉄板なのでねじが付いていない。ねじは手持ちので止める。
これでふたを閉め、電源ON。今度は拡張グラボからアナログディスプレイに接続。DVI出力はドライバをインストールしていない状態ではでなかった。
グラボのドライバをインストール、再起動、DVI入力ディスプレイも使えるようになる。
次にソフトのインストール。
いつもお世話になっているPixiaをインストール。
順次、OpenOffice.org, FireFox, avast4, spybot, 娘はタブレット持っているのでワコムの関連ソフトをインストール。
大体終了。自分のPen4 1.7GHzよりだいぶ早い模様。39,990円とはだいぶパソコンも安くなったもんだ。壊れたDELLパソコンは30万円以上したっけ。
最後に前のカバーを開けてみたら、USBコネクタとマイク、ヘッドフォン端子があった。これで前からヘッドセットつなげる。便利だ。
sotec_2_060224.jpg

ISE6.3iからISE8.1iへの移行しようとしているが、どうもおかしい。
プロジェクトをISE8.1iに変換して論理合成すると途中で何のワーニング、エラー、コメントも出ずにISEが止まってしまう。
パソコンは正常なのだが、そのプロジェクトが論理合成できない。その他のプロジェクトは正常に論理合成、インプリメント、基板にダウンロード正常動作できるのもある。
やはり、日本語のコメントを大量に使っているせいか?
6月に出るというISE8.2iを待つことにする。

---------------------------------
2月27日
日本語をすべて削除してやってみたが結果は同じだった。
TopのVHDLファイルをCheck Syntaxすると正常終了しチェックがつくが論理合成させようとすると途中で止まる。

この前古いパソコンが壊れた話をしたが無いと困るのでYahooショッピングで一番安いソーテックのパソコンを買った。
http://store.yahoo.co.jp/sotec/4510884141493.html
今日届くと連絡があったが届かない。やはりソーテックなのか?
ネットを検索するとサポートの悪さを書いたサイトが良くある。
ちょっと心配だが、サポートは余り使わずに部品はあるので交換することにしようと思っている。そのためにというか安いからだからAGP、パラレルATAのパソコンだ。過去のディスクやグラフィックボードが入れられる。
明日は来ることを期待しよう。
仕事は相変わらず回路図フィックスが終わらない。RocketIOは基板の層数が多く、値段が高いのでLVDSチップに変更になってしまった。ちょっと残念ではあるがしょうがない。でもこれで前の回路の改造が少なくて済むのでより早く動作する様になることであろう。

パソコン来ました。10時頃。箱あけただけでセットアップは明日ですね。一部仕様と違ってDDR400だと思ったらYahooショッピングの表示が間違っていますね。
256MB PC3200 DDR SDRAM 333MHz 184pin DIMM
PC3200はDDR SDRAM 400MHzですね。良いほうに間違っているので良しとします。

↑このページのトップヘ