FC2カウンター FPGAの部屋 2007年09月
FC2ブログ

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

FPGAの部屋

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

VALID制約

きじばと日記PV4/FPGA回路更新を予告で”ハイビジョンキャプチャカード「PV4」が主に Core 2 Duo 環境で認識されない問題について、FPGA回路更新を計画しているようです。”という記事があった。
これは、インプレスのAKIBA PC Hotline!記事でもおなじみのカードらしい。
きじばと日記さんの有限会社アースソフトさんのリンクから飛ぶと、リリース番号:02というタイミングレポートがあった。これをみるとPCIバスのパリティ出力回路にバグがあったようだ。
これを精査してみると、いろいろ興味深いのだが、ここでいろいろ書くのはまずいと思われる。ただ、VALID制約を書いたことがなかったので、調べてみた。
その結果、制約ガイドの71ページに良く書いてあった。
それは入力用DDRレジスタを使った例で、RISINGエッジやFALLINGエッジをTIMEGRPでグループ化して制約をかけていた。下のように。(詳しくは制約ガイドを見てください)

TIMEGRP DATA_IN OFFSET = IN 1 VALID 3 BEFORE CLK TIMEGRP FF_RISING;
TIMEGRP DATA_IN OFFSET = IN -4 VALID 3 BEFORE CLK TIMEGRP FF_FALLING;


上がRISINGエッジで、1 nsのセットアップ時間以内に抑えて、データが有効な時間がVALIDの後の3 nsという制約だ。下がFALLINGエッジで、セットアップ時間-クロックサイクル/2 = 1(ns) - 10(ns)/2 = -4 ns がセットアップ時間で、データが有効な時間がVALIDの後の3 nsという制約だ。データが有効な時間が付加されているので、ホールド時間を考慮して、Place & Routeしてくれるのだと思う。ただし、VALID制約が効くのは入力だけだそうだ。

私のPCI-Xモジュールのセットアップ時間の制約も、

NET "pcix_ad(0)" OFFSET = IN 1.2 ns BEFORE "pcix_clk" ;


から、ホールド時間を含めて

NET "pcix_ad(0)" OFFSET = IN 1.2 ns VALID 1.7 ns BEFORE "pcix_clk" ;


に変更した。
インプリメントして、P&Rのレポートを見てみると、下のようになった。あまり変換がないように思えるが、ホールド時間も考慮してくれるのだろう。

Timing constraint: COMP "pcix_ad(0)" OFFSET = IN 1.2 ns VALID 1.7 ns BEFORE COMP "pcix_clk";

1 item analyzed, 0 timing errors detected. (0 setup errors, 0 hold errors)
Minimum allowable offset is 1.175ns.


Xilinxのアンサーデータベースを漁ったら、”8.1i Timing Analyzer/TRACE/制約 - OFFSET/IN 制約で、以前のバージョンでは発生しなかったホールド タイム違反が発生する”が見つかった。
これによると、ホールドタイム違反が出るのを回避するために、指定したオフセットの後にデータが有効である時間を定義するそうだ。逆の発想か! データが後まで有効ならばホールドタイムも伸びても大丈夫だね。

  1. 2007年09月19日 04:18 |
  2. UCFの書き方
  3. | トラックバック:0
  4. | コメント:2

車の保険に付帯する交通傷害保険

今回、車の保険を更新したが、その際の説明で自転車を乗っている時の交通傷害保険も付帯しているのに気がついた。ということは、5月にやってしまった自転車転倒、骨折も出るのかどうか聞いたところ、出るということだった。まったく知らなかった。皆さんも自転車事故してしまったときには、車の保険も見てみると良いと思います。
一昨日、医者に診断書をお願いしに行って来たのだが、その際にひらめいた。もしかしたら、2年前の息子の自転車事故も出るのじゃないかと。。。交通事故障害保険は、家族も対象となっていたのだった。早速、事故処理に電話して聞いたら、2年以上前のことだし対象かどうかは担当者のほうから連絡してくれるそうだ。
  1. 2007年09月17日 22:06 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

