<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>HDL</title><link>http://blogs.wankuma.com/katamari/category/1554.aspx</link><description>HDL</description><managingEditor>ＪＺ５ &lt;jz5@katamari.jp&gt;</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>Verilogの識別子</title><link>http://blogs.wankuma.com/katamari/archive/2008/10/09/158523.aspx</link><pubDate>Thu, 09 Oct 2008 22:14:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2008/10/09/158523.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/158523.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2008/10/09/158523.aspx#Feedback</comments><slash:comments>299</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/158523.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/158523.aspx</trackback:ping><description>&lt;p&gt;　識別子ってのは、moduleやtaskやfunctionやport やparameterやregやwireやintegerなどの名前に使えるやつですね。Verilogで使える識別子はどんな決まりがあるんでしょう。少し調べてみました。&lt;/p&gt; &lt;p&gt;　IEEE Std. 1364-2005 から、文法をおっていくと、&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;simple_identifier ::= [ a-zA-Z_ ] { [ a-zA-Z0-9_$ ] }&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;という定義に行きつきます。これは、先頭の1文字が、a～z、A～Z、_のどれかで、そのあとに続く文字(0文字以上)が、a～z、A～Z、_、0～9、$のどれかということを表しています。つまり、moduleやtaskや（中略）integerなどの名前には、&lt;/p&gt; &lt;ul&gt; &lt;li&gt;a  &lt;li&gt;ayano123  &lt;li&gt;Apple  &lt;li&gt;A_$_$_$_&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;なんかが、指定できるってことですね。&lt;/p&gt; &lt;p&gt;　$はあまりなじみがないですが、先頭は数字がダメでアルファベットと「_」という組み合わせが識別子というのは一般的ではないかと思います。実際にコード書いてる人はあたりまえですね。&lt;/p&gt; &lt;p&gt;　実は、Verilogではさらに異なった書式の識別子が記述できます。文法をおっていくと、&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;identifier ::=&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; simple_identifier&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | escaped_identifier&amp;nbsp; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;おおもとの識別子の定義は実はこんな感じで。すでに書いたsimple_identifierに加えて、escaped_identifierというのも識別子に使えます。その定義は、  &lt;blockquote&gt; &lt;p&gt;escaped_identifier ::= \ {Any_ASCII_character_except_white_space} white_space &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt; となっています。どういうことかというと、\（バックスラッシュ）から初めて、white_space（スペース、TAB、改行、EOF）を除くASCII文字、最後がwhite_spaceという書式も識別子になると。 &lt;p&gt;　つまり、次のようなのもmoduleや（中略）に使えます。 &lt;ul&gt; &lt;li&gt;\(&amp;gt;_&amp;lt;)/~~ &lt;/li&gt; &lt;li&gt;\$display(“hello”); &lt;/li&gt; &lt;li&gt;\” &lt;/li&gt; &lt;li&gt;\//comment &lt;/li&gt; &lt;li&gt;\write_addr[10:0] &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;など！　上の例は、いずれも最後にスペースが入っています。次のようなコードもばっちり動きます。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2c4a1918-82d5-422b-b96c-873e7d27bd9b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js"&gt;module \\\ ;
    initial begin : \:
        integer \\ ;
        integer \; ;

        \; = 0;
        for (\\ = 1; \\ &amp;lt;= 10; \\ = \\ + 1)
            \; = \; + \\ ;

        $display(\; );
    end
