<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
>
<channel rdf:about="http://blog.livedoor.jp/hardyboy/">
<title>まごころせいじつ堂 - FPGA</title>
<link>http://blog.livedoor.jp/hardyboy/</link>
<description>浜町庄金　研究開発
　マイコンで遊んでばっかりで

</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="http://blog.livedoor.com/?v=2.0" />
<items>
 <rdf:Seq>
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/8147297.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6502144.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6496440.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6491829.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6325824.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6318209.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6316283.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6314365.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6263333.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6252985.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6252752.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6250136.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6249500.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6246072.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/hardyboy/archives/6244403.html" />
 </rdf:Seq>
</items>
</channel>

<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/8147297.html">
<title>FPGA評価ボード BeMicro MAX10 準備</title>
<link>http://blog.livedoor.jp/hardyboy/archives/8147297.html</link>
<description>　AlteraのFPGA MAX10の評価ボードが安いということで入手した。BEMICROMAX10(ARROW)BeMicro Max10, FPGA Evaluation Kit adopts Altera's non-volatile MAX 10 FPGA built on 55-nm flash process約$30。前見た時は送料が同じくらいかかっていたのが今は無料だったので注文...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2015-09-18T00:23:44+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[　AlteraのFPGA MAX10の評価ボードが安いということで入手した。<br /><br /><a  href="https://parts.arrow.com/item/detail/arrow-development-tools/bemicromax10" target="_blank">BEMICROMAX10</a>(ARROW)<br /><a  href="http://parts.arrow.com/reference-design/45CDF7D717BC14E6DFB1044001FB7C4F" target="_blank">BeMicro Max10, FPGA Evaluation Kit adopts Altera's non-volatile MAX 10 FPGA built on 55-nm flash process</a><br /><br />約$30。前見た時は送料が同じくらいかかっていたのが今は無料だったので注文。４日で届いた。<br /><br />準備としてMAX10の開発環境 Quartus II 15.0をWindows7(64bit)マシンにインストール。<br /><a  href="https://www.altera.co.jp/products/design-software/fpga-design/quartus-ii/what-s-new.html" target="_blank">Quartus II 開発ソフトウェア v15.0 の新機能</a>(ALTERA)<br /><br />BeMicro MAX10をWindowsマシンにUSB接続しただけではドライバのインストールに失敗する。ドライバはQuartusIIをインストールした C:¥altera¥15.0¥quartus¥drivers¥ を参照する。<br /><br /><a  href="http://livedoor.blogimg.jp/hardyboy/imgs/e/e/eed0b385.jpg" title="2015MAX10" target="_blank"><img  src="http://livedoor.blogimg.jp/hardyboy/imgs/e/e/eed0b385-s.jpg" alt="2015MAX10" class="pict" height="640" hspace="5" border="0" width="480"></a><br /><br />　まずはここまで。<br /><br /><br />]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6502144.html">
<title>バレルシフタ　２段にして改善(お詫び　大きな間違いあり)</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6502144.html</link>
<description>追記：@ikwzmさんから。https://gist.github.com/ikwzm/5558633　バイト単位でシフトすべきところを4bit単位でやってました。あああご指摘ありがとうございました。※前段の 8byteシフト間違ってる気がしてきた。多分3bit分を&lt;&lt;5した時点ですべて'0'になってしまってるはず(1...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-05-09T02:06:18+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[追記：@ikwzmさんから。<a target="_blank" href="https://gist.github.com/ikwzm/5558633">https://gist.github.com/ikwzm/5558633</a>　<br />バイト単位でシフトすべきところを4bit単位でやってました。あああ<br />ご指摘ありがとうございました。<br /><br />※前段の 8byteシフト間違ってる気がしてきた。多分3bit分を&lt;&lt;5した時点ですべて'0'になってしまってるはず<br /><br />(1)組み合わせ回路のシフトについて、下xx bitを削っていくような間違いをしていました。書きなおしたのは以下。<br /><a href="https://gist.github.com/houmei/5555418" target="_blank">https://gist.github.com/houmei/5555418</a><br /><br />(2)＜＜演算子を使ったbyte shiftは、いったん幅[6:0]の下位3bitを'000'とし、上位にシフト量を入れることで書き直しました。<br /><div>比較結果：<br />349LE/214.92MHz (Megafunction)</div><div>343LE/214.55MHz (シフト演算子)</div><div>291LE/335.46MHz (組み合わせ回路)</div><div>ただし、組み合わせ回路によるものは(1)の間違いあり。<br /><br />反省：見積もりに検証していない回路を軽い気持ちで使うと大失敗<br /><br />以下は間違いありです。</div><br /><br />　扱うbit幅が大きくなるとLE数は増え動作周波数は落ちていくバレルシフタ。ここでシフト量を制限したらどうなるか傾向を見てみた。例えば1bitシフトする/しないだけなら大幅にセレクタ数が減るはず。<br />以下の様なコードでシフト量を1,2,4,8...と変えながら試してみる。上位モジュールからは<br />sll64_partial #6 SLL(source,value,sftout); // partial shift<br />の様に呼び出す。<br />
<code><pre>module sll64_partial (indata,val,outdata);
	parameter width=6; //[6:0]
	input [63:0] indata;
	input [width:0] val;
	output [63:0] outdata;
	assign outdata=indata&lt;&lt;val;