エコキュートのお湯

皆さん、こんにちは。毎日暑いですね。今日は、うちで使っている給湯器の話題です。

自宅の灯油給湯器がそろそろ寿命なので、次はどうしようかいろいろ考えている。
深夜電力を使うエコキュートが良いかなと考えていた。東京電力の説明によると、燃料代1,000円だというし、おまけに灯油もタンクに入れなくてすむ。(今は、灯油を買ってきて、自力で入れています。)灯油が切れる心配もしなくてすむし。。。問題は機器の値段が高いことだ。東京電力のリースで契約しようかな?と思っていたのだった。
いろいろ検索していたら、IHクッキングヒーターとオール電化のページが引っかかって読んでいた。IHクッキングヒーターは、多かれ少なかれ、電磁波は避けられないし、調理器具の近くで調理したら電磁波を浴びるのは避けられないと思っていた。自分の家でも、導入する気はないのだが。。。いろいろ怖いことが書いてあったが、一つ気になることが。。。
エコキュートのお湯は「飲用にできない」と書いてあった。えー、本当ですか?それじゃ、水道の蛇口で、水、お湯ミックスはできない?
「エコキュート 飲用」で検索すると、コロナ、ダイキン、ナショナルでやはり、そのままでは飲めないという説明があるサイトが引っかかった。
どうしようかな? これでエコキュートにしようという気がさめてしまったが、実際問題として、水、お湯ミックスで飲むことはないし、後は沸かして飲むわけだから大丈夫だろうか?
これとか読んじゃうと本当にどうしようか考えちゃうけど。結構大丈夫という意見もあるし、よくわからないというところが正直なところかな?
  1. 2007年09月17日 13:36 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:7

小学校の運動会

今日は、先週の中学校の運動会に続いて、小学校の運動会だった。
undoukai_070915.jpg

今日も、少し曇ったときはあったが、おおむね晴れ。日焼け止めが必須だった。今週も、先週ほどではないですが、とても暑かったです。30℃オーバーですね。。。
今日は、うちの奥さんが、研修でこられないので、下の娘のお遊戯を録画するという重大使命を帯びたミッションがあったのだ。問題はうちの娘がなかなか見つからないので、人様の娘さんを録画していて、いつも怒られていることだ。最新のビデオムービーには、ぜびぜひ人の顔認証をつけてほしい。そうすれば、私が怒られることがなくなる。あれ、これって実用新案とか取れるかな?
ビデオメーカーの方、ご検討をよろしくお願いします。中心に写っている人物が、人相写真と違うときにはワーニングを出してほしいのだ。
といっても、最近のビデオは高画質、高倍率、高解像度モニタで子供を間違うことがないのだろうか? うちのビデオは相当古いからな。(それでも一応DVテープです)
ズームにしても、周りも同時に写していて(つまり2眼)で、目標物はこっちだよと表示してくれると更に良いのだが。。。
空想はこの辺にして、実際ちゃんと撮れたのかというと、最初の半分は目標物(子供)を発見して取れていたのだが、お遊戯なので、いろいろ踊りまわって、大幅移動のときに見失ってしまった。その後は、お決まりの他人の撮影になってしまった。後で、見せたときにあきれられたのは言うまでもない。。。(がっくり)
  1. 2007年09月15日 21:46 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

VHDLの共有変数を使用したシミュレーション

たーぼ のハードウェア設計記録さんのVHDL TIPS 「shared variableの使用法」で、VHDLの共有変数を学んだ。たーぼさんに深く感謝いたします。