endmodule&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;　1から10までの足し算。実際に自分で使うことはないと思うけど、ツールが吐き出すコードは使っていることがあるような気がします。知っておくとよいかも知れませんね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/158523.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>Verilog Quiz 解答編</title><link>http://blogs.wankuma.com/katamari/archive/2008/09/16/156692.aspx</link><pubDate>Tue, 16 Sep 2008 21:25:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2008/09/16/156692.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/156692.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2008/09/16/156692.aspx#Feedback</comments><slash:comments>176</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/156692.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/156692.aspx</trackback:ping><description>&lt;p&gt;　&lt;a href="http://blogs.wankuma.com/katamari/archive/2008/09/10/156102.aspx"&gt;Verilog Quiz&lt;/a&gt; の答え。bとcには次の値が入っていました。&lt;/p&gt; 

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:61f38d62-2027-4280-8cce-def67d09cf44" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js:nogutter:nocontrols"&gt;b = 2'h2;
c = 2'h3;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;まずは2番から。&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:20b690dd-f90c-40c3-9634-bf99e62ef1b7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js:nogutter:nocontrols"&gt;// 2.
a = b + c;
$display("%b", a);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これは、2+3の結果がaに代入されて5、表示は&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1bc7fc73-0c2a-466e-9b22-f0ccf89f0019" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js:nogutter:nocontrols"&gt;00000101&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;となります。(101)2=5 ですね。&lt;/p&gt;
&lt;p&gt;ところが1番の場合、&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d780dc18-76ae-4af0-a1eb-a7ca53af3851" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js:nogutter:nocontrols"&gt;// 1.
$display("%b", b + c);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;表示は&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:28477838-c8ac-4da7-874a-0b298ecfe0e9" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js:nogutter:nocontrols"&gt;01&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;となります。実は2番のとき正しく表示されたのは、左辺のaが8bit変数のため右辺の式も8bitにbit拡張されて、{6’h0, 2’h2} + {6’h0, 2’h3} として計算されていたからです。1番の場合、左辺がないので計算は2bitの範囲で行われて、5の場合3bit必要ですが上位1bitがなくなって01となったわけですね。重要なのは左辺のbit数によって右辺の計算に使用するbit数が決まるというところです。&lt;/p&gt;
&lt;p&gt;では3番。左辺と右辺がある式ですね。&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7ae45e72-5a7b-4a94-94fa-1a9a7cd9a5f0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js:nogutter:nocontrols"&gt;// 3.  
a = {b + c};  
$display("%b", a);  &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;表示は&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b64645d9-d872-4d1d-8007-cdfad1a84dbb" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js:nogutter:nocontrols"&gt;00000001&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;左辺は8bitなのに！！　実は、連接演算子を使用すると左辺のbit数によらず、連接演算子内の変数のbit数によってのみ計算のbit幅が決定します。このような式をSelf-determined expressionというようです。連接演算子内には2bit変数しかないので計算結果は01、aは8bit幅なので表示は8桁になったというわけです。&lt;/p&gt;
&lt;p&gt;次は、5番。&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:141c1ff0-0642-4a5e-ae63-7b730fa1c326" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js:nogutter:nocontrols"&gt;// 5.
a = 8'h01 &amp;lt;&amp;lt; (2 + 3);
$display("%b", a);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;1を5bit分左シフトしているので、表示は&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e4b43ee5-65fc-47fd-83a6-a2ac927a5ee8" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js:nogutter:nocontrols"&gt;00100000&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;となりますね。&lt;/p&gt;
&lt;p&gt;じゃあ4番はどうなるでしょう。&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3f5df5b3-cee5-4900-bd70-10b5dd825d94" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js:nogutter:nocontrols"&gt;// 4.
a = 8'h01 &amp;lt;&amp;lt; (b + c);
$display("%b", a);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;予想が付くかもしれませんが、&amp;lt;&amp;lt;演算子の右側もSelf-determinedになります。つまり他の式に影響されずbit幅が決定するので、2bit幅+2bit幅になり2+3=(01)2。1bit左シフトになるので表示は&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3121c3c5-c844-4db2-a5ce-c6945b4a13cb" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js:nogutter:nocontrols"&gt;00000010&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;となります。&lt;/p&gt;
&lt;p&gt;Self-determinedやこの事項については、IEEE Std. 1364-2005 「5.4 Expression bit lengths」に書いてあります。むずかしい！&lt;/p&gt;
&lt;p&gt;Cの場合はどうなるんだろうと書いたけど、一般的には1バイトの変数も内部では32bit分メモリを消費していたりするよね？　計算も32bitでおこなって、代入先が32bit未満の場合、上位bitを破棄したものが入るって感じな動作になるのかな？&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/156692.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>Verilog Quiz</title><link>http://blogs.wankuma.com/katamari/archive/2008/09/10/156102.aspx</link><pubDate>Wed, 10 Sep 2008 23:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2008/09/10/156102.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/156102.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2008/09/10/156102.aspx#Feedback</comments><slash:comments>130</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/156102.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/156102.aspx</trackback:ping><description>&lt;p&gt;　Verilog で最近、ほへーと思ったこと。次の結果はどうなるでしょう。Webでの日本語情報は皆無っぽいんだけど。意識してかいてるのかなー？　そもそもbitをあわせろってはなしでしょうか。Verilogを知らない人にもテケトーなコメントを入れてます。Cではどう扱われるのか調べてみるかな。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:40c665a5-9b43-4715-8d58-ce3e67b2b9b3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js"&gt;module TEST;

    reg [7:0] a; // 8bitの変数
    reg [1:0] b, c; // 2bitの変数

    initial begin

        b = 2'h2; // 2bit の幅で 16進数表記の値 2 を代入 
        c = 2'h3; // 2bit の幅で 16進数表記の値 3 を代入

        // 1.
        // $display は C の printf と同等 改行が入る
        // %b は 2進数表記で表示
        $display("%b", b + c);

        // 2.
        a = b + c;
        $display("%b", a);

        // 3.
        // {} は連接演算子 
        // {2'b10, 2'b11} のように書くと 4'b1011 となる
        // （2'b00 は 2bit 2進数表記で 10 の値）
        a = {b + c};
        $display("%b", a);

        // 4.
        a = 8'h01 &amp;lt;&amp;lt; (b + c);
        $display("%b", a);

        // 5.
        a = 8'h01 &amp;lt;&amp;lt; (2 + 3);
        $display("%b", a);

    end