endmodule
</pre></code>結果は以下のとおり。<br />&nbsp;64bitを部分シフト<div>[0:0] 129LE/615.38MHz</div><div>[1:0] 136LE/413.56MHz</div><div>[2:0] 143LE/357.65MHz</div><div>[3:0] 210LE/270.71MHz</div><div>[4:0] 285LE/250.38MHz</div><div>[5:0] 384LE/223.31MHz</div><div>[6:0] 390LE/220.17MHz</div><div><br />では、最初にバイト単位でシフトして次にビット単位で8つまでシフトするようにしてみる。<br />シフト量のnnnnxxxのうち、nnnnはバイトでのシフト量、xxxはビットのシフト量とする。nnnnについてはシフトする量がデータ幅をあふれたらall0とする。<br /><br /><br /><strike>ソースはこちら：<a href="https://gist.github.com/houmei/5541783" target="_blank">https://gist.github.com/houmei/5541783</a></strike>&nbsp;<br /><br /><strike>コンパイル結果は207LE/284.41MHzとなった。組み合わせ回路でべたに書いた283LE/105.06MHzよりよい。</strike><br /><br />※以下も怪しい<br />　もし、もっと追求するとしたらbit幅の組み合わせを変える(4-3を3-4)、段数を増やす(2-2-3)、一部組み合わせ回路にしてみる、など。やりだすときりがなくなるけど構造的な改善である程度の性能が出たらしばらく放置して他に着手したほうがいいかも。<br /><br />　あと、QuartusIIにはMagawizard Plugin Managerというのがあって、用途に合わせたライブラリが使える。今回の用途にはGates→LPMCLSHIFTというのが使えた。verilogやVHDLのインターフェース部分がソースとして出力されるのでこれを呼び出して使用する。</div>]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6496440.html">
<title>QuartusII 12.1 バレルシフタの記述比較</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6496440.html</link>
<description>　前回、メモ：QuartusII 12.1 バレルシフタの記述とTimeQuestによる速度評価の続き。　バレルシフタの入力、出力を64bitとすると、シフト量は0～64になる。つまりシフト量の指定に6bit＋1必要。これらをfunction文による自前の組み合わせ回路と＜＜演算子による記述で比較し...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-05-06T08:08:31+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[　前回、<a style="font-family: 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'ＭＳ Ｐゴシック', sans-serif; font-size: 18px; word-break: break-all; color: rgb(51, 51, 51); text-decoration: none;" rel="bookmark" href="http://blog.livedoor.jp/hardyboy/archives/6491829.html">メモ：QuartusII 12.1 バレルシフタの記述とTimeQuestによる速度評価</a>の続き。<br /><br />　バレルシフタの入力、出力を64bitとすると、シフト量は0～64になる。つまりシフト量の指定に6bit＋1必要。これらをfunction文による自前の組み合わせ回路と＜＜演算子による記述で比較してみた。<br /><br />ソースはこちら：<a target="_blank" href="https://gist.github.com/houmei/5522404">https://gist.github.com/houmei/5522404</a>&nbsp;<br /><br />　function文によるRTLはこのようになる。(8bit幅)<br /><a target="_blank" title="sll8_15LE3" href="http://livedoor.blogimg.jp/hardyboy/imgs/a/6/a6b6ad36.png"><img align="left" class="pict" hspace="5" alt="sll8_15LE3" border="0" height="310" width="480" src="http://livedoor.blogimg.jp/hardyboy/imgs/a/6/a6b6ad36-s.png"></a>&nbsp;
<br clear="all">
　コンパイル結果は以下。27LEで3段。<br /><a target="_blank" title="62MHz" href="http://livedoor.blogimg.jp/hardyboy/imgs/4/3/43164038.png"><img align="left" class="pict" hspace="5" alt="62MHz" border="0" height="310" width="480" src="http://livedoor.blogimg.jp/hardyboy/imgs/4/3/43164038-s.png"></a><br clear="all"><br />
<br />　＜＜演算子によるRTLはこんな表示。<br />
<a href="http://livedoor.blogimg.jp/hardyboy/imgs/9/c/9c4aa7d1.png" title="sll8shiftop" target="_blank"><img src="http://livedoor.blogimg.jp/hardyboy/imgs/9/c/9c4aa7d1-s.png" width="480" height="310" border="0" alt="sll8shiftop" hspace="5" class="pict" align="left"></a>
<br clear="all">
<br />

　コンパイル結果。32LE4段。<br clear="all">
<a href="http://livedoor.blogimg.jp/hardyboy/imgs/8/9/89bf215d.png" title="33MHz" target="_blank"><img src="http://livedoor.blogimg.jp/hardyboy/imgs/8/9/89bf215d-s.png" width="480" height="310" border="0" alt="33MHz" hspace="5" class="pict" align="left"></a><br />

<br clear="all">
<br />　このような感じで4～64bitまでの組み合わせ回路によるバレルシフタと演算子によるバレルシフタについて、LE数と動作周波数で比較した。<br />&nbsp;
<a target="_blank" title="barrel" href="http://livedoor.blogimg.jp/hardyboy/imgs/8/e/8e065200.png"><img align="left" class="pict" hspace="5" alt="barrel" border="0" height="685" width="480" src="http://livedoor.blogimg.jp/hardyboy/imgs/8/e/8e065200-s.png"></a><br clear="all"><br />　横軸は4,8,16,24,32,48,64が等間隔に並んでいるのに注意。組み合わせ回路はLE数が少なくて済むが、8～16bitのあたりで速度が逆転する。これを配置配線後の回路でみると、こうなっている。<br /><br />組み合わせ回路によるもの：<br /><a target="_blank" title="06MHz" href="http://livedoor.blogimg.jp/hardyboy/imgs/e/2/e2b4d601.png"><img align="left" class="pict" hspace="5" alt="06MHz" border="0" height="310" width="480" src="http://livedoor.blogimg.jp/hardyboy/imgs/e/2/e2b4d601-s.png"></a><br clear="all"><br />＜＜演算子によるもの：<br />


<a target="_blank" title="05MHz" href="http://livedoor.blogimg.jp/hardyboy/imgs/8/1/816fb583.png"><img align="left" class="pict" hspace="5" alt="05MHz" border="0" height="310" width="480" src="http://livedoor.blogimg.jp/hardyboy/imgs/8/1/816fb583-s.png"></a><br clear="all">　＜＜演算子でコンパイラに任せたほうが、LEがまんべんなく散らばっているようにみえる。LE自体のディレイよりも配線のディレイが大きいように思える。<br />16bitくらいの大きさまでなら組み合わせ回路で手書きしたほうがいいが、回路をケチる必要がなければコンパイラに任せたほうがいい。<br /><br /><br />　＜＜の演算子で書くならparameter文で指示したら良さそうと思うでしょう？実験した。上位モジュールからは<br />&nbsp;sllp #(63) SLL(source,value,sftout);<br />の様に書いてparameter文を使ったsllp.vを呼び出すようにコンパイルしてみる。すると、24bitで以下の様な結果となった。&nbsp;<br />24bitでの＜＜演算子 / parameter文によるもの<br />128LE,295.33MHz / 133LE,280.74MHz<br /><br />　bit幅によってはまったく同じではないことがあり得る。なんでわざわざこれを試したかというと、20年くらい前に論理合成ツールを使った時に怪しい挙動を経験したため。なので、ギチギチに詰める必要がある場合はいろいろ疑ってみたほうがいいかもしれない。<br /><br />追記：@ikwzmさんにfor文を使った書き方を教えてもらいました。<a target="_blank" href="https://gist.github.com/ikwzm/5523178">https://gist.github.com/ikwzm/5523178</a>　<span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Arial, 'Hiragino Kaku Gothic Pro', Meiryo, 'MS PGothic', sans-serif; font-size: 14px; line-height: 18px; white-space: pre-wrap; background-color: rgb(245, 245, 245);">398LE/199.76MHz<br /></span>ちょっと8byteシフト＆8bitシフトの組み合わせで64biシフタを構成したら<span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Arial, 'Hiragino Kaku Gothic Pro', Meiryo, 'MS PGothic', sans-serif; font-size: 14px; line-height: 18px; white-space: pre-wrap; background-color: rgb(245, 245, 245);">210LE/310.95MHz</span><br /><br />]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6491829.html">
<title>メモ：QuartusII 12.1 バレルシフタの記述とTimeQuestによる速度評価</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6491829.html</link>
<description>　ALTERAのFPGA開発環境 QuartusII 12.1、Verilog HDLでバレルシフタを記述し、組み合わせ回路の動作速度をQuartusIIの機能であるTimeQuestで計ってみた。ターゲットはCycloneIII EP3C16F484C6(Terasic DE0)。I/Oのアサインはせずコンパイルのみ。　バレルシフタは組み合わ...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-05-04T01:31:40+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[　ALTERAのFPGA開発環境 QuartusII 12.1、Verilog HDLで<a target="_blank" href="http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%AC%E3%83%AB%E3%82%B7%E3%83%95%E3%82%BF">バレルシフタ</a>を記述し、組み合わせ回路の動作速度をQuartusIIの機能であるTimeQuestで計ってみた。ターゲットはCycloneIII&nbsp;EP3C16F484C6(Terasic DE0)。I/Oのアサインはせずコンパイルのみ。<br /><br />　バレルシフタは組み合わせ回路なので、最初はI/Oから入出力をとってそのまま接続していた。しかしこれではTimeQuestで評価されない。前後をFFではさむとfmaxが計算された。<br />&nbsp;<br /><a target="_blank" title="sll64_rtl" href="http://livedoor.blogimg.jp/hardyboy/imgs/8/3/832a1ff6.png"><img align="center" class="pict" hspace="5" alt="sll64_rtl" border="0" height="310" width="480" src="http://livedoor.blogimg.jp/hardyboy/imgs/8/3/832a1ff6-s.png"><br /></a><br />　これに気づいたのは<a href="http://monoist.atmarkit.co.jp/mn/articles/0903/13/news119.html" target="_blank">TimeQuestによるタイミング解析を学ぶ (1/3)</a>&nbsp;、<a target="_blank" href="http://monoist.atmarkit.co.jp/mn/articles/0711/30/news150.html">FPGAの動作スピードを改善するポイントとは？ (1/2)</a>を読んでから。ディレイ計算はゲートの出力側から入力側に向けて積算して求めるものと思っていた。<br /><br />ソースはこちら：<a target="_blank" href="https://gist.github.com/houmei/5510474">https://gist.github.com/houmei/5510474</a>　

<br /><br />　コンパイル後、[Tools]→[Netlist Viewers]以下のツールで回路を見ることができる。<br />→[RTL Viewer]でRTLの、→[Technology Map Viewer(Post-Fitting)]で配置配線後の回路を表示する。<br /><br />[RTL Viewer]<br /><a href="http://livedoor.blogimg.jp/hardyboy/imgs/6/e/6e7834c7.png" title="sll4_rtl" target="_blank"><img src="http://livedoor.blogimg.jp/hardyboy/imgs/6/e/6e7834c7-s.png" width="480" height="310" border="0" alt="sll4_rtl" hspace="5" class="pict" align="left"></a>&nbsp;
<br clear="all">
<br />
[Technology Map Viewer(Post-Fitting)]<br /><a href="http://livedoor.blogimg.jp/hardyboy/imgs/6/2/6242cdce.png" title="76MHz" target="_blank"><img src="http://livedoor.blogimg.jp/hardyboy/imgs/6/2/6242cdce-s.png" width="480" height="310" border="0" alt="76MHz" hspace="5" class="pict" align="left"></a><br clear="all">
<br />
　Compilation ReportのTimeQuest Timing Analyzerの項目に最大動作周波数が載っている。ここのSlow 1200mV 85C Modelを開く(電圧が低く、温度が高い方が厳しい条件となる)。
ここのFmax Summaryを見ると712.76MHzとあり、これが最大動作周波数。]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6325824.html">
<title>CADR 回路図 SPC MEMORY AND POINTER</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6325824.html</link>
<description>CADRマシンの回路図を見ていきます。簡単そうな所から。http://www.unlambda.com/download/cadr/CADR4_schematic.pdf49ページは18bit+パリティ、32個のメモリでスタック(SPC)を構成。-WCLKに同期。SPC POINTERは同期式アップダウンカウンタ 74S159を2個。CLK4Fに同期。SPC PO...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-02-26T17:59:23+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[CADRマシンの回路図を見ていきます。簡単そうな所から。<br /><a target="_blank" href="http://www.unlambda.com/download/cadr/CADR4_schematic.pdf">http://www.unlambda.com/download/cadr/CADR4_schematic.pdf<br /></a><br />49ページは18bit+パリティ、32個のメモリでスタック(SPC)を構成。-WCLKに同期。<br />SPC POINTERは同期式アップダウンカウンタ 74S159を2個。CLK4Fに同期。<br />SPC POINTERはパワーオンでは不定だが、ポインタの出力SPCPTR4〜SPCPTR0は読めるのでソフトで初期化しろということだろう。スタックのオーバーフロー/アンダーフローはチェックしないので、ソフトの責任で使用しろと書いてある。<br /><br />　ところで、TTLのみで96ページもある回路図を読むのはなかなかつらいので、信号の生成元とそれを使っている箇所についてのクロスリファレンスが必要かな。気合が足らんと言われそうだが。<br /><br /><a target="_blank" title="cadr" href="http://livedoor.blogimg.jp/hardyboy/imgs/b/8/b818d284.jpg"><img align="left" class="pict" hspace="5" alt="cadr" border="0" height="640" width="480" src="http://livedoor.blogimg.jp/hardyboy/imgs/b/8/b818d284-s.jpg"></a>&nbsp;<br />&nbsp;&nbsp;]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6318209.html">
<title>CADRソース調査　メモリについて</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6318209.html</link>
<description>CADRマシンの回路図をたよりに中で使われているメモリについて調べた。Retrocomputing - MIT CADR Lisp Machines@natsutanさんのブロック図を参照してください。制御パス データパス以下はPROMだけど組み合わせ回路で実現：part_32x32prom_maskright i_MSKR A[4:0] D[31:0]...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-02-22T23:45:59+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[CADRマシンの回路図をたよりに中で使われているメモリについて調べた。<br /><a href="http://www.unlambda.com/cadr/" target="_blank">Retrocomputing - MIT CADR Lisp Machines</a><br /><br />@natsutanさんのブロック図を参照してください。<br /><a href="http://f.hatena.ne.jp/natsutan/20100824233749" target="_blank">制御パス</a>&nbsp;<br /><a href="http://f.hatena.ne.jp/natsutan/20100804221043" target="_blank">データパス<br /></a><br />以下はPROMだけど組み合わせ回路で実現：<br />part_32x32prom_maskright i_MSKR A[4:0] D[31:0]&nbsp;<br />part_32x32prom_maskleft i_MSKL A[4:0] D[31:0]<br />part_32x8prom i_DMASK A[4:0] D[7:0]<br />part_512x49prom i_PROM0 A[8:0] D[48:0]&nbsp;<br /><br />このうち512ワードのi_PROM0はデータbit46が欠けている。元々のPROMには[48:47,45:0]の48bitが割り付けられている。74S472×12個。<br /><br />以下はRAM、caddr.vでのソースではメモリ上のパリティはすでに取り除いてある：<br />part_32x19ram i_SPC A[4:0] D[18:0]　SPC STACK<br />元は32x2bit 82S21 ラッチ×10個(パリティ付き)<br /><br />part_32x32ram i_MMEM A[4:0] D[31:0]　B-MEMORY(M-MEMORY)<br />元は32x2bit 82S21 ラッチ×17個(パリティ付き)&nbsp;<br /><br />part_2kx5ram i_VMEM0 A[10:0] D[4:0]　VMAP STAGE0<br />元はRAM 1k×1bit 93425A×12個<br /><br />part_1kx24ram i_VMEM1_2 A[9:0] D[23:0] VMAP STAGE1,2<br />元はRAM 1k×1bit 93425A×25個<br /><br />part_1kx32ram i_PDL、i_AMEM A[9:0] D[31:0] PDL MEMORY、A-MEMORY<br />元はRAM 1k×1bit 93425A×33個(パリティ付き)が2セット<br /><br />part_2kx17ram i_DRAM A[10:0] D[16:0]　DISPATCH MEMORY<br />元はRAM 1k×1bit 93425A×36個<br /><br />part_16x49ram i_IRAM A[13:0] D[48:0]　INSTRUCTION MEMORY<br />元はRAM 4k×1bit IN2147×196個<br /><br />部品としてのRAMは3種類。うちラッチと書いたものはパススルーができる？<br />INSTRUCTION MEMORYがいちばん大きい。次いでDISPATCH MEMORYで、このあたりを外に追い出せばいけるか。VMAP関連についてはSTAGE0,1,2とcaddr.vソースとの対応付けが今のところはっきりしない。(CADRマシンの前身、CONSマシンのブロック図を参照しているのでその違いかもしれない)<br /><br />SPC STACK、B-MEMORYのみ中身があるものにしてDE0(CycloneIII EP3C16F484C6)ターゲットで合成してみたら約１時間で4,229/15,408LE (27%)だった。まだ行けそうね。<br /><br />]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6316283.html">
<title>QuartusIIでCADRのソースをコンパイル　２</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6316283.html</link>
<description>QuartusIIでCADRのソースをコンパイル　続きi_DRAMの中身をカラ(reg 宣言を削りassign DO=DI; とする)にして再度コンパイルしてみた今回は５時間を越えてどんどん進むが停まる気配がない。１０時間で打ち切り、すべてのRAMについて同様に中身をカラにしてみた。どうもreg宣言...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-02-22T02:18:18+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[<a target="_blank" href="http://blog.livedoor.jp/hardyboy/archives/6314365.html">QuartusIIでCADRのソースをコンパイル</a>　続き<br />i_DRAMの中身をカラ(reg 宣言を削りassign DO=DI; とする)にして再度コンパイルしてみた今回は５時間を越えてどんどん進むが停まる気配がない。１０時間で打ち切り、すべてのRAMについて同様に中身をカラにしてみた。どうもreg宣言ばかりで明にRAMに割り当てていないようで、これがLE数を消費する原因と思われた。<br />結果は以下のとおり。<blockquote>Flow Status<span style="white-space: pre;">	</span>Successful - Fri Feb 22 01:17:37 2013</blockquote><blockquote>Quartus II 64-Bit Version<span style="white-space: pre;">	</span>12.1 Build 177 11/07/2012 SJ Web Edition</blockquote><blockquote>Revision Name<span style="white-space: pre;">	</span>caddr</blockquote><blockquote>Top-level Entity Name<span style="white-space: pre;">	</span>caddr</blockquote><blockquote>Family<span style="white-space: pre;">	</span>Cyclone IV GX</blockquote><blockquote>Device<span style="white-space: pre;">	</span>EP4CGX150DF31I7AD</blockquote><blockquote>Timing Models<span style="white-space: pre;">	</span>Final</blockquote><blockquote>Total logic elements<span style="white-space: pre;">	</span>2,929 / 149,760 ( 2 % )</blockquote><blockquote>Total combinational functions<span style="white-space: pre;">	</span>2,860 / 149,760 ( 2 % )</blockquote><blockquote>Dedicated logic registers<span style="white-space: pre;">	</span>471 / 149,760 ( &lt; 1 % )</blockquote><blockquote>Total registers<span style="white-space: pre;">	</span>471</blockquote><blockquote>Total pins<span style="white-space: pre;">	</span>27 / 508 ( 5 % )</blockquote><blockquote>Total virtual pins<span style="white-space: pre;">	</span>0</blockquote><blockquote>Total memory bits<span style="white-space: pre;">	</span>0 / 6,635,520 ( 0 % )</blockquote><blockquote>Embedded Multiplier 9-bit elements<span style="white-space: pre;">	</span>0 / 720 ( 0 % )</blockquote><blockquote>Total GXB Receiver Channel PCS<span style="white-space: pre;">	</span>0 / 8 ( 0 % )</blockquote><blockquote>Total GXB Receiver Channel PMA<span style="white-space: pre;">	</span>0 / 8 ( 0 % )</blockquote><blockquote>Total GXB Transmitter Channel PCS<span style="white-space: pre;">	</span>0 / 8 ( 0 % )</blockquote><blockquote>Total GXB Transmitter Channel PMA<span style="white-space: pre;">	</span>0 / 8 ( 0 % )</blockquote><blockquote>Total PLLs<span style="white-space: pre;">	</span>0 / 8 ( 0 % )<br /></blockquote>&nbsp;　2929LEですと？ちょっと少なすぎるみたいだけどもここからRAMを盛っていく。<br />i_DRAM については外付けのDRAMと勘違いしていたのだがDispatchRAMで17bit幅☓11bitアドレスのStaticRAMだった。主記憶はCADRマシンの外にある。caddrではすでにパリティ用の1bitについては削減してあった。<br />　あとはクロック周り。osc50mhzを外部からの入力として、以下の接続。<br />osc50mhz--＞○--osc0--＞○--hifreq1,hifreq2--＞○--hfdlyd--＞○--hftomm(未使用)<br />hifreq1,hifreq2は実質同じ、hfdlydはさらに位相の遅れたクロックのつもり。<br />これらを元にディレイラインで30ns,70nsの遅れを作りRAMのサイクル用などに使っている。<br />また、NAND2個のたすきがけで制御を行なっている場所が５箇所あり、図面のCLOCK DISTRIBUSIONとMASTER CLOCKはPLLを使用したクロック制御モジュールとして起こしてやらなければならないだろう。これに合わせて非同期SRAM部分も合わせるか。<br />]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6314365.html">
<title>QuartusIIでCADRのソースをコンパイル</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6314365.html</link>
<description>LISPマシンCADRの回路図とVerilog-HDLに変換されたソースリストを見て、これ今のFPGAに収まりそうじゃないかなと思って試しにコンパイルしてみた。もともとはすべてTTLで構成されていて、それをそのままVerilogの記述に変換したものと、きちんと書きなおされたものがある。後...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-02-21T00:23:21+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[LISPマシンCADRの回路図とVerilog-HDLに変換されたソースリストを見て、これ今のFPGAに収まりそうじゃないかなと思って試しにコンパイルしてみた。もともとはすべてTTLで構成されていて、それをそのままVerilogの記述に変換したものと、きちんと書きなおされたものがある。後者はCADDR Reviced CADR Verilogとして公開されているのでこちらを使った。<br /><a href="http://www.unlambda.com/cadr/" target="_blank">Retrocomputing - MIT CADR Lisp Machines</a><br />　すでに@natsutanさんが三年前に試されているけど、最近のはどうかな？<br /><a href="http://d.hatena.ne.jp/natsutan/20100715/1279156638" target="_blank">[Lisp][Verilog][FPGA]cadrのVerilogソースのコンパイル その1<br /></a><br />環境：Windows7 PRIMERGY TX100S1(Core2Quad 2.67GHzに差し替えたもの)<br />QuartusII 12.1 Build 177 64-bit<br /><br />新規プロジェクトを作成し、ターゲットデバイスを一番LE数の大きそうなものにする。今回はCycloneIV GXにした。制約条件などのオプション指定はなにもなし。コンパイルにかかった時間は4時間23分、結果はFittingに失敗(113%)、LE数は169,005と出た。<br /><br /><blockquote><blockquote>Flow Status<span style="white-space: pre;">	</span>Flow Failed - Wed Feb 20 18:15:59 2013</blockquote><blockquote>Quartus II 64-Bit Version<span style="white-space: pre;">	</span>12.1 Build 177 11/07/2012 SJ Web Edition</blockquote><blockquote>Revision Name<span style="white-space: pre;">	</span>caddr</blockquote><blockquote>Top-level Entity Name<span style="white-space: pre;">	</span>caddr</blockquote><blockquote>Family<span style="white-space: pre;">	</span>Cyclone IV GX</blockquote><blockquote>Device<span style="white-space: pre;">	</span>EP4CGX150DF31I7AD</blockquote><blockquote>Timing Models<span style="white-space: pre;">	</span>Final</blockquote><blockquote>Total logic elements<span style="white-space: pre;">	</span>169,055 / 149,760 ( 113 % )</blockquote><blockquote>Total combinational functions<span style="white-space: pre;">	</span>109,428 / 149,760 ( 73 % )</blockquote><blockquote>Dedicated logic registers<span style="white-space: pre;">	</span>136,714 / 149,760 ( 91 % )</blockquote><blockquote>Total registers<span style="white-space: pre;">	</span>136714</blockquote><blockquote>Total pins<span style="white-space: pre;">	</span>27 / 508 ( 5 % )</blockquote><blockquote>Total virtual pins<span style="white-space: pre;">	</span>0</blockquote><blockquote>Total memory bits<span style="white-space: pre;">	</span>787,040 / 6,635,520 ( 12 % )</blockquote><blockquote>Embedded Multiplier 9-bit elements<span style="white-space: pre;">	</span>0 / 720 ( 0 % )</blockquote><blockquote>Total GXB Receiver Channel PCS<span style="white-space: pre;">	</span>0 / 8 ( 0 % )</blockquote><blockquote>Total GXB Receiver Channel PMA<span style="white-space: pre;">	</span>0 / 8 ( 0 % )</blockquote><blockquote>Total GXB Transmitter Channel PCS<span style="white-space: pre;">	</span>0 / 8 ( 0 % )</blockquote><blockquote>Total GXB Transmitter Channel PMA<span style="white-space: pre;">	</span>0 / 8 ( 0 % )</blockquote><blockquote>Total PLLs<span style="white-space: pre;">	</span>0 / 8 ( 0 % )</blockquote></blockquote><br />ソースは以下の修正が必要。<br /><br />・caddr.v 74181.v 74182.v busint.v &nbsp;memory.v rom.v を新規ファイルとしてプロジェクトに追加。（New Files... でVerilog-HDLを指定してコピペ）　lm2clock.vは多分いらない。<br /><br />・caddr.vのソース修正 `includeをすべてコメントアウト。プロジェクト内のモジュールを多重に読み込むことになるので。<br />・memory.vのソース修正　initial begin~end部分をコメントアウト。<br />・busint.vのソース修正　initial begin~end部分をコメントアウトし、always@(posedge clk)部分とalways@(rst_n)部分をalways@(posedge clk or negedge rst_n)として合体させる。<br /><br />　あとはメモリを外に出す、caddr.vが大きすぎるのである程度のモジュールに分割し面積を減らせるか検討。特にパリティ回路はまるっと削除しても問題なさそう。あとはALUをまとめてしまう、など。<br /><br />]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6263333.html">
<title>DE0 QuartusIIのMegaWizardでPLLを使う</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6263333.html</link>
<description>DE0の基板上のクロックは50MHz。搭載されているSDRAMは100MHzか133MHz動作なのでこれなんか必要だよなあPLLがあるはずだがどうやって使うんだろうと悩んでいたが解決した。　これはメーカー/デバイスごと固有の設定であり、Verilog-HDLの記述でどうこうできる話ではない。 Qu...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-02-02T12:46:45+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[DE0の基板上のクロックは50MHz。搭載されているSDRAMは100MHzか133MHz動作なのでこれなんか必要だよなあPLLがあるはずだがどうやって使うんだろうと悩んでいたが解決した。<br />　これはメーカー/デバイスごと固有の設定であり、Verilog-HDLの記述でどうこうできる話ではない。 QuartusII(12.1sp1)では[Tools]→[MegaWizard Plug-in Manager]で呼び出す。<br /><a target="_blank" title="2013pll1" href="http://livedoor.blogimg.jp/hardyboy/imgs/6/4/6464ade9.png"><img class="pict" hspace="5" alt="2013pll1" border="0" height="340" width="480" src="http://livedoor.blogimg.jp/hardyboy/imgs/6/4/6464ade9-s.png"></a><br />
新規作成を選んで次へ。<br /><a href="http://livedoor.blogimg.jp/hardyboy/imgs/5/b/5bc66395.png" title="2013pll2" target="_blank"><img src="http://livedoor.blogimg.jp/hardyboy/imgs/5/b/5bc66395-s.png" width="480" height="340" border="0" alt="2013pll2" hspace="5" class="pict"></a><br />ここでは出力する言語をverilog HDL、ファイル名はapll、使用するmegafunctionはI/O→ALTPLLを選択。<br />&nbsp;<a href="http://livedoor.blogimg.jp/hardyboy/imgs/7/d/7df435bb.png" title="2013pll3" target="_blank"><img src="http://livedoor.blogimg.jp/hardyboy/imgs/7/d/7df435bb-s.png" width="480" height="392" border="0" alt="2013pll3" hspace="5" class="pict"><br /></a>ここからALTPLLの詳細設定画面。入力クロックは50MHzにする。<br /><a href="http://livedoor.blogimg.jp/hardyboy/imgs/6/3/63e6daea.png" title="2013pll4" target="_blank"><img src="http://livedoor.blogimg.jp/hardyboy/imgs/6/3/63e6daea-s.png" width="480" height="403" border="0" alt="2013pll4" hspace="5" class="pict"></a><br />resetやlock信号は今回使わないのでチェックを外す。後はいくつか飛ばして以下の画面へ。<br /><a href="http://livedoor.blogimg.jp/hardyboy/imgs/b/5/b5ada0f5.png" title="2013pll5" target="_blank"><img src="http://livedoor.blogimg.jp/hardyboy/imgs/b/5/b5ada0f5-s.png" width="480" height="403" border="0" alt="2013pll5" hspace="5" class="pict"></a><br />&nbsp;c0～c4まで出力を設定できるが、ここではc0だけ。100MHzに設定。あとは飛ばす。<br /><a href="http://livedoor.blogimg.jp/hardyboy/imgs/9/8/985d986f.png" title="2013pll6" target="_blank"><img src="http://livedoor.blogimg.jp/hardyboy/imgs/9/8/985d986f-s.png" width="480" height="403" border="0" alt="2013pll6" hspace="5" class="pict"></a><br />最終確認。[Finish]<br /><br />メインの画面に戻って[File]→[Open...]でapll.bb.vを開く。以下の内容のダミーモジュールができる。<br /><br />
<pre>module apll (
	inclk0,
	c0);

	input	  inclk0;
	output	  c0;

endmodule
</pre>
　これをつないでやれば良い。トップモジュールで定義したクロック入力をclk_50、PLLの出力をclkで分配すると<br />apll apll_0(clk_50,clk);<br />とすればよい。なおトップモジュールでクロック入力の名前を変えるとピンの対応付けが再度必要になるのでPinPlannerで定義する。これでチカチカ表示するのが二倍速になるのを確認した。<br /><br />参考：<br /><a href="http://www.emb4fun.de/fpga/nutos1/" target="_blank">http://www.emb4fun.de/fpga/nutos1/</a><br /><br />昔話：<br />昔はのう、クロック入力を分周してデューティ50%で使ってたんじゃ。例えば内部50MHz動作だと100MHzの発振器が必要で、当時CMOSでそんな出力のはなかったんでECLレベルの発振器を使っておったんじゃ……<br />]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6252985.html">
<title>DE0 FPGAでFizzBuzz 任意の数値で判定</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6252985.html</link>
<description>続き。DE0 FPGAでFizzBuzz　前回は3進5進カウンターを使ってFizzBuzzを判定していたが、これはリセットと同期してカウントアップしなければならないという制限がある。では4桁の任意のBCD入力に対して簡単に判定することはできるか？　ソフトでは3の剰余を求めたりするがこれ...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-01-28T07:20:17+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[続き。<a target="_blank" href="http://blog.livedoor.jp/hardyboy/archives/6252752.html">DE0 FPGAでFizzBuzz</a><br />　前回は3進5進カウンターを使ってFizzBuzzを判定していたが、これはリセットと同期してカウントアップしなければならないという制限がある。では4桁の任意のBCD入力に対して簡単に判定することはできるか？<br />　ソフトでは3の剰余を求めたりするがこれは除算でありそんな大げさなものは動かしたくない。ではテーブル？buzzなら5の倍数なので、最後の桁が0または5で判断できる。<br />　では3の倍数であるfizzは？ちょっとこねくりまわしてみた。<br /><br />3の倍数だけ取り出す。<br />$ awk 'BEGIN{for(i=1;i&lt;10000;i++) printf("%04d\n",i)}' &gt; fizz.txt<br /><br />それぞれの桁をすべて足して3の剰余を求めると<br />$ awk '{print substr($1,1,1) substr($1,2,1) substr($1,3,1) substr($1,4,1)}' fizz.txt | gawk '{print $1%3}'&nbsp;<br /><br />なんかいけそう。<br /><br />組み合わせ回路で実現できる。<br />BCDの4桁それぞれに対して3の剰余を求める。それぞれの桁は0,1,2になる。これの総和は最大で8なので、これに対して3の剰余を求める。こうするとfizzが判定できる。<br />
<code>
<pre>module bcdmod3(BCD,BCDout);
	input [3:0] BCD;
	output [3:0] BCDout;

	function [3:0] mod3;
		input [3:0] bcdin;
		begin
			case (bcdin)
				1: mod3=1;
				2: mod3=2;
				4: mod3=1;
				5: mod3=2;
				7: mod3=1;
				8: mod3=2;
				default: mod3=0;
			endcase
		end
	endfunction

	assign BCDout=mod3(BCD);

	endmodule
</pre>
</code>
<br />
<br />
<code>
<pre>module chkfizz(BCD3,BCD2,BCD1,BCD0, fizz);
	input [3:0] BCD3;
	input [3:0] BCD2;
	input [3:0] BCD1;
	input [3:0] BCD0;
	output fizz;

	wire [3:0] sBCD3;
	wire [3:0] sBCD2;
	wire [3:0] sBCD1;
	wire [3:0] sBCD0;
	wire [3:0] tBCD;
	wire [3:0] aBCD;
	
	bcdmod3 bcdmod3_3(BCD3,sBCD3);
	bcdmod3 bcdmod3_2(BCD2,sBCD2);
	bcdmod3 bcdmod3_1(BCD1,sBCD1);
	bcdmod3 bcdmod3_0(BCD0,sBCD0);
	
	assign tBCD=sBCD3+sBCD2+sBCD1+sBCD0;
	
	bcdmod3 bcdmod3_a(tBCD,aBCD);
	
	assign fizz=(aBCD==4'd0);
endmodule
</pre>
</code>
<br /><br />　確認のためにトップモジュールではスライドスイッチによりBCDを入力してボタン2を押すと、その設定値からFizzBuzzのカウントを開始するようにした。<br /><br />　QuartusIIで[Project]→[Archive Project...]を選択するとプロジェクトをひとまとめにしてくれる。ダイアログで[Advanced]ボタンを押し、一番上のFileset:はService Requestを選択。これで出力するとoutout_filesディレクトリ以下にfizzbuzz.qarというようなファイルができる。これを他のQuartusIIがインストールされているマシンに持って行ってダブルクリックするとプロジェクトが展開される。<br /><br />　以下に置いてみました。<br /><a href="https://docs.google.com/file/d/0B2yELpUGLIuUVHdSV01jMzlvc28/edit" target="_blank">fizzbuzz.qar</a>(Googls Docs)<br /><br />追記：<br />それぞれの桁をa,b,c,dとおく。a+b+c+d=mod3なら1000a+100b+10c+dもmod3か？<br />999a+99b+9c + a+b+c+dとすると、9(111a+11b+c) + a+b+c+d で 3で割り切れて0 と + mod3となる。<br />ってことでよいのかな。中学二年の範囲。]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6252752.html">
<title>DE0 FPGAでFizzBuzz</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6252752.html</link>
<description>やりたいと思って約二年。やっとやる気が出て一週間。verilogの記述でFizzBuzzができた。ソース。https://gist.github.com/4649209 1〜9999までの数字を右詰めゼロサプレスで表示。3の倍数はFizz、5の倍数はBuzz、両方の倍数はFzBzとそれっぽく7セグメントのLEDで表示。Fizz...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-01-28T02:08:22+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[やりたいと思って約二年。やっとやる気が出て一週間。verilogの記述でFizzBuzzができた。<br /><br />ソース。<br /><a href="https://gist.github.com/4649209" target="_blank">https://gist.github.com/4649209</a>&nbsp;<br /><br />1〜9999までの数字を右詰めゼロサプレスで表示。3の倍数はFizz、5の倍数はBuzz、両方の倍数はFzBzとそれっぽく7セグメントのLEDで表示。<br />Fizz判定は3進カウンタ、Buzz判定は5進カウンタを使い、BCD4桁カウンタと同じクロックで同時に進む。<br />数字が0の場合を表示するとまずいので、この時は7セグメントデコーダをoffにして何も表示しないようにした。<br /><br /><object width="320" height="264"><param name="movie" value="http://www.youtube.com/v/EJAQTHFFgY4&amp;feature=youtube_gdata_player"><param name="allowFullScreen" value="true"><embed src="http://www.youtube.com/v/EJAQTHFFgY4&amp;feature=youtube_gdata_player" type="application/x-shockwave-flash" allowfullscreen="true" width="320" height="264"></object><br /><br />　色々ハマったけどwarningは全て見て無視出来る理由がないものは調査。１つのモジュールに複数の機能を入れない。複雑になり作っていてよくわからなくなったので単一機能のモジュールに分割し、上位モジュールで配線する。<br />　別の方法として、BCD出力を受けてこの中でFizzBuzz判定し、表示を差し替えるようにすれば3進5進カウンタを使わずに任意のBCDに対して判定ができるが、テーブルを作ることになるかな。5の判定は最後の桁が0 or 5でよさそうだがちょっと考えよう。]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6250136.html">
<title>DE0 QuartusIIでのコンパイル結果をちょっと見る</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6250136.html</link>
<description>QuartusII 12.1 Windows 32bit　ゼロサプレスのデコーダ作ってて、どんな回路が作られてるのだろうと覗いてみた。QuartusIIの[Tools]→[Netlist Viewers]→[RTL Viewer]追記：※この回路はゼロサプレス部分にミスがあります。　入力がすべて０の判定を三項演算子でやると、コ...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-01-26T18:43:25+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[QuartusII 12.1 Windows 32bit<br /><br />　ゼロサプレスのデコーダ作ってて、どんな回路が作られてるのだろうと覗いてみた。QuartusIIの[Tools]→[Netlist Viewers]→[RTL Viewer]<br /><br />追記：<br /><b>※この回路はゼロサプレス部分にミスがあります。　</b><br /><br />入力がすべて０の判定を三項演算子でやると、コンパレータになってる。<br />&nbsp;assign bout=(bcd==4'b0000)?1'b1:1'b0;<br /><a target="_blank" title="2013decoder_eq0" href="http://livedoor.blogimg.jp/hardyboy/imgs/9/b/9be626e3.png"><img class="pict" hspace="5" alt="2013decoder_eq0" border="0" height="310" width="480" src="http://livedoor.blogimg.jp/hardyboy/imgs/9/b/9be626e3-s.png"><br /></a><div>Flow Status<span style="white-space: pre;">	</span>Successful - Sat Jan 26 18:40:00 2013<br /><div>Quartus II 32-bit Version<span style="white-space: pre;">	</span>12.1 Build 177 11/07/2012 SJ Web Edition</div><div>Revision Name<span style="white-space: pre;">	</span>fizzbuzz</div><div>Top-level Entity Name<span style="white-space: pre;">	</span>fizzbuzz</div><div>Family<span style="white-space: pre;">	</span>Cyclone III</div><div>Device<span style="white-space: pre;">	</span>EP3C16F484C6</div><div>Timing Models<span style="white-space: pre;">	</span>Final</div><div>Total logic elements<span style="white-space: pre;">	</span>112 / 15,408 ( &lt; 1 % )</div><div>Total combinational functions<span style="white-space: pre;">	</span>101 / 15,408 ( &lt; 1 % )</div><div>Dedicated logic registers<span style="white-space: pre;">	</span>67 / 15,408 ( &lt; 1 % )</div><div>Total registers<span style="white-space: pre;">	</span>67</div><div>Total pins<span style="white-space: pre;">	</span>57 / 347 ( 16 % )</div><div>Total virtual pins<span style="white-space: pre;">	</span>0</div><div>Total memory bits<span style="white-space: pre;">	</span>0 / 516,096 ( 0 % )</div><div>Embedded Multiplier 9-bit elements<span style="white-space: pre;">	</span>0 / 112 ( 0 % )</div><div>Total PLLs<span style="white-space: pre;">	</span>0 / 4 ( 0 % )<br />&nbsp;</div><br /></div>ゲートレベルで考えるとちゃんとゲートになっている。<br />assign bout=(~(|bcd));<br /><a target="_blank" title="2013decorder_or0" href="http://livedoor.blogimg.jp/hardyboy/imgs/6/d/6dc8e654.png"><img class="pict" hspace="5" alt="2013decorder_or0" border="0" height="310" width="480" src="http://livedoor.blogimg.jp/hardyboy/imgs/6/d/6dc8e654-s.png"></a><br />&nbsp;Flow Status<span style="white-space: pre;">	</span>Successful - Sat Jan 26 18:37:14 2013<div>Quartus II 32-bit Version<span style="white-space: pre;">	</span>12.1 Build 177 11/07/2012 SJ Web Edition</div><div>Revision Name<span style="white-space: pre;">	</span>fizzbuzz</div><div>Top-level Entity Name<span style="white-space: pre;">	</span>fizzbuzz</div><div>Family<span style="white-space: pre;">	</span>Cyclone III</div><div>Device<span style="white-space: pre;">	</span>EP3C16F484C6</div><div>Timing Models<span style="white-space: pre;">	</span>Final</div><div>Total logic elements<span style="white-space: pre;">	</span>110 / 15,408 ( &lt; 1 % )</div><div>Total combinational functions<span style="white-space: pre;">	</span>99 / 15,408 ( &lt; 1 % )</div><div>Dedicated logic registers<span style="white-space: pre;">	</span>67 / 15,408 ( &lt; 1 % )</div><div>Total registers<span style="white-space: pre;">	</span>67</div><div>Total pins<span style="white-space: pre;">	</span>57 / 347 ( 16 % )</div><div>Total virtual pins<span style="white-space: pre;">	</span>0</div><div>Total memory bits<span style="white-space: pre;">	</span>0 / 516,096 ( 0 % )</div><div>Embedded Multiplier 9-bit elements<span style="white-space: pre;">	</span>0 / 112 ( 0 % )</div><div>Total PLLs<span style="white-space: pre;">	</span>0 / 4 ( 0 % )</div><br />　LEが2個少なくなった。差はないと思っていたんだけど、記述での最適化は効くということだろうか。&nbsp;<br />]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6249500.html">
<title>DE0 ゼロサプレス付きカウンタ</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6249500.html</link>
<description>続き。カウンタと7セグメントLEDに表示するデコーダ、スイッチ入力のチャタリング除去のモジュールを作成した。　QuartusIIで新規プロジェクトを作成。[Assignment]→[Import Assignment...]で前回作成したピンアサインを取り込む。20130126追記：肝心のゼロサプレス部分に間...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-01-26T12:12:15+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[続き。カウンタと7セグメントLEDに表示するデコーダ、スイッチ入力のチャタリング除去のモジュールを作成した。<br /><br />　QuartusIIで新規プロジェクトを作成。[Assignment]→[Import Assignment...]で前回作成したピンアサインを取り込む。<br /><br /><b>20130126追記：肝心のゼロサプレス部分に間違いがあります。</b><br />このままだと４桁の１００１表示で１０□１の様になります。ゼロサプレスは直前ではなくずっと前の桁がすべて０でなければならないので、segleddec.vは以下書き換え。<br /><br />assign bout=(bcd==4'b0000)?bin:0;<br /><br /><a target="_blank" href="https://gist.github.com/4639707">https://gist.github.com/4639707</a>&nbsp;<br /><br />　segleddec.vは4bitの入力を0～Fの16パターンと解釈し、それぞれのパターンに対応する7セグメントのLEDを点灯させる。DE0の7セグメントLEDはアノードコモンなので'0'で点灯。<br />　TTLの7447はゼロサプレスの機能を持っている。これは普通の電卓の表示のように、桁の左側の余計なゼロを表示しないというもの。左側に位置する桁が'0'で、自分自身が'0'ならば表示を抑止する。ただし１桁目は'0'も表示する。<br /><br />segleddec.v<br /><div><span style="white-space: pre;">	</span>assign bout=(bcd==4'b0000)?1'b1:1'b0;<span style="white-space: pre;">	</span>// ~&amp;bcd</div><div><span style="white-space: pre;">	</span>assign led=(bout&amp;&amp;bin)?8'b11111111:ALED(bcd,dp);</div><br />　左側の桁は'0000'ならboutを出力。右側の桁はそれをbinで受ける。右側の桁は自分が'0000'かつ左側の桁が'0000'(bin='1')なら表示を抑止。たくさん並んでいる桁なら、一番左側の桁のbinは'1'に吊ってあとはカスケード接続。ただし一番右、最後の桁はbinを'0'にして切り離す。<br /><br />hexcounter.v:<br /><div><span style="white-space: pre;">	</span>segleddec seg0(cnt[27:24],1'b0,1'b0, hled0,bout0_0);<span style="white-space: pre;">	</span>// Digit xxx0 always on</div><div><span style="white-space: pre;">	</span>segleddec seg1(cnt[31:28],1'b0,bout2_1, hled1,bout1_0);</div><div><span style="white-space: pre;">	</span>segleddec seg2(cnt[35:32],1'b0,bout3_2, hled2,bout2_1);</div><div><span style="white-space: pre;">	</span>segleddec seg3(cnt[39:36],1'b0,1'b1, hled3,bout3_2);</div><br />　こんな感じ。モジュールを定義しておいてこのように書くとインスタンスseg0,seg1,seg2,seg3を生成できる。<br />&nbsp;<br /><br />　二進カウンターは特に問題ないが、パラメータ化して任意のビット長まで指定できるようにしてある。非同期リセット付き。<br />　TTLなどは非同期リセットがかかるまでは値を保持するFFの内容は'1'か'0'かわからないものとして扱うが、パワーオン後にスキャンを行い初期設定するFPGAやASICは値が確定している。ただし'1'か'0'かは設定によるし、昔パワーオン直後のすべてのFFの値は'1'というPLDを使ったことがあった。<br /><br />　ついでにスイッチ入力をFF受けで同期化してチャタリングを抑止するunchat.vを組み込んだ。同期回路に非同期の信号を直接入れるのは気持ち悪い。以下の様なトラブルを調査したことがあるが、こんなことがありえるのだ。<br /><br /><a target="_blank" href="http://keisanki.at.webry.info/200803/article_1.html">入力信号は必ずFF受けで</a>&nbsp;<br /><br />　ここではカウンターで16分周した(50MHz÷65536＝20ns×65536＝1.3ms)間隔でスイッチの入力をサンプリングする。チャタリングはこの周期内には収まっている前提。<br />　パラメータ化はしていない。<br /><br /><object width="320" height="264"><param name="movie" value="http://www.youtube.com/v/LNJIAXgluL8&amp;feature=youtube_gdata_player"><param name="allowFullScreen" value="true"><embed src="http://www.youtube.com/v/LNJIAXgluL8&amp;feature=youtube_gdata_player" type="application/x-shockwave-flash" allowfullscreen="true" width="320" height="264"></object><br />]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6246072.html">
<title>DE0 オンボードのLED、スイッチ類のピンアサイン</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6246072.html</link>
<description>「超入門！FPGAスタータ・キット DE0で始めるVerilog HDL」を見ながらDE0ボードで遊び始めているが、色々な実験をする前にピンアサインを入れてしまおう。毎回Pin Plannerで設定するのも嫌なので、本の途中を飛ばして第17章へ。最上位階層(top module)でないとFPGAのI/Oには...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-01-24T21:25:04+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[「超入門！FPGAスタータ・キット DE0で始めるVerilog HDL」を見ながらDE0ボードで遊び始めているが、色々な実験をする前にピンアサインを入れてしまおう。毎回Pin Plannerで設定するのも嫌なので、本の途中を飛ばして第17章へ。最上位階層(top module)でないとFPGAのI/Oには接続できないが、ここで最上位階層の枠を決めて対応するピンもPin Plannerで定義してやると、あとはこれを保存しておけば別のデザインを始めるときに呼び出すだけでよい。ついでにLEDやスイッチのテストも兼ねた記述を入れた。<br /><br /><a href="https://gist.github.com/4620609" target="_blank">https://gist.github.com/4620609<br /></a><br />
<code>
<pre>// terasIC DE0 topmodule skeleton
// onboard I/O 3-button,10-sw,10-LED,4-7SEG
//
module Skeleton(clk,btn,sw,led,hled0,hled1,hled2,hled3,lcd_bl);
  input clk;
	input [2:0] btn;
	input [9:0] sw;
	output [9:0] led;
	output [7:0] hled0;
	output [7:0] hled1;
	output [7:0] hled2;
	output [7:0] hled3;
	output lcd_bl;
	
	assign led=(btn[2]==1'b1) ? sw: ~sw; // button2 press, then invert all LED
	assign hled0[7:0]=(btn[1:0]==2'b11) ? ~sw[7:0]: 8'b11111111; // 7segment digit xxx0
	assign hled1[7:0]=(btn[1:0]==2'b10) ? ~sw[7:0]: 8'b11111111; // 7segment digit xx0x press button 0
	assign hled2[7:0]=(btn[1:0]==2'b01) ? ~sw[7:0]: 8'b11111111; // 7segment digit x0xx press button 1
	assign hled3[7:0]=(btn[1:0]==2'b00) ? ~sw[7:0]: 8'b11111111; // 7segment digit 0xxx press button 1,0
	assign lcd_bl=sw[9]; // optiona LCD backlight
 
endmodule
</pre>
</code>
<br />プッシュボタンは押すと'0'、離した状態で'1'。<br />スライドスイッチは上の位置で'1'、下の位置で'0'。<br />緑のLEDは'1'で点灯。<br />7セグメントLEDはアノードコモンなので'0'で点灯。セグメントは上から時計回りにa,b,c,d,e,f、中央はg、小数点はdp。<br /><br />　ピンプランナーでの画面。<br /><a target="_blank" title="pinplanner" href="http://livedoor.blogimg.jp/hardyboy/imgs/4/5/453433be.png"><img class="pict" hspace="5" alt="pinplanner" border="0" height="383" width="480" src="http://livedoor.blogimg.jp/hardyboy/imgs/4/5/453433be-s.png"></a><br /><br /><br />せっかくピンアサインの対応表を作ったので以下にcsvファイルを置いときます。お手持ちの表計算ソフトで読み込んで下さい。<br /><br /><a href="https://gist.github.com/4620569" target="_blank">https://gist.github.com/4620569</a><br /><br />動画はこちら。<br /><object width="320" height="264"><param name="movie" value="http://www.youtube.com/v/_RImTSgmnnQ&amp;feature=youtube_gdata_player"><param name="allowFullScreen" value="true"><embed src="http://www.youtube.com/v/_RImTSgmnnQ&amp;feature=youtube_gdata_player" type="application/x-shockwave-flash" allowfullscreen="true" width="320" height="264"></object>]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/hardyboy/archives/6244403.html">
<title>terasIC DE0評価ボードで何か動かすまでのメモ</title>
<link>http://blog.livedoor.jp/hardyboy/archives/6244403.html</link>
<description>　2年ほど触らないままでいたFPGAの評価ボード(terasicのDE0)、ちょっときっかけがあったので使ってみた。サンプルの記述を論理合成してボードに転送し、スイッチとLEDを連動させるまでの手順。terasIC Altera DE0 BoardDE0のマニュアルなど以降Windows7(64bit)で作業。開発...</description>
<dc:creator>hardyboy</dc:creator>
<dc:date>2013-01-24T01:08:15+09:00</dc:date>
<dc:subject>FPGA</dc:subject>
<content:encoded><![CDATA[<div>　2年ほど触らないままでいたFPGAの評価ボード(terasicのDE0)、ちょっときっかけがあったので使ってみた。サンプルの記述を論理合成してボードに転送し、スイッチとLEDを連動させるまでの手順。</div><div><br /><a href="http://www.terasic.com.tw/cgi-bin/page/archive.pl?No=364" target="_blank">terasIC Altera DE0 Board<br /></a><br /><a href="http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&amp;CategoryNo=56&amp;No=364&amp;PartNo=4" target="_blank">DE0のマニュアルなど<br /></a><br /><div>以降Windows7(64bit)で作業。</div><br /><div>開発用ソフトのダウンロード 最新はQuartus II v12.1 ウェブ・エディションをインストール</div></div><div><a href="http://www.altera.co.jp/" target="_blank">ALTERA<br /></a><br /><div>※これが約4GBと大きいのでウチなんかだと一晩コース</div><br /><br /><div>　「超入門！FPGAスタータ・キット DE0で始めるVerilog HDL」を参照しながら開始。</div><div>この本はQuartus II v9.0を例に説明してある。インストールと動作確認は1章、2章。</div><div>　論理回路がわかっている人は3〜6章は飛ばしていい。</div><br /><div>&nbsp;DE0をPCに接続する。デバイスがインストールされなかったら、 コントロールパネル＞すべてのコントロールパネル項目＞システム＞デバイスマネージャーからUSB Blusterを探し、再インストール。C:\altera\12.1\quartus\drivers以下を指定。</div><br /><div>☆最初のハマリどころ</div><div>[File]→[New Project Wizard...]でディレクトリを指定するが、ここがデスクトップだとパーミッションがないと言われ作成できなかった。自分のホームディレクトリだとOKだが、そこにプロジェクト用のファイルが散らばってしまうのでサブディレクトリを指定。</div><br /><div>　FPGAデバイスは Family: CycloneIII で Available devices: から EP3C16F484C6を選択。</div><div>　他は設定しなくていい。</div><br /><br /><div>　プロジェクトウィザードが終了したら[File]→[New]でVerilog HDL Fileを選択。</div><br /><div>この本のとおりにするとLesson1.vというファイル名で一旦保存。</div><div>次に以下のソースを入力。</div></div><div><a href="https://gist.github.com/4608000" target="_blank">https://gist.github.com/4608000<br /></a><br /></div>
<pre><code>
module Lesson1( sw, led );
  input [9:0] sw ;
	output [9:0] led ;
 
	assign led=sw;
	
endmodule
 
/*
module Lesson1(
sw0,sw1,sw2,sw3,sw4,sw5,sw6,sw7,sw8,sw9,
led0,led1,led2,led3,led4,led5,led6,led7,led8,led9);
	input sw0,sw1,sw2,sw3,sw4,sw5,sw6,sw7,sw8,sw9;
	output led0,led1,led2,led3,led4,led5,led6,led7,led8,led9;
	
	assign led0=sw0;
	assign led1=sw1;
	assign led2=sw2;
	assign led3=sw3;
	assign led4=sw4;
	assign led5=sw5;
	assign led6=sw6;
	assign led7=sw7;
	assign led8=sw8;
	assign led9=sw9;
	
endmodule
*/
</code></pre>
<br />※コメント内は入出力をバラで書いた場合。<br /><br /><div>保存してから[Processing]→[Start]→[Start Anarysis &amp; Elaboration]を実行。成功したら次はピンアサイン。</div><div>ピンアサインは[Assignments]→[Pin Planner]でピンプランナーを開く。</div><div>ここで NodeNameに対し以下のLocationを入力する。</div><br /><div>NodeName Location</div><div>led[9] PIN_B1</div><div>led[8] PIN_B2</div><div>led[7] PIN_C2</div><div>led[6] PIN_C1</div><div>led[5] PIN_E1</div><div>led[4] PIN_F2</div><div>led[3] PIN_H1</div><div>led[2] PIN_J3</div><div>led[1] PIN_J2</div><div>led[0] PIN_J1</div><div>sw[9] PIN_D2</div><div>sw[8] PIN_E4</div><div>sw[7] PIN_E3</div><div>sw[6] PIN_H7</div><div>sw[5] PIN_J7</div><div>sw[4] PIN_G5</div><div>sw[3] PIN_G4</div><div>sw[2] PIN_H6</div><div>se[1] PIN_H5</div><div>sw[0] PIN_J6</div><br /><div>このピン割当てについてはDE0_User_manualを参照。</div><br /><div>[Processing]→[Start Compilation]でビルドする。</div><br /><div>☆次のハマりどころ</div><div>[Processing]→[Start Compilation]でいきなりビルドするとピンアサインも勝手に割り当てられてしまい、ピンプランナーで付け替えることができない。</div><div>[Assignments]→[Remove Assignments]で□Pin,Location &amp; Routing Assignmentsにチェックを入れて[OK]で解除。このあとピンプランナーで入力。</div><br /><div>　あとはDE0に転送する。左側のスライドスイッチが[RUN]の位置にあることを確認し、DE0の電源を入れる。</div><div>[Tools]→[Programmer]で画面を開き、左上にある[Hardware Setup...]ボタンを押して USB-Blaster [USB-0] をダブルクリック。ここの設定は一回だけでよい。</div><div>転送はこの画面を開いて[Start]のボタンを押す。これでFPGAにConfigureが転送される。</div><br /><div>　DE0の電源を入れるとデモがスタートするが、これは基板上のConfiguration用ROMからFPGAにデモが書いてあるイメージが転送されるため。上記操作だとDE0基板上のUSB-Bluster経由でPCからFPGAに直接転送される。</div><br /><div>スライドスイッチをONにすると対応したLEDが点灯する。(動画)</div><div><object width="320" height="264"><param name="movie" value="http://www.youtube.com/v/rn2aXGzYI6Q&amp;feature=youtube_gdata_player"><param name="allowFullScreen" value="true"><embed src="http://www.youtube.com/v/rn2aXGzYI6Q&amp;feature=youtube_gdata_player" type="application/x-shockwave-flash" allowfullscreen="true" width="320" height="264"></object><br /></div><br /><div>　ビルド時のWarinigに関しては、今回はclockは使用していないので</div><div>332068 No clocks defines in design.</div><div>は無視。</div><div>332012 Synopsys Design Constraints File fine not found: ...&nbsp;</div><div>は制約ファイルといってディレイのタイミングを調整するのに使うが今回は意識しないのでこれも無視。</div><div>(ってSynopsysの技術使ってるんだこれ)</div><br /><div>　感想。こんなに気軽に出来るとは思ってなかった。身構え過ぎでした。</div><div>大昔、元職場の同僚がアルテラのPentium60/66MHzに似たパッケージの石を486DX100MHzのWindows3.1マシンで一生懸命設計しコンパイルに一晩かかっていたのを思い出しましたが、そんな話ではなかった。こんなに簡単に出来ていいのか、としばらくは興奮状態。</div><br /><div>なつたんさん、今頃使いはじめてごめんなさい。これから使い潰します。</div>
<br />
<table cellpadding="5" border="0"><tbody><tr><td valign="top"><a target="_top" href="http://www.amazon.co.jp/exec/obidos/ASIN/478983137X/keisanki-22/"><img alt="超入門！FPGAスタータ・キットDE0で始めるVerilog HDL: すぐ始められる!USB対応・書き込み器不要・大容量FPGA搭載! (トライアルシリーズ)" border="0" src="http://ecx.images-amazon.com/images/I/51QO3wFFB4L._SL160_.jpg"></a></td><td valign="top"><span><a target="_top" href="http://www.amazon.co.jp/exec/obidos/ASIN/478983137X/keisanki-22/">超入門！FPGAスタータ・キットDE0で始めるVerilog HDL: すぐ始められる!USB対応・書き込み器不要・大容量FPGA搭載! (トライアルシリーズ)</a><br />芹井 滋喜 <br /><br />CQ出版  2011-07-22<br />売り上げランキング : 115091<br /><br /><a target="_top" href="http://www.amazon.co.jp/exec/obidos/ASIN/478983137X/keisanki-22/">Amazonで詳しく見る</a></span><span> by <a href="http://www.goodpic.com/mt/aws/index.html">G-Tools</a></span></td></tr></tbody></table>]]>
</content:encoded>
</item>

</rdf:RDF>