それを見て、自分のシミュレーションの問題点をVHDLの共有変数を使用して解決しようと思った。
シミュレーションの問題点はこうだ。作業の終了をプロセッサやPCIバス経由でレジスタを読み出すことでしか知ることができない。シミュレーションでは一回シミュレーションを行って、終了した時間を過ぎたころに次のアクションを行っている。本当はプロセッサモデル、PCIモデルを駆動して作業終了レジスタをチェックするのだが、テストベンチを作るのが面倒くさい。作業終了レジスタの値を直接テストベンチから確認できれば、都合が良い。
そういう理由で検証用のコードを書いて、やってみた。
まずは、共有変数を宣言するパッケージから。

library ieee;
use ieee.std_logic_1164.all;
package shared_pkg is
    shared variable SH_DONE : std_logic;
end shared_pkg;


次に本体。プロセッサ周辺IOとしてのカウンタをイメージ。
addressを0にしたときにinput_dataにカウント値を入れて、weを1にしてカウント値をカウンタにロード。
addressを1に、input_data(0)(startビット)を1に、weを1にして書き込むとカウントがスタート。
終了はaddressを1にしてoutput_data(7)(doneビット)を読んだときに1ならば終了。(done='1')
addressを0にして、output_dataを読むと残りのカウントが読める。
ここではdoneビットを共有変数SH_DONEにコピーしておく。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
-- pragma translate_off
library work;
use work.shared_pkg.all;
-- pragma translate_on

entity test_main is
    port(
        clk : in std_logic;
        reset : in std_logic;
        address : in std_logic;
        input_data : in std_logic_vector(7 downto 0);
        we : in std_logic;
        output_data : out std_logic_vector(7 downto 0)
    );
end test_main;

architecture RTL of test_main is
-- アドレスマップ
-- address=0 : カウント値:スタートの後でクロックごとに減算する。0になったら停止。
-- address=1 : bit0 - start, bit7 - done
signal count, cnt_val : std_logic_vector(7 downto 0);
signal start, done : std_logic;
begin
    start <= '1' when address='1' and we='1' and input_data(0)='1' else '0';
    
    process(reset, clk) begin -- カウント値を保持する
        if reset='1' then
            cnt_val <= (others => '0');
        elsif clk'event and clk='1' then
            if address='0' and we='1' then
                cnt_val <= input_data;
            end if;
        end if;
    end process;
    
    process(reset, clk) begin
        if reset='1' then
            count <= (others => '0');
        elsif clk'event and clk='1' then
            if start='1' then -- カウント値をロード
                count <= cnt_val;
            elsif count/=0 then -- 0でなかったら減算
                count <= count - 1;
            end if;
        end if;
    end process;
    done <= '1' when count=0 else '0';
    -- pragma translate_off
    process(done) begin
        if done'event and done='1' then
            SH_DONE := '1';
        elsif done'event and done='0' then
            SH_DONE := '0';
        end if;
    end process;
    -- pragma translate_on
    
    process(count, address, done) begin
        if address='0' then
            output_data <= count;
        else
            output_data <= done & "0000000";
        end if;
    end process;
end RTL;


次にテストベンチ。
テストベンチはカウント値に32を書いて、スタートさせる。(startビットを1に)
共有変数SH_DONEが1になった(カウントが終了)のを確認後、カウント値に16を書いて、スタートさせる。
共有変数SH_DONEが1になった(カウントが終了)のを確認。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
library work;
use work.shared_pkg.all;

entity Shared_test_tb is
end Shared_test_tb;

architecture tb of Shared_test_tb is
component test_main
    port(
        clk : in std_logic;
        reset : in std_logic;
        address : in std_logic;
        input_data : in std_logic_vector(7 downto 0);
        we : in std_logic;
        output_data : out std_logic_vector(7 downto 0)
    );