end&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/156102.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>SystemVerilog VMMのソースコードが公開</title><link>http://blogs.wankuma.com/katamari/archive/2008/05/30/140125.aspx</link><pubDate>Fri, 30 May 2008 00:21:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2008/05/30/140125.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/140125.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2008/05/30/140125.aspx#Feedback</comments><slash:comments>92</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/140125.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/140125.aspx</trackback:ping><description>&lt;p&gt;（via &lt;a href="http://blogs.yahoo.co.jp/verification_engineer/39300339.html"&gt;Verification Engineerの戯言&lt;/a&gt;）&lt;/p&gt; &lt;p&gt;　HDLの話し。Synopsysが提唱しているSystemVerilogの検証用手法VMMというのがあります。このVMMのライブラリを含むコードがApache License 2.0で公開されました。登録なしでもすぐダウンロードできます！　SystemVerilog記述の良いサンプルにもなりますね。&lt;a href="http://www.vmmcentral.org/home.html"&gt;VMMCentral &lt;/a&gt;からダウンロードが可能です。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/140125.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>ModelSim XE 6.3でSystemVerilog試してみた。</title><link>http://blogs.wankuma.com/katamari/archive/2008/04/05/131816.aspx</link><pubDate>Sat, 05 Apr 2008 19:09:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2008/04/05/131816.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/131816.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2008/04/05/131816.aspx#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/131816.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/131816.aspx</trackback:ping><description>&lt;p&gt;　※うまくいってません。内容に期待した人は結果から見ましょう。&lt;/p&gt; &lt;p&gt;　HDL初心者の私が自宅でSystemVerilogが使えたら良いなと思いModelSim XEをインストールしてみました。なかなか無料または格安でSystemVerilogに対応したコンパイラ・シミュレータはありませんが、Xilinxの&lt;a href="http://japan.xilinx.com/support/download/index.htm"&gt;ダウンロード&lt;/a&gt;よりModelSim XEのStarter Versionと呼ばれる無料の評価版がダウンロードができます。2008/03/24付で6.3が利用可能になっています。&lt;/p&gt; &lt;p&gt;　ダウンロード後、Virtual PC上のVistaにインストールしようとすると公式にはVistaはサポートしてないよとメッセージが出ましたが、とりあえずインストールはできました。&lt;/p&gt; &lt;p&gt;　利用するためは まずライセンス認証用のファイルをメールで送信してもらうことが必要です。インストール後に表示されるWebページでユーザ登録とライセンス登録をします。メールでファイルlicense.datが送られてくるので、Licensing Wizardを起動し そのファイルを指定します。&lt;/p&gt; &lt;p&gt;　ModelSimを起動するとこんな感じ。&lt;/p&gt; &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="376" alt="ModelSim" src="http://katamari.wankuma.com/images/ModelSimXE6.3SystemVerilog_10B80/image.png" width="512" border="0"&gt;&lt;/p&gt; &lt;p&gt;　メニューのFile-&amp;gt;New-&amp;gt;Source-&amp;gt;SystemVerilogから新規にSystemVerilogのファイルを作成し、適当にコードを書きます。意味のないものだけど、とりあえずSystemVerilogのprogramとclassを含めてと……。&lt;/p&gt;&lt;pre&gt;program test();
  class foo;
    function void sayHello();
      $display("Hello!");
    endfunction
  endclass
  
  initial begin
    foo f;
    f = new;
    f.sayHello();
  end