end component;
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal address : std_logic := '0';
signal input_data : std_logic_vector(7 downto 0) := X"00";
signal we : std_logic := '0';
signal output_data : std_logic_vector(7 downto 0) := X"00";
begin
    Inst_test_main : test_main port map(
        clk => clk,
        reset => reset,
        address => address,
        input_data => input_data,
        we => we,
        output_data => output_data
    );
    
    clk <= not clk after 10 ns;
    
    process begin
        wait for 20 ns;
        reset <= '0';
        
        wait for 20 ns;
        input_data <= CONV_STD_LOGIC_VECTOR(32,8); -- 32カウント
        we <= '1';
        
        wait for 20 ns;
        we <= '0';
        
        wait for 20 ns;
        address <= '1';
        input_data <= "00000001"; -- start
        we <= '1';
        
        wait for 20 ns;
        we <= '0';
        
        while SH_DONE/='1' loop
            wait for 1 ns; -- 終了まで待つ
        end loop;
        wait until clk'event and clk='0'; -- クロック0イベントまで待つ
         
        wait for 20 ns;
        address <= '0';
        input_data <= CONV_STD_LOGIC_VECTOR(16,8); -- 16カウント
        we <= '1';
        
        wait for 20 ns;
        we <= '0';
        
        wait for 20 ns;
        address <= '1';
        input_data <= "00000001"; -- start
        we <= '1';
        
        wait for 20 ns;
        we <= '0';
        
        while SH_DONE/='1' loop
            wait for 1 ns; -- 終了まで待つ
        end loop;
        wait until clk'event and clk='0'; -- クロック0イベントまで待つ
        
        wait for 500 ns;
    end process;
end tb;


これで、うまく行ったようだ。下の階層のdoneビットを見ることができた。このくらいならばaddressを1にしておいて、doneビットを見ればよいのだが、PCIバス・プロトコルやPPCプロセッサ・バスプロトコルなどでは、モデルを駆動しないと見えない。
うまくいけそうです。
Shared_ModelSim_070912.png

2007/09/14:追記
たーぼさんからコメントで init_signal_spyの紹介があった。ModelSimで階層をまたいで、内部の階層のsignalを上位階層のsignalに値をミラーできるそうだ。これはModelSimのUtilパッケージの一部ということだった。本来、ModelSimで下位階層のsignalの値を見るには、init_signal_spyを使用するのだろうが、フルパスで書かなくてはいけないそうなので、結構面倒くさい。直接signalが見えるというのは、魅力的だが、とりあえず共有変数で書くことにする。
  1. 2007年09月13日 20:40 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

ありがとう、30万アクセスとVHDLの共有変数

access_300000.png

今見たら、いつの間にか30万アクセスだった。皆さん見てくれて、ありがとうございます。

たーぼ のハードウェア設計記録さんのVHDL TIPS 「shared variableの使用法」は、私が今抱えているシミュレーション時の問題点を解消できる可能性を秘めている。記事にも書いてあったが、共有変数が定義できれば、下のモジュールのsignalを最上位のテストベンチで、見ることができるんじゃないだろうか?
今、検証コードを作成中だ。
  1. 2007年09月12日 19:51 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:2

テレビで車のレースを見るのが好きです

私は、テレビで車のレースを見るのが好きだ。
F1、激走GT、WRCのテレビはPSXでキーワード登録して見ている。
F1はハミルトンに対して、アロンソ、どっちが勝つか楽しみだ。
F1のブログは「サーキット便り。」を見ている。なかなか裏情報が面白い。
激Gは、ヌキツヌカレツ、クラッシュもあり面白い。NSXがかっこいいと思っている。
WRCは最近、テレビ放映が少ないのでさびしい。ラリージャパンは放送があるんだろうと思う。
筑波サーキットが割りと近いので、行って見たいと思っている。よく近くのホームジョイ本田(DIYショップ)に行くと、それらしい車が通ったり、キャリアカーに乗っているのが見られたりする。

乗っている車は、ふるーいエスティマ・ルシーダなので、まったくスポーツとは関係ない車なんだけど。。。おとなしく走っています。ブレーキパッドも12万2千キロまで無交換で乗っていました。いまは、パッドが無くなってしまって、火曜日に交換してもらうまで、乗れません。 続きを読む
  1. 2007年09月10日 21:09 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