endprogram

module top;
  test t();
endmodule&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;　ファイルを保存後、コンパイルします。メニューのCompile-&amp;gt;Compileから作成したファイルを選択し、Compileボタンをクリック。するとworkフォルダがないので作成しますか？　と聞いてくるのでOKをクリックして作成します。下のTranscriptウィンドウにエラーがでなければコンパイル完了です。&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 次にシミュレーションを試してみます。メニューのSimulate-&amp;gt;Start Simulationから開いたウィンドウのwork-&amp;gt;topを選択します。OKをクリックすると……。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;# ** Fatal: (vsim-3904) SystemVerilog Program Blocks are not supported in Modelsim PE.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　ええー。SystemVerilogのprogramブロックは上位Editionじゃないとサポートしないってマジですか……。意味ねぇー。以前のバージョンだとSystemVerilog使えてた感じの記事もWebあるのだけど どうなんでしょう？&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/131816.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>ModelSim Xilinx Edition-III 6.3</title><link>http://blogs.wankuma.com/katamari/archive/2008/04/03/131532.aspx</link><pubDate>Thu, 03 Apr 2008 23:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2008/04/03/131532.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/131532.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2008/04/03/131532.aspx#Feedback</comments><slash:comments>73</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/131532.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/131532.aspx</trackback:ping><description>&lt;p&gt;　ModelSim XEの新しいバージョンがダウンロードできるようになっている模様。これで自宅で&lt;a href="http://ja.wikipedia.org/wiki/SystemVerilog"&gt;SystemVerilog&lt;/a&gt;が可能になるのかも！？　今日は遅いので明日以降に試す。　サポートOSが2000とXP Proってのがねぇ。Virtual PCで動くかなぁ。&lt;/p&gt; &lt;p&gt;（via &lt;a href="http://blogs.yahoo.co.jp/verification_engineer/36009659.html"&gt;Verification Engineerの戯言&lt;/a&gt;）&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/131532.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;katamari@wankuma.com&gt;</dc:creator><title>FizzBuzz問題 Verilog HDL版</title><link>http://blogs.wankuma.com/katamari/archive/2007/11/11/107608.aspx</link><pubDate>Sun, 11 Nov 2007 03:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2007/11/11/107608.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/107608.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2007/11/11/107608.aspx#Feedback</comments><slash:comments>385</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/107608.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/107608.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/katamari/archive/2007/11/10/107444.aspx"&gt;低レベルFizzFuzz回路&lt;/a&gt;の続き。  &lt;blockquote&gt; &lt;p&gt;Verilog HDLやVHDLがあるのですが意外にもこれらで書かれたFizzBuzz問題がググっても出てきませんでした。ので書いてみます。 &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;　さっそく、Verilog HDLで書いてみました。  &lt;p&gt;&amp;nbsp; &lt;h3&gt;仕様&lt;/h3&gt; &lt;p&gt;　上記記事の仕様では  &lt;ul&gt; &lt;li&gt;剰余なし  &lt;li&gt;ループなし&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;としていましたが、これはソフトウェアのプログラムと比較したときの特徴ですので、具体的な仕様を以下のように決めました。&lt;/p&gt; &lt;p&gt;　まず、作成する回路はこんな感じになります。&lt;/p&gt; &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="118" alt="FizzBuzz回路" src="http://katamari.wankuma.com/images/afc60b8a61eb_1EBD/image.png" width="344" border="0"&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp; clk, rst_x, enableという信号が回路に入力されて、num, fizz, buzz, fzbz信号が出力されます。信号の値はデジタル回路なのでそれぞれHighとLow（1と0）の状態で表されます。numだけ7本（7bit幅）を使ってひとつの意味ある信号としています。&lt;/p&gt; &lt;p&gt;　clkがクロック信号（High, Low, High, Low, ...（1, 0, 1, 0, ...）と切り替わる信号です。rst_xがリセットです。回路の初期化に使用します。今回は、rst_xがLowのとき出力は全部0にします。&lt;/p&gt; &lt;p&gt;　数字とFizzやBuzzの表示の表現は&lt;/p&gt; &lt;ul&gt; &lt;li&gt;数字を表示する代わりに、numから数字の値を出力（2進数表現）。&lt;/li&gt; &lt;li&gt;Fizz、Buzz、FizzBuzzを表示する代わりに、FizzのときはfizzをHighにする。BuzzのときはbuzzをHigh、FizzBuzzのときはfzbzをHigh状態にする。このときnumは0を出力。&lt;/li&gt; &lt;li&gt;出力するタイミングはclkの立ち上がり（Low→Higheに変化するとき）。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;とします。さらに&lt;/p&gt; &lt;ul&gt; &lt;li&gt;numは、1～100を順番に出力。100の次は1に戻る。&lt;/li&gt; &lt;li&gt;enableがHighのときのみカウントアップされる。Lowのときは以前の状態を保持。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;ともしました。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;てけとうな説明&lt;/h3&gt; &lt;p&gt;　私が上記仕様で実装した回路の中身はどうなっているかというと、当然ながら剰余を計算する部分はありません。その代わり&lt;/p&gt; &lt;ul&gt; &lt;li&gt;0～100をカウントする101進カウンタ&lt;/li&gt; &lt;li&gt;0～２をカウントする3進カウンタ&lt;/li&gt; &lt;li&gt;0～５をカウントする5進カウンタ&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;が入っています。それぞれのカウンタの値によって出力を変化させているわけです。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;3進カウンタと5進カウンタが0のときFizzBuzz&lt;/li&gt; &lt;li&gt;3進カウンタだけ0のときFizz&lt;/li&gt; &lt;li&gt;5進カウンタだけ0のときBuzz&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;となるように組めば良いわけです。簡単ですね。&lt;/p&gt; &lt;p&gt;　ソフトウェアでも剰余なしだと0～2、0～5をそれぞれカウントする変数を作って両方の値が0のときFizzBuzz！とするのが一番単純じゃないでしょうか。そういうことです（ぇ）。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;結果&lt;/h3&gt; &lt;p&gt;　先に、実行（シミュレーション）から。この回路にclk, rst_x, enable信号を入力した結果です。わかりにくいだろうけどnumがカウントアップされていき3や5のところでfizz, buzz信号がHigh状態になっているのがわかります。やったね！&lt;/p&gt; &lt;p&gt;&lt;a href="http://katamari.wankuma.com/images/afc60b8a61eb_1EBD/image_3.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="155" alt="シミュレーション結果" src="http://katamari.wankuma.com/images/afc60b8a61eb_1EBD/image_thumb.png" width="484" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt; ソースコード&lt;/h3&gt; &lt;p&gt;　以下、Verilog HDLのコードになります。冗長な気がするけどまぁこんなもんで。Verilog HDLはCライクといわれてるようですが、とてもそうは思えないんですがどうでしょう？&lt;/p&gt; &lt;p&gt;　if文なんかはわかりやすいですね。簡単に説明すると、regは変数みたいなもの。[6:0]などの表記はMSBが6、LSBが0 つまり7bit幅ということを指定。always部分は@以降の条件で動作するイベントみたいなもの。今回の場合clkの立ち上がり(posedge)とrst_xの立下り(negedge)どちらか。7'd0みたいな表記は、7bit幅のデシマルで0の値ということ。&amp;lt;=は代入だけど時間的に並列に処理されるということ。おしまい。&lt;/p&gt; &lt;p&gt;module fizzbuzz(clk, rst_x, enable, num, fizz, buzz, fzbz);  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; input clk, rst_x, enable;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; output [6:0] num;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; output fizz, buzz, fzbz;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reg [6:0] counter;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reg [1:0] count3;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reg [2:0] count5;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reg [6:0] num;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reg fizz, buzz, fzbz;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // counter&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; always @(posedge clk or negedge rst_x) begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!rst_x) begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; counter &amp;lt;= 7'd0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count3 &amp;lt;= 2'd0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count5 &amp;lt;= 3'd0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (enable) begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; counter &amp;lt;= (counter &amp;lt; 7'd100) ? counter + 7'd1 : 7'd1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count3 &amp;lt;= (count3 &amp;lt; 2'd2) ? count3 + 2'd1 : 2'd0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count5 &amp;lt;= (count5 &amp;lt; 3'd4) ? count5 + 3'd1 : 2'd0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // FizzBuzz output&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; always @(posedge clk or negedge rst_x) begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!rst_x) begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num&amp;nbsp; &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fizz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buzz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fzbz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (counter &amp;gt; 0) begin &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (count3 == 0 &amp;amp;&amp;amp; count5 == 0) begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // FizzBuzz&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num&amp;nbsp; &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fizz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buzz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fzbz &amp;lt;= 1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (count3 == 0) begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Fizz&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num&amp;nbsp; &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fizz &amp;lt;= 1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buzz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fzbz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (count5 == 0) begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Buzz&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num&amp;nbsp; &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fizz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buzz &amp;lt;= 1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fzbz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num&amp;nbsp; &amp;lt;= counter;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fizz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buzz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fzbz &amp;lt;= 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end  &lt;p&gt;endmodule&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;さらに続く？&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/107608.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;katamari@wankuma.com&gt;</dc:creator><title>低レベルFizzFuzz回路</title><link>http://blogs.wankuma.com/katamari/archive/2007/11/10/107444.aspx</link><pubDate>Sat, 10 Nov 2007 00:19:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2007/11/10/107444.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/107444.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2007/11/10/107444.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/107444.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/107444.aspx</trackback:ping><description>&lt;p&gt;　FizzBuzz問題が流行っていましたが（←オブジェクト指向前の状態を指してる）、折角なので私も。&lt;/p&gt; &lt;p&gt;　普通のFizzBuzz問題を低レベル、つまりハードウェア的に考えるとどうなるでしょうか。&lt;a href="http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E8%A8%98%E8%BF%B0%E8%A8%80%E8%AA%9E"&gt;ハードウェア記述言語&lt;/a&gt;（HDL）というものがありまして、これはプログラミング言語のようにコードを書くことでデジタル回路が設計できるものです。HDLの有名なものとしてVerilog HDLやVHDLがあるのですが意外にもこれらで書かれたFizzBuzz問題がググっても出てきませんでした。ので書いてみます。&lt;/p&gt; &lt;p&gt;　ソフトウェアでも以下の条件でちらっと考えてみてもらえるとこれ幸い。&lt;/p&gt; &lt;h3&gt;仕様１&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;除算・剰余禁止&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;　ソフトウェアの場合まぁほとんどの場合3、5、15で割り切れる場合の判定に剰余演算子が出てくると思いますが禁止ね。剰余の回路は規模が大きくなっちゃうのでダメなのです。そもそも記述しても回路にできない場合もあります。乗算も規模大きいので使わなくて良いよね。ただしビットシフトになる乗除算はOKです。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;仕様２&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;ループ（for, whileなど）禁止&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;　回路でループ？　意味が分かりません。使えません。1から順に回すのにどうしましょうか。HDLではよく値が0, 1, 0, 1, 0, ...と繰り返されるクロック信号というものを基準にして設計します。ですので0と1が交互に変化する値が何らかの方法で与えられるとして作成してみてください。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;　以上です。他は都合の良いようにオレオレ仕様で。文字を表示するところは普通に考えてください。そもそも回路自体に文字を表示するってのはありませんから、適当に設計してみます。&lt;/p&gt; &lt;p&gt;　プログラムはまだ書いていないので明日にでも起きて土曜日を満喫した後アップします。HDLをバリバリ業務で使用してるってわけではないので入門程度の知識です。過度な期待と過度な参考はしないように。&lt;/p&gt; &lt;p&gt;続く。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/107444.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>