ソースコードのブログへの貼り付け方

ソースコードのブログへの貼り付けには、SourceConverterというソフトを使用している。これは、CやJavaのソースコードをHTMLにしてくれるソフトだ。
普通にソースコードをブログに貼ると、スペースやタブが無くなって、見にくくなってしまう。そこで、SourceConverterでHTMLにして貼り付けると、ちゃんとインデントされて見えるわけだ。
使い方は、エディタから貼り付ける部分をコピーする。それをSourceConverterに貼り付ける。
SC_1_070909.png

VHDLやVerilogなので、左下のプルダウンメニューから”プレーンテキスト→HTML”を選択する。
SC_2_070909.png

右下の変換ボタンをクリックして変換。編集から変換後のソースをコピーするを選択して、クリップボードにコピーする。
SC_3_070909.png

これをFC2ブログに貼り付けると、1行の空白行が余計に入ってしまう。そこで、いつも使っているエディタPeggyの置換機能を使用して<br>を削除する。
SC_4_070909.png

そうすると<br>タグが削除できるので、それをブログにコピペする。
SC_5_070909.png

process(read_port_no, read_data_enable) -- 読み出しポートへのreの通知、読み出しポート以外は0とすること
    variable no : integer;
begin
    no := CONV_INTEGER(read_port_no);
    for i in recv_re'range loop
        if i = no then -- 読み込みポートの番号と一致したときのみCH IDを出力
            recv_re(i) <= read_data_enable;
        else
            recv_re(i) <= '0';
        end if;
    end loop;
end process;

こうやっていますが、ブログによって違うかもしれません。 続きを読む
  1. 2007年09月09日 11:12 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:8

中学校の運動会

undoukai_070908.png

今日は台風一過の晴れだった。今日の運動会は暑かった。上の写真のように晴れ。時々曇ったことはあったがおおむね晴れ。
運動会会場はビーチパラソルが花盛り。タープやテントを持ってきた人もいた。
冷たいもののみまくりで、何とか耐えられました。しかし、帽子もかぶらずに8時から3時くらいまで、運動会をできる中学生。すごい。今の私には絶対無理。
中3の娘は100m走で1位、障害走で2位になった。今まで、上位入賞は珍しかったと思ったから、案外速くなっているのかな?とおもった。息子は100m走と障害走を走ることができたので良かった。彼の場合は参加することに意義がある。それで腰の痛みで何度か保険室に行ったようだが。
とにかく無事に済んでよかった。疲れました。
来週は、小学校の運動会だ。連荘です。おまけに奥さん研修でいないというし、お弁当は作れるとのことだが、来週は大変である。
  1. 2007年09月08日 19:54 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

ブロック文

VHDLの本を読んでいたら、便利に使えそうなブロック文を見つけた。
いままで、1つのVHDLファイルに2つ以上のステートマシンを記述する際には、ステート名を変えていた。例えば下のように。

type STATE is (idle, active, holdoff);
type STATE2 is (idle2, active2);


block文を使うと、block文の中はカプセル化されて、type宣言もローカルになるので、同じVHDLファイルの違うステートマシンのステートに同じ名前のステートや、同じ名前のsignalを宣言できるはずだ。
ちょっとやってみることにした。1つのVHDLファイルの中に、block文を使って、2つのステートマシンを記述してみた。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity block_check is
    Port ( reset : in  STD_LOGIC;
           clk : in  STD_LOGIC;
           in_sig1 : in  STD_LOGIC;
           in_sig2 : in  STD_LOGIC;
           pulse : out  STD_LOGIC;
           active_sig : out  STD_LOGIC);
end block_check;

architecture RTL of block_check is
begin
    STATE_MACHINE1 : block
        type STATE is (idle, active, holdoff);
        signal c_state, n_state : STATE;
    begin
        process(reset, clk) begin
            if reset='1' then
                c_state <= idle;
            elsif clk'event and clk='1' then
                c_state <= n_state;
            end if;
        end process;
        process(c_state, in_sig1) begin
            case c_state is
                when idle =>
                    pulse <= '0';
                    if in_sig1='1' then
                        n_state <= active;
                    else
                        n_state <= idle;
                    end if;
                when active =>
                    pulse <= '1';
                    n_state <= holdoff;
                when holdoff =>
                    pulse <= '0';
                    if in_sig1='0' then
                        n_state <= idle;
                    else 
                        n_state <= holdoff;
                    end if;
            end case;
        end process;
    end block STATE_MACHINE1;
    
    STATE_MACHINE2 : block
        type STATE is (idle, active);
        signal c_state, n_state : STATE;
    begin
        process(reset, clk) begin
            if reset='1' then
                c_state <= idle;
            elsif clk'event and clk='1' then
                c_state <= n_state;
            end if;
        end process;
        process(c_state, in_sig2) begin
            case c_state is
                when idle =>
                    active_sig <= '0';
                    if in_sig2='1' then
                        n_state <= active;
                    else
                        n_state <= idle;
                    end if;
                when active =>
                    active_sig <= '1';
                    if in_sig2='1' then
                        n_state <= idle;
                    else
                        n_state <= active;
                    end if;
            end case;
        end process;
    end block STATE_MACHINE2;

end RTL;


最初のブロックはin_sig1が1になったときにpulseを1クロックだけ1にするためのステートマシン。次はin_sig2が1の時にactive_sigが1,0を繰り返すためのステートマシン。
2つともblock文の中で、同じidle, activeステートを使っているが、論理合成してもエラーが出ていない。今度から、こういう方式でも書けそうだ。
block_check_070907.png


block文でカプセル化するのも良いのだが、signalごとにスコープされたtypeが使えると一番良いのだが。。。
  1. 2007年09月07日 05:22 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:8

SUZAKU-V

ブログ検索でFPGAキーワードで検索していたら、SUZAKU-V新発売のニュースが引っかかった。
XC4VFX12-SF363が搭載されているということで、WebPACK ISEでもインプリできるようだ。
さらに、スタータキットもあってこれが52,500円なので、お買い得だと思った。
以前よりVirtex4以上を使って、実際にインプリしてみたいと思っていた。
DDR2 SDRAMもテストできるし、スタータキットに7セグLED、LED、スイッチ、シリアルインターフェースもついているようなので、ぜひほしい。
ET2007で展示するようなので、ぜひ行ってみてみたい。
  1. 2007年09月06日 06:03 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

多次元配列

VHDLの本を読んでいると、いろいろためになる。
今日は、多次元配列の書き方がためになった。
私は今まで、配列の配列で多次元配列(3次元配列ですよね?)を書いていた。このように。(論理合成はSynplify Pro)

type send_data_array_suout is array (1 downto 0) of std_logic_vector(63 downto 0);
type send_data_array_all is array (5 downto 0) of send_data_array_suout;
signal send_data_all : send_data_array_all;


VHDLの本のサンプルを参考にすると、こう書けばよさそうだ。

type send_data_array_all is array (5 downto0, 1 downto 0) of std_logic_vector(63 downto 0);
signal send_data_all : send_data_array_all;

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

あらかじめ定義された属性(Predefined Attributes)

たーぼ のハードウェア設計記録さんの書評「VHDL」で紹介されていたVHDLが届いて少し読んでみた。
最初のころに、慣性遅延と伝播遅延が良く説明されている。昔、”遅延したと思ったら、慣性遅延で信号が無くなって悩んだなー”と思い出した。

あらかじめ定義された属性(Predefined Attributes)がよく書かれているなと思った。
自分で使ったことがあるのは、'HIGH, 'LOW, 'RANGE, くらいかな?
たーぼ のハードウェア設計記録さんのVHDL TIPS 「postponed processの使用法」でも出てきたが、'LAST_EVENTは便利そうだ。
セットアップ時間を測るのに便利なんだ。。。あまりそういうテストベンチを書いたことが無いので、新鮮だった。
普段は、論理シミュレーションしかしたことが無い。後は、タイミング・アナライザで静的解析して遅延を確認して終了としている。
タイミング・シミュレーションをするときには、'LAST_EVENTは便利に使えると思う。
後、'QUIETや'STABLE, 'POS ...があるようだ。いろいろ使えそうだ。

  1. 2007年09月04日 19:46 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

今日は仕事に行けました

腰も大分良くなり、今日は仕事に行くことができました。

仕事もたまっていて、事務のパソコンのサポート(こういう仕事もやっています)メールアカウントを作成して、連絡先をコピー、ブックマークをコピー。
また、部屋のレイアウト変更の打ち合わせ、電源工事打ち合わせ。
実験のガイダンスなど。

またまた、オリジナル基板に使っているXportのデバック。
うちでは、TeraTermのバイナリモードを使用して、PowerPCのソフトウェアをXport経由でSDRAMに転送してからブートしている。それが、暴走してしまって動作しなくなってしまった。
よく調べるてみると、telnetではInterpret as Command(IAC)として0xFFを定義していて、0xFFはエスケープ文字として使用しているようだ。0xFFを送るときには、後ろに0xFFを付加して送るようである。説明はここが詳しい。
Xportには、その0xFFの後の0xFFを削除するモードがあって、それがイネーブルになっていなかったのが原因だった。つまり0xFFが1つ多くロードされてしまった。Xportのユーザーズマニュアルはここ。
問題の箇所はLantronix Web-ManagerのTCP Connection SettingsのCommons Options;のtelnet Mode。ここがDisableになっていたので、Enableにしたら直った。

注: なぜかLANTRONIXへのリンクはおかしくなってしまうようなので、Xportを知りたい方は検索してください。
  1. 2007年09月03日 21:17 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:11

新しい企画

子供たちの夏休みの宿題も終了した。今年は自由研究が2本やったので、結構大変だった。来年もやるとすれば、いろいろ題材を考えようと思う。今のところ考えているのが2,3本あるが、それは秘密。

今回の休みは、気候も良くなってきたので、珍しく仕事を少しはしていた。PCI-Xのテストベンチの整理だ。大体、何とか使えるようになってきたと思う。一人でやっているので、最低限のテストベンチになってしまう。まだテストベンチ上では動いているが、まだマスタ・ライトをやっていない。最近、いろいろとほかの事で忙しいので、PCI-Xモジュールのデバックに時間を割いていられない。大体、細かい点は除いて、だいぶできたと思う。このPCI-Xモジュールを公表するかだが、オリジナルボードだし、一応仕事用だから、だめかな? もっともPCI-Xを使っている人がいないだろうしね。。。ノウハウはインプリメントのところにあるし。。。

そういえば、大体FPGAのことは書いてきたと思うけれども、ねたがなくなり気味というか。大体ブログのバックナンバーを見ると一通り書いたと思う。新しい汎用ボードも買っていないし。途中のビットマップのディスプレイ・コントローラも仕事が忙しいので、しばらく無理。
ということで、何か、比較的簡単なことで、ブログで取り上げてほしいことがあれば、コメントでお寄せください。
取り上げさせていただく場合もありますし、だめな場合もあります。
ただし、仕事が忙しい場合は中断もありあえます。
(こんなこと、書いてしまって大丈夫なのだろうか? でも、反応がない可能性もあるし。。。)
こちらで、なるべく幅広い皆さんの役に立つ項目を選ばせていただこうと思います。
  1. 2007年09月02日 21:43 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:1