<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>VerilogHDL | meyon&#039;s STUDY</title>
	<atom:link href="https://meyon.gonna.jp/study/category/electronic/veriloghdl/feed/" rel="self" type="application/rss+xml" />
	<link>https://meyon.gonna.jp/study</link>
	<description>meyon の電子工作とかArduinoとかアマチュア無線とか</description>
	<lastBuildDate>Sat, 01 Jul 2023 14:08:59 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.5</generator>

<image>
	<url>https://meyon.gonna.jp/study/wp-content/uploads/a240x240-100x100.jpg</url>
	<title>VerilogHDL | meyon&#039;s STUDY</title>
	<link>https://meyon.gonna.jp/study</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VerilogHDL 波形から回路をつくる</title>
		<link>https://meyon.gonna.jp/study/electronic/5902/</link>
		
		<dc:creator><![CDATA[meyon230]]></dc:creator>
		<pubDate>Sat, 26 Nov 2022 14:20:49 +0000</pubDate>
				<category><![CDATA[VerilogHDL]]></category>
		<category><![CDATA[電子工作]]></category>
		<guid isPermaLink="false">http://meyon.gonna.jp/study/?p=5902</guid>

					<description><![CDATA[今回の例題はこれ。 目次 波形から回路をつくるシフトレジスタによる回路構成回路記述テストベンチシミュレーション結果後記 波形から回路をつくる 問題の波形は、図 1 のとおり。4MHz のクロックから発生された信号です。こ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>今回の例題はこれ。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-reference-link">

<a rel="noopener" target="_blank" href="https://monoist.itmedia.co.jp/mn/articles/0811/06/news144.html" title="【問題10】 波形から回路を作ろう" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://image.itmedia.co.jp/mn/articles/0811/06/ay_dr3_10_ans01.gif" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【問題10】 波形から回路を作ろう</div><div class="blogcard-snippet external-blogcard-snippet">HDLを用いて回路を作る際、いきなりコーディングするのではなく、最初にブロック図で回路構成をしっかりとイメージすることが大切だ。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://monoist.itmedia.co.jp/mn/articles/0811/06/news144.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">monoist.itmedia.co.jp</div></div></div></div></a>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">波形から回路をつくる</a><ol><li><a href="#toc2" tabindex="0">シフトレジスタによる回路構成</a></li><li><a href="#toc3" tabindex="0">回路記述</a></li><li><a href="#toc4" tabindex="0">テストベンチ</a></li><li><a href="#toc5" tabindex="0">シミュレーション結果</a></li></ol></li><li><a href="#toc6" tabindex="0">後記</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">波形から回路をつくる</span></h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<p></p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="398" height="193" src="https://meyon.gonna.jp/study/wp-content/uploads/image_537983.png" alt="" class="wp-image-5903" srcset="https://meyon.gonna.jp/study/wp-content/uploads/image_537983.png 398w, https://meyon.gonna.jp/study/wp-content/uploads/image_537983-300x145.png 300w" sizes="(max-width: 398px) 100vw, 398px" /><figcaption class="wp-element-caption">図 1. ある回路から出力された信号</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>問題の波形は、図 1 のとおり。4MHz のクロックから発生された信号です。このような信号を発生させる回路をつくれ、との指令です。</p>



<p>こんな波形、見たことありますねぇ。シフトレジスタ？リングカウンタ？</p>
</div>
</div>



<p>そうそう、最近つくったことがある回路、デコーダですよ。<br>7 セグメント LED のダイナミック点灯をやったとき、デジットを制御するための 2to4 ラインデコーダの出力波形が、こんなでした (<a href="https://meyon.gonna.jp/study/electronic/5533/">過去記事</a>)。そのときはアクティブローでしたので、波形は HIGH、LOW が逆転してましたが、同じことです。<br>なので答えは、デコーダです。</p>



<p>いや、シフトレジスタもリングカウンタも正解ですし。</p>



<h3 class="wp-block-heading"><span id="toc2">シフトレジスタによる回路構成</span></h3>



<p>デコーダに関しては、すでに 7 セグメントデコーダで類似した回路記述をやりました。例題サイトの解説にもあるように、いくつかの回路が考えられますが、例題に倣ってシフトレジスタを考えてみたいと思います。<br>シフトレジスタを選んだもうひとつの理由は、「連接演算子 { } 」にあります。<a href="https://meyon.gonna.jp/study/electronic/5653/">4 ビット加算器のシミュレーション</a>をやったときに出てきているのですが、使い方がよくわかっていませんでしたので、もう少し勉強してみましょう。</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="430" height="170" src="https://meyon.gonna.jp/study/wp-content/uploads/image-26.png" alt="" class="wp-image-5904" srcset="https://meyon.gonna.jp/study/wp-content/uploads/image-26.png 430w, https://meyon.gonna.jp/study/wp-content/uploads/image-26-300x119.png 300w" sizes="(max-width: 430px) 100vw, 430px" /><figcaption class="wp-element-caption">図 2. シフトレジスタによる回路構成</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>クロックは 4MHz (周期 250ns)、出力信号は 1ms 幅なので、イネーブル信号も 1ms 幅です。したがって、クロックを 4000 分周する必要があります。4000 分周回路からイネーブル信号を出力し、イネーブル付きのシフトレジスタを制御します。</p>
</div>
</div>



<h3 class="wp-block-heading"><span id="toc3">回路記述</span></h3>



<p>4000 分周回路と、シフトレジスタを接続した回路の記述です。</p>



<code>
<ol start="1" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module SHIFTREGISTER(</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;input wire CLK, RES,</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;output reg [3:0] Q</li>
<li style="background-color:#EEF;">);</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;wire EN;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;reg [11:0] NUMBER_OF_CLOCKS;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;parameter CLOCKS_PER_EN = 12'd3999;</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>モジュール名、入出力ポート、内部信号、パラメータの宣言です。<br>4000 は 2 進数で何ビットですか？ もう、スマホの電卓ですぐに計算できますね。</p>



<pre class="wp-block-preformatted">N = log(4000) / log(2) ≒ 12</pre>



<p>NUMBER_OF_CLOCKS は、カウントしたクロックの数。3999 クロック目でイネーブル信号 EN を出力して 0 に戻します。パラメータ CLOCKS_PER_EN は EN を出力するカウント数、12&#8217;d3999 です。</p>



<p></p>



<div class="wp-block-cocoon-blocks-caption-box-1 caption-box block-box"><div class="caption-box-label block-box-label box-label fab-info-circle"><span class="caption-box-label-text block-box-label-text box-label-text">メモ：対数の計算</span></div><div class="caption-box-content block-box-content box-content">
<p>対数の計算方法ですが、手計算だとこんなふう。対数表は、必要ですけど。<br>まぁ、頭の体操です (^_^;)</p>



<pre class="wp-block-preformatted">log(4000) = log(2<sup>2</sup> x 10<sup>3</sup>) = 2 x log(2) + 3 x log(10)
log(10) = 1 , log(2) = 0.301 なので
log(4000)/log(2) = (2 x 0.301 + 3 x 1) / 0.301 = 11.97   </pre>
</div></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<code>
<ol start="11" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">// 4000 Divider</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;always @(posedge CLK or negedge RES) begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;if(1'b0 == RES)</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUMBER_OF_CLOCKS &lt;= 12'd0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;else if(CLOCKS_PER_EN == NUMBER_OF_CLOCKS)</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUMBER_OF_CLOCKS &lt;= 12'd0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;else</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUMBER_OF_CLOCKS &lt;= NUMBER_OF_CLOCKS + 12'd1;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;assign EN = (CLOCKS_PER_EN == NUMBER_OF_CLOCKS);</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>4000 分周器の回路。リセットは非同期です。21 行目が、桁上がり、ここでは EN を出力する記述。</p>



<code>
<ol start="23" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">// Shift Register</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;always @(posedge CLK or negedge RES) begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;if(1'b0 == RES)</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q &lt;= 4'b0001;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;else if(1'b1 == EN)</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q &lt;= {Q[2:0], Q[3]};</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">endmodule</li>
</ol></code>



<p>シフトレジスタの記述は、初めまして、です。</p>



<p>25~26 行目。リセットが入ったとき、出力を 0b0001 にしています。これ、本来のシフトレジスタなら 0b0000 になるべきです。ここに 0b0001 を入れるってのは、リングカウンタを構成させる、ってことだな。リングカウンタもジョンソンカウンタも、シフトレジスタでつくりますから。</p>



<p>そして、27~28 行目。EN が入ったとき、出力 Q を「 {Q[2:0], Q[3]} 」にしています。Q[2:0] とは、Q の bit2~bit0 を指す。たとえば 0b0010 ならば「010」。Q[3] は、Q の bit3、つまり「0」です。<br>{} は連接演算子で、ビット列をつないで多ビット信号としてあつかいます。</p>



<pre class="wp-block-preformatted">{ Q[2:0], Q[3] } = { 010, 0 } = 0100</pre>



<p>ということで、0b0010 が 0b0100 になった。1 がシフトした、ってことです。</p>



<p>ちなみに、通常のシフトレジスタの場合は、シリアル入力を SERIAL として</p>



<pre class="wp-block-preformatted">Q &lt;= { Q[2:0], SERIAL };</pre>



<p>のように記述します。</p>



<p>連接演算子は左辺でも利用できます。<a href="https://meyon.gonna.jp/study/electronic/5653/">4 ビット加算器のシミュレーション</a>にでてきた</p>



<pre class="wp-block-preformatted">assign {carry, X} = A + B;</pre>



<p>がそれ。<br>carry は 1 ビット、A、B、X はそれぞれ 4 ビットです。A と B を加算したとき、桁上がりがあると 5 ビットになる。左辺では、carry に先頭の 1 ビット (桁上がりビット)、X に 4 ビット (加算された値) が格納される。左辺と右辺のビット数は、同じにするのが吉です。</p>



<h3 class="wp-block-heading"><span id="toc4">テストベンチ</span></h3>



<p>今回は、テストベンチにも新しいしかけをみつけました。</p>



<code>
<ol start="1" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">`timescale 1ns / 1ns</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">module SHIFTREGISTER_TEST;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;reg CLK, RES;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;wire [3:0] Q;</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;parameter OSC_PERIOD = 250; // 4MHz</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;always begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;CLK = 0; #(OSC_PERIOD /2);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;CLK = 1; #(OSC_PERIOD /2);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>4MHz のクロックの周期は 250ns。なので、`timescale を 1ns としました。<br>クロック周期を 250 としてパラメータ宣言し、クロックを発生させています。</p>



<code>
<ol start="15" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">&nbsp;&nbsp;SHIFTREGISTER SHIFTREGISTER(CLK, RES, Q);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;//defparam SHIFTREGISTER.CLOCKS_PER_EN = 39;</li>
<li style="background-color:#EFF;"></li>
</ol></code>



<p>シフトレジスタ回路をインスタンス化しています。</p>



<p>16 行目。コメントアウトしていますが、defparam は、下位モジュールのパラメータを上書きする記述です。ここのコメントを外すと、回路記述で宣言したパラメータ CLOCKS_PER_EN = 12&#8217;3999 が上書きされて、12&#8217;d39 になっちゃう。つまり、本来なら 3999 クロック数えるところが、39 クロックで EN を出力させることになる。<br>シミュレーションをちゃちゃっと進める、1 つの方法ってことでしょうか。あるいは、シミュレーションの流れを変化させるおまじないかもしれません (^_^;)</p>



<p>なお、つぎのように、下位モジュール接続 (インスタンス化) 時にパラメータ割り当てする記述スタイルもあります。</p>



<code>
<ol start="15" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">&nbsp;SHIFTREGISTER #(.CLOCKS_PER_EN(39)) SHIFTREGISTER(CLK, RES, Q);</li>
</ol></code>



<p></p>



<p>#() 内に、パラメータ名を指定する場合はドットをつけます。数字だけでもいいんですが、複数のパラメータがあるときは順番を間違えてはいけません。<br>このあたり、記述スタイルもいろいろあるようですが、どれかに決めておくのがよさそうです。</p>



<code>
<ol start="18" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EEF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;RES = 0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;repeat(2) @(posedge CLK);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;RES = 1;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;repeat(40000) @(posedge CLK);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;RES = 0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;repeat(2) @(posedge CLK);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;$finish;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
</ol></code>



<p>入力を発生させます。<br>RES=0 でスタートし、2 クロック待って RES=1。40000 クロック (=10ms) のあいだ動作させて、RES=0 に戻す。2 クロック待って終了。</p>



<code>
<ol start="28" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EEF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpfile("shiftregister_test.vcd");</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpvars(0, SHIFTREGISTER_TEST);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">endmodule</li>
</ol></code>



<p>毎度の VCD ファイル出力です。</p>



<h3 class="wp-block-heading"><span id="toc5">シミュレーション結果</span></h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-large"><a href="https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test1_537983.png"><img loading="lazy" decoding="async" width="1024" height="783" src="https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test1_537983-1024x783.png" alt="" class="wp-image-5909" srcset="https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test1_537983-1024x783.png 1024w, https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test1_537983-300x229.png 300w, https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test1_537983-768x587.png 768w, https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test1_537983.png 1118w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">図 3.シフトレジスタのシミュレーション結果</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>シミュレーション結果です。</p>



<p>図 3 は、3999 カウント目で EN を出力した、設計通りのシミュレーションです。<br>EN が 1ms ごとに出力され、出力 Q がシフトしていっています。</p>
</div>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-large"><a href="https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test2_537983.png"><img loading="lazy" decoding="async" width="1024" height="782" src="https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test2_537983-1024x782.png" alt="" class="wp-image-5910" srcset="https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test2_537983-1024x782.png 1024w, https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test2_537983-300x229.png 300w, https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test2_537983-768x587.png 768w, https://meyon.gonna.jp/study/wp-content/uploads/shiftregister_test2_537983.png 1119w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">図 4. パラメータを変更したシミュレーション結果</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>図 4 は、パラメータ割り当てを 39 に変更したシミュレーション結果です。<br>39 カウント目で、EN が出力され、Q が変化している部分を拡大しています。クロックの周期が 250ns になっていることも、確認できます。<br></p>
</div>
</div>



<h2 class="wp-block-heading"><span id="toc6">後記</span></h2>



<p>前回の、<a href="https://meyon.gonna.jp/study/electronic/5850/">クロック同期回路のシミュレーション</a>では、動作の確認にすこしばかり苦労しました。が、今回「パラメータ割り当て」という方法を知ったので、前回のようなときに役立ちそうです。<br>まだまだ、まぁ C 言語なんかでも同様ですが、さまざまなこと、知らないこと、理解不能なデープな機能もあることでしょう。自分なりに、うまく利用できたら、と思っています。</p>



<p>さて、例題にさせていただいたサイトでは、次は「期末考査」のようです。基本的なことは、これまでやってきたとおりですので、俺は、パスしま〜す。テスト、きら〜い (^_^;)</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>VerilogHDL クロック同期回路のシミュレーション</title>
		<link>https://meyon.gonna.jp/study/electronic/5850/</link>
		
		<dc:creator><![CDATA[meyon230]]></dc:creator>
		<pubDate>Fri, 25 Nov 2022 12:19:12 +0000</pubDate>
				<category><![CDATA[VerilogHDL]]></category>
		<category><![CDATA[電子工作]]></category>
		<guid isPermaLink="false">http://meyon.gonna.jp/study/?p=5850</guid>

					<description><![CDATA[次の例題にいきましょう。今回は「クロック同期回路」です。さすがに、さらにむずかしくなってきました。いろいろ、つまづいたり、てこずったり。 【問題9】 「クロック同期回路」の設計は難しい？シミュレータを用い、ブロッキング代 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>次の例題にいきましょう。今回は「クロック同期回路」です。<br>さすがに、さらにむずかしくなってきました。いろいろ、つまづいたり、てこずったり。</p>




<a rel="noopener" target="_blank" href="https://monoist.itmedia.co.jp/mn/articles/0810/30/news142.html" title="【問題9】 「クロック同期回路」の設計は難しい？" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://image.itmedia.co.jp/mn/articles/0810/30/ay_dr3_09_fig01.gif" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【問題9】 「クロック同期回路」の設計は難しい？</div><div class="blogcard-snippet external-blogcard-snippet">シミュレータを用い、ブロッキング代入とノン・ブロッキング代入の動作の違いについて調査。2つの代入の使い分けのポイントとは？</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://monoist.itmedia.co.jp/mn/articles/0810/30/news142.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">monoist.itmedia.co.jp</div></div></div></div></a>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">クロック同期回路とは</a></li><li><a href="#toc2" tabindex="0">クロック同期回路をシミュレーションする</a><ol><li><a href="#toc3" tabindex="0">回路記述</a></li><li><a href="#toc4" tabindex="0">テストベンチ</a></li><li><a href="#toc5" tabindex="0">シミュレーション結果</a><ol><li><a href="#toc6" tabindex="0">10 秒間のシミュレーション</a></li><li><a href="#toc7" tabindex="0">クロックを 6KHz にしてシミュレーション</a></li></ol></li></ol></li><li><a href="#toc8" tabindex="0">後記</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">クロック同期回路とは</span></h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-full"><a href="https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_blockDiagram_959833.png"><img loading="lazy" decoding="async" width="633" height="180" src="https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_blockDiagram_959833.png" alt="" class="wp-image-5851" srcset="https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_blockDiagram_959833.png 633w, https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_blockDiagram_959833-300x85.png 300w" sizes="(max-width: 633px) 100vw, 633px" /></a><figcaption class="wp-element-caption">図 1. クロック同期回路 ブロック図</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>クロック同期回路とは、図 1 みたいな回路です。<br>これ、デジタル時計をつくったとき、同じ回路をつくりましたね。(<a href="https://meyon.gonna.jp/study/electronic/5368/">過去記事</a>)</p>



<p>前段のカウンタの出力を、次段のカウンタのクロック入力につないでしまうと、カウンタどうしが非同期になって遅延が発生する。なので、各カウンタに同じクロックを入力し、次段カウンタは、前段カウンタの桁上がり信号を受けたときだけクロックを有効にして、カウントさせる。</p>



<p>って、やりかたです。</p>
</div>
</div>



<h2 class="wp-block-heading"><span id="toc2">クロック同期回路をシミュレーションする</span></h2>



<p>今回の例題は、6MHz のクロック信号を与え、1 秒毎にカウントして 8 ビットバイナリデータを出力させる、というものです。</p>



<p>まず、6MHz のクロック CLOCK から 1 秒毎のカウントイネーブル信号 COUNT_ENABLE をつくります。これはつまり、6000000 進カウンタです。つぎに、1 秒ごとに CLOCK を有効にし、8 ビットカウンタでカウント、バイナリデータを出力します。これはいわゆる、イネーブル付き 8 ビット (256 進) カウンタです。</p>



<p>それら 2 つのカウンタを接続した回路のシミュレーションを行ないます。</p>



<h3 class="wp-block-heading"><span id="toc3">回路記述</span></h3>



<p>回路は 2 つありますが、1 つのファイルにまとめて記述します。</p>



<code>
<ol start="1" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module SECONDS_COUNTER_8bit(</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;input wire CLK, RST,</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;output reg [7:0] Q</li>
<li style="background-color:#EEF;">);</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;reg [22:0] NUMBER_OF_CLOCKS;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;wire COUNT_ENABLE;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;parameter CLOCKS_PER_SECOND = 23'd5999999; // 6MHz</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>モジュール名、入出力ポート、内部信号、パラメータの宣言です。<br>出力 Q はカウンタの出力なので reg 型変数宣言、レンジを [7:0] とします。</p>



<p>内部信号 NUMBER_OF_CLOCKS はカウントしたクロックの数で、値を保持するために reg 型です。クロックは 6MHz、2 進数で 23 ビットになりますから、レンジは [22:0] 。パラメータ CLOCKS_PER_SECOND として、定数 23&#8217;d5999999 を代入しておきます。</p>



<div class="wp-block-cocoon-blocks-caption-box-1 caption-box block-box"><div class="caption-box-label block-box-label box-label fab-info-circle"><span class="caption-box-label-text block-box-label-text box-label-text">2 進数のビット数を求める</span></div><div class="caption-box-content block-box-content box-content">
<p>6000000 は、2 進数で何ビットですか？</p>



<pre class="wp-block-preformatted">2<sup>N</sup> = 6000000
N = log<sub>2</sub>(6000000)</pre>



<p>log<sub>2</sub> なんて計算できねぇ〜よ。んなときゃ底の変換公式を使いましょ。</p>



<pre class="wp-block-preformatted">N = log<sub>2</sub>(6000000) = log<sub>10</sub>(6000000) / log<sub>10</sub>(2) = 22.5 ≒ 23 ビット</pre>



<p>log<sub>10</sub> ならば、スマホの関数電卓でも簡単に計算できますね。</p>
</div></div>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<code>
<ol start="11" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">// 23bit counter element</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;always @(posedge CLK or negedge RST) begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;if(1'b0 == RST)</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUMBER_OF_CLOCKS &lt;= 23'd0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;else if(CLOCKS_PER_SECOND == NUMBER_OF_CLOCKS)</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUMBER_OF_CLOCKS &lt;= 23'd0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;else</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUMBER_OF_CLOCKS &lt;= NUMBER_OF_CLOCKS + 23'd1;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>6000000 進カウンタ、つまり 23bit カウンタです。ビット数が異なるだけで、これまでと同じです。</p>



<code>
<ol start="21" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">// Genaration of COUNT_ENABLE signal (Description of a carry)</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;assign COUNT_ENABLE = (CLOCKS_PER_SECOND == NUMBER_OF_CLOCKS);</li>
<li style="background-color:#EFF;"></li>
</ol></code>



<p>クロックのカウント数が 5999999 になったら COUNT_ENABLE を出力します。<br>これは、いわゆる桁上がり信号を出力する記述方法。() 内が真であれば 1 になる、ということです。</p>



<code>
<ol start="24" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EEF;">// 8bit counter element</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;always @(posedge CLK or negedge RST) begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;if (1'b0 == RST)</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q &lt;= 8'd0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;else if(1'b1 == COUNT_ENABLE)</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q &lt;= Q + 8'd1;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">endmodule</li>
</ol></code>



<p>イネーブル付き 8bit カウンタ。COUNT_ENABLE が 1 のとき、つまり、クロックのカウント数が 5999999 から 0 にもどるタイミングでカウントアップされます。</p>



<h3 class="wp-block-heading"><span id="toc4">テストベンチ</span></h3>



<p>さてと、テストベンチは、ちょっとてこずりました。</p>



<code>
<ol start="1" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">`timescale 1ns / 100ps</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>まず、コンパイラ指示子の「`<code>timescale」。ユニット時間をどれだけにするか、その精度はどれだけか。バッククォート (</code>`) で始まるので、注意。記述場所は、モジュールの中でも外でもいい、らしい。</p>



<p>6MHz の周期は 166.67ns なので、ユニット時間を 1ns にしてみた。で、精度？ 100ps なら小数点以下 2 位ってことになるんじゃないのかなと。クロックが 6MHz だとか、1秒毎にカウントするとか、時間の指定があるので、設定してみましたが、よくわかってない (；´Д｀)</p>



<code>
<ol start="3" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module SECONDS_COUNTER_8bit_TEST;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;reg CLK, RST;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;wire [7:0] Q;</li>
<li style="background-color:#EFF;"></li>
</ol></code>



<p>モジュール名、入出力信号の宣言。入力は変数宣言 reg、出力はネット宣言 wire とする。</p>



<code>
<ol start="8" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EEF;">&nbsp;&nbsp;parameter OSC_FREQUENCY = 6000000; // 6MHz</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;always begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;CLK = 0; #(500000000/OSC_FREQUENCY);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;CLK = 1; #(500000000/OSC_FREQUENCY);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>パラメータは、クロックの周期を与えるのが一般的なのかなぁ。でも、それだと 166.67 になってしまい、丸めた値だから誤差がでてしまう。そこで、周波数の 6000000 としました。<br>10~13 行目がクロックの作成。CLK を 0 にして半周期、1 にして半周期、を繰り返します。</p>



<code>
<ol start="15" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">&nbsp;&nbsp;SECONDS_COUNTER_8bit SECONDS_COUNTER_8bit(CLK, RST, Q);</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>検証対象回路のインスタンス化。<br>ちなみに、モジュール名とインスタンス名は同じでも問題ないです。</p>



<code>
<ol start="17" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;RST = 0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;repeat(OSC_FREQUENCY*0.5) @(posedge CLK);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;RST = 1;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;repeat(OSC_FREQUENCY*10) @(posedge CLK);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;RST = 0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;repeat(OSC_FREQUENCY*0.5) @(posedge CLK);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$finish;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>検証対象に入力を与えます。<br>initial は、シミュレーション開始後に 1 回だけ実行されます。が、いくつでも記述できるので、並行動作させることも可能。</p>



<p>repeat() は、# による遅延と同様のタイミング制御です。19 行目は、3000000 クロック待つ、つまり、0.5 秒間待つ、ということ。シミュレーション開始 0.5 秒後にカウント開始し、10 秒間動作してリセット、0.5 秒後にシミュレーション終了します。<br>動作時間が 10 秒では、8 ビットの出力を全部確認することができません。8 ビットカウンタを一周させるには、最低 256 秒必要です。が、じつは、時間が長いとシミュレーションの実行に長い時間がかかり、出力ファイルがバカでかくなってしまいます。30 秒ぐらいにするともう、パソコンも息絶え絶え (；´Д｀)</p>



<code>
<ol start="27" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpfile("counter_8bit_test.vcd");</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpvars(0, SECONDS_COUNTER_8bit_TEST);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">endmodule</li>
</ol></code>



<p>GTKWave に渡す VCD ファイルの出力。いつもと同じです。</p>



<h3 class="wp-block-heading"><span id="toc5">シミュレーション結果</span></h3>



<h4 class="wp-block-heading"><span id="toc6">10 秒間のシミュレーション</span></h4>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-full"><a href="https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_test1_959833.png"><img loading="lazy" decoding="async" width="840" height="855" src="https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_test1_959833.png" alt="" class="wp-image-5882" srcset="https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_test1_959833.png 840w, https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_test1_959833-295x300.png 295w, https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_test1_959833-768x782.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></a><figcaption class="wp-element-caption">図 2. クロック同期回路のシミュレーション波形 (1)</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>図 2 が、シミュレーション結果です。</p>



<p>が、ここまでくるのも、なかなか大変でした。<br>ひとつには、まぁ毎度のことですが、コンパイルエラーの嵐。だいたいが syntax error なので、ひとつひとつ確認していけば止まります。スペルの間違いもあるけど、カンマ (,) とかセミコロン (;) が抜けてるとか、バッククォート (`) がシングルクォート (&#8216;) になってた、とか、ね。</p>



<p>動作時間を長くとってしまって、いつまで待ってもシミュレーションが終わらない。時間を短くして、やっと終わったと思ったら、こんどは GTKWave の読み込みに時間がかかる。動いたと思ったら、パソコンがプチハングアップ状態 (；´Д｀)</p>
</div>
</div>



<p>ようやく波形がみられるようになったら、なんだか結果がおかしい。なんだろうと悩むこと一晩。ノンブロッキング代入にしないといけないところが、ブロッキング代入になっていた。ふぅ。</p>



<p>実回路を組んでも、うまく動作しなくて悩むことはままあります。パソコン上のシミュレーションでも、同じですなぁ。あまくはないです。</p>



<p>CLK を拡大すると周期は 167ns ほどになっています。開始から 500ms で RST が立ち上がり、NUMBER_OF_CLOCKS が 5999999 になったとき COUNT_ENABLE が 1 になります。次のクロックで NUMBER_OF_CLOCKS が 0 にもどり、Q が 1 になる。ちなみに、このときの時間スケールは 1493999.75μs ほど。これは誤差がありますが、しかたがないです。<br>その後も、NUMBER_OF_CLOCKS が 5999999 から 0 にもどるときに、Q がカウントアップしています。10 秒間の動作は、想定通りです。</p>



<h4 class="wp-block-heading"><span id="toc7">クロックを 6KHz にしてシミュレーション</span></h4>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-full"><a href="https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_test2_959833.png"><img loading="lazy" decoding="async" width="840" height="855" src="https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_test2_959833.png" alt="" class="wp-image-5888" srcset="https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_test2_959833.png 840w, https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_test2_959833-295x300.png 295w, https://meyon.gonna.jp/study/wp-content/uploads/counter_8bit_test2_959833-768x782.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></a><figcaption class="wp-element-caption">図 3. クロック同期回路のシミュレーション (2)</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>6000000 進カウンタは正常に動作しています。では、8bit カウンタはどうでしょうか。CLOCK を 6KHz に落としてシミュレーションしてみました。</p>



<p>図 3 は、8bit カウンタが 0xFF までカウントして 0x00 にもどる部分です。<br>開始から約 256.5 秒で、COUNT_ENABLE が出力され、Q が 0xFF から 0x00 に戻っています。それまでの動作も、想定通りです。<br>8bit カウンタも問題ないと判断しました。</p>
</div>
</div>



<h2 class="wp-block-heading"><span id="toc8">後記</span></h2>



<p>部分的に、また、条件を変更して、なんとかシミュレーションできたかなぁってところです。一筋縄ではいかないと、わかりました。</p>



<p>きっと、もっとうまくやる方法があるんだろうと、思ってます。いろいろやっていくなかで、そうしたうまい方法がみつかればうれしいのですが。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>VerilogHDL ブロッキング代入とノンブロッキング代入</title>
		<link>https://meyon.gonna.jp/study/electronic/5755/</link>
		
		<dc:creator><![CDATA[meyon230]]></dc:creator>
		<pubDate>Wed, 23 Nov 2022 05:57:09 +0000</pubDate>
				<category><![CDATA[VerilogHDL]]></category>
		<category><![CDATA[電子工作]]></category>
		<guid isPermaLink="false">http://meyon.gonna.jp/study/?p=5755</guid>

					<description><![CDATA[次の例題は、ブロッキング代入とノンブロッキング代入の動作の違いを調べろ、というもの。 【問題8】 ブロッキング代入とノン・ブロッキング代入「10進カウンタ」と「7セグメントLEDデコーダ」の接続を例に、大規模回路などの設 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>次の例題は、ブロッキング代入とノンブロッキング代入の動作の違いを調べろ、というもの。</p>




<a rel="noopener" target="_blank" href="https://monoist.itmedia.co.jp/mn/articles/0810/23/news129.html" title="【問題8】 ブロッキング代入とノン・ブロッキング代入" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://image.itmedia.co.jp/mn/articles/0810/23/ay_dr03_08_ans01.gif" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【問題8】 ブロッキング代入とノン・ブロッキング代入</div><div class="blogcard-snippet external-blogcard-snippet">「10進カウンタ」と「7セグメントLEDデコーダ」の接続を例に、大規模回路などの設計に用いられる“モジュール階層構造”について解説。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://monoist.itmedia.co.jp/mn/articles/0810/23/news129.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">monoist.itmedia.co.jp</div></div></div></div></a>



<p>「=」がブロッキング代入で、「&lt;=」がノンブロッキング代入。小なりイコール、ではない (；´Д｀)</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ブロッキング代入とノンブロッキング代入</a><ol><li><a href="#toc2" tabindex="0">回路記述</a></li><li><a href="#toc3" tabindex="0">テストベンチ</a></li><li><a href="#toc4" tabindex="0">シミュレーション結果</a><ol><li><a href="#toc5" tabindex="0">ブロッキング代入</a></li><li><a href="#toc6" tabindex="0">ノンブロッキング代入</a></li></ol></li><li><a href="#toc7" tabindex="0">どちらの代入を使う？</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ブロッキング代入とノンブロッキング代入</span></h2>



<p>ブロッキング代入「=」は、上から順番に実行される。ノンブロッキング代入「&lt;=」は、同時に実行される。<br>組み合わせ回路では、信号は各ゲートを順にとおってくる。順序回路では、クロックがはいると一斉に信号が走る。だからあれよ、シフトレジスタで、クロックがはいると各段のデータが一斉にシフトする、って。ノンブロッキングって、そんな感じ。</p>



<h3 class="wp-block-heading"><span id="toc2">回路記述</span></h3>



<p>ブロッキング代入の回路と、ノンブロッキング代入の回路を用意しました。</p>



<div class="wp-block-cocoon-blocks-caption-box-1 caption-box block-box"><div class="caption-box-label block-box-label box-label"><span class="caption-box-label-text block-box-label-text box-label-text">ブロッキング代入</span></div><div class="caption-box-content block-box-content box-content">
<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module DFF(</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;input wire CLK, D,</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;output reg X, Y, Z</li>
<li style="background-color:#EEF;">);</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;always @(posedge CLK) begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;X = D;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;Y = X;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;Z = Y;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">endmodule</li>
</ol></code>
</div></div>



<div class="wp-block-cocoon-blocks-caption-box-1 caption-box block-box"><div class="caption-box-label block-box-label box-label"><span class="caption-box-label-text block-box-label-text box-label-text">ノンブロッキング代入</span></div><div class="caption-box-content block-box-content box-content">
<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module DFF(</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;input wire CLK, D,</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;output reg X, Y, Z</li>
<li style="background-color:#EEF;">);</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;always @(posedge CLK) begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;X &lt;= D;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;Y &lt;= X;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;Z &lt;= Y;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">endmodule</li>
</ol></code>
</div></div>



<p>違いは、7~9 行目。<br>たとえば、D=1、X=0、Y=0、Z=0 としたとき、ブロッキング代入では、</p>



<pre class="wp-block-preformatted">X = D = 1 → Y = X = 1 → Z = Y = 1</pre>



<p>と、すべて 1 になる。<br>対して、ノンブロッキング代入では並列に処理するので、</p>



<pre class="wp-block-preformatted">X &lt;= D = 1
Y &lt;= X = 0
Z &lt;= Y = 0</pre>



<p>となり、Y、Z の値は変化しない。</p>



<h3 class="wp-block-heading"><span id="toc3">テストベンチ</span></h3>



<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module DFF_TEST;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;reg CLK, D;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;wire X, Y, Z;</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;parameter CYCLE = 10;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;integer i;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;DFF DFF(CLK, D, X, Y, Z);</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;always begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;CLK = 0; #(CYCLE/2);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;CLK = 1; #(CYCLE/2);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i&lt;3; i=i+1) begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D = 0; #(CYCLE*5);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D = 1; #(CYCLE*3);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;D = 0; #(CYCLE*3);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$finish;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpfile("dff_test.vcd");</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpvars(0, DFF_TEST);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">endmodule</li>
</ol></code>



<p>D を印加する部分を for() 文にしてみました。まぁ、これぐらいの処理はべたに書いたほうがよいと思います。ここは、お勉強。</p>



<h3 class="wp-block-heading"><span id="toc4">シミュレーション結果</span></h3>



<h4 class="wp-block-heading"><span id="toc5">ブロッキング代入</span></h4>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-full"><a href="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_blk_372809.png"><img loading="lazy" decoding="async" width="840" height="855" src="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_blk_372809.png" alt="" class="wp-image-5759" srcset="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_blk_372809.png 840w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_blk_372809-295x300.png 295w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_blk_372809-768x782.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></a><figcaption class="wp-element-caption">図 1 ブロッキング代入のシミュレーション波形</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>ブロッキング代入では、入力 D にしたがって、全部の出力が変化します。</p>



<p>回路にすると、こんな感じかな。あ、これ論理合成とかじゃなくて、自分で考えただけだから、間違ってるかも。</p>



<figure class="wp-block-image aligncenter size-medium"><img loading="lazy" decoding="async" width="292" height="300" src="https://meyon.gonna.jp/study/wp-content/uploads/circuit_blocking_372809-292x300.png" alt="" class="wp-image-5808" srcset="https://meyon.gonna.jp/study/wp-content/uploads/circuit_blocking_372809-292x300.png 292w, https://meyon.gonna.jp/study/wp-content/uploads/circuit_blocking_372809.png 451w" sizes="(max-width: 292px) 100vw, 292px" /></figure>
</div>
</div>



<h4 class="wp-block-heading"><span id="toc6">ノンブロッキング代入</span></h4>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-full"><a href="https://meyon.gonna.jp/study/wp-content/uploads/twinwavw_nonblk_372809.png"><img loading="lazy" decoding="async" width="840" height="855" src="https://meyon.gonna.jp/study/wp-content/uploads/twinwavw_nonblk_372809.png" alt="" class="wp-image-5758" srcset="https://meyon.gonna.jp/study/wp-content/uploads/twinwavw_nonblk_372809.png 840w, https://meyon.gonna.jp/study/wp-content/uploads/twinwavw_nonblk_372809-295x300.png 295w, https://meyon.gonna.jp/study/wp-content/uploads/twinwavw_nonblk_372809-768x782.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></a></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>ノンブロッキング代入では、クロックにしたがって一斉に信号が動くので、出力がシフトレジスタのようになります。</p>



<p>シフトレジスタだから、こんな回路。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="670" height="191" src="https://meyon.gonna.jp/study/wp-content/uploads/circuit_nonblocking_372809.png" alt="" class="wp-image-5812" srcset="https://meyon.gonna.jp/study/wp-content/uploads/circuit_nonblocking_372809.png 670w, https://meyon.gonna.jp/study/wp-content/uploads/circuit_nonblocking_372809-300x86.png 300w" sizes="(max-width: 670px) 100vw, 670px" /></figure>



<p>D=1、X=0 とすると、クロックが入って回路の遅延時間後に X=1 になる。クロックが入ったときはまだ X=0 なので、2段目の入力は 0。つぎのクロックのときには X=1 になっている。<br>シフトレジスタの動作のしくみですね。</p>
</div>
</div>



<h3 class="wp-block-heading"><span id="toc7">どちらの代入を使う？</span></h3>



<p>むずかしいことは言わない。</p>



<ol class="wp-block-list">
<li>混ぜて使わない</li>



<li>組み合わせ回路 (assign) では「=」ブロッキング代入</li>



<li>順序回路 (always) では「&lt;=」ノンブロッキング代入</li>



<li>テストベンチでは「=」ブロッキング代入</li>
</ol>



<p>それだけを守ってれば、よさそう。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>VerilogHDL 接続された回路のシミュレーション</title>
		<link>https://meyon.gonna.jp/study/electronic/5730/</link>
		
		<dc:creator><![CDATA[meyon230]]></dc:creator>
		<pubDate>Tue, 22 Nov 2022 05:54:15 +0000</pubDate>
				<category><![CDATA[VerilogHDL]]></category>
		<category><![CDATA[電子工作]]></category>
		<guid isPermaLink="false">http://meyon.gonna.jp/study/?p=5730</guid>

					<description><![CDATA[だんだんむずかしくなってきましたが、がんばっていきましょう。今回は、モジュールを接続してみよう、という問題です。 【問題7】 モジュールを接続してみよう！Verilog HDLで組み合わせ回路を記述するには？ 今回は“関 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>だんだんむずかしくなってきましたが、がんばっていきましょう。今回は、モジュールを接続してみよう、という問題です。</p>




<a rel="noopener" target="_blank" href="https://monoist.itmedia.co.jp/mn/articles/0810/16/news134.html" title="【問題7】 モジュールを接続してみよう！" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://image.itmedia.co.jp/mn/articles/0810/16/l_ay_dr3_07_fig01.gif" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【問題7】 モジュールを接続してみよう！</div><div class="blogcard-snippet external-blogcard-snippet">Verilog HDLで組み合わせ回路を記述するには？ 今回は“関数”を用いる方法と、“always文”を用いる方法の2パターンを詳しく解説。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://monoist.itmedia.co.jp/mn/articles/0810/16/news134.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">monoist.itmedia.co.jp</div></div></div></div></a>



<p>問題が求めているものは、10 進カウンタのモジュールと 7 セグメント LED デコーダのモジュールとを接続したモジュールをつくれ、ということです。なので解答は、2 つのモジュールをそれぞれつくり、さらに上位のモジュールをつくって、上位のモジュールのなかで 2 つのモジュールをインスタンス化する、ということになります。<br>それは、たとえば Arduino のスケッチならば、ライブラリをインスタンス化して利用することと、似たような感じなのだと思います。</p>



<p>で、逆らっちゃうのですが、Arduino のスケッチで C++ クラスを使うとき、俺はスケッチを分割せずに書いてるわけで。それほど大きなスケッチ書くこともないし、そのほうが見通しがいいもんだから。おなじように、VerilogHDL でも、当面は 1 つのモジュールに全部の回路を書いちゃおうと思います。<br>そのうち、必要を感じたら、分割して記述することもあるでしょう。たぶん。</p>



<p>ちなみに、テストベンチも回路と一緒に書けるそうです。でも、これはさすがに、目的が違うだろうって感じるので、これまで同様に分けておきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">接続された回路をシミュレーションする</a><ol><li><a href="#toc2" tabindex="0">回路記述</a></li><li><a href="#toc3" tabindex="0">テストベンチ</a></li><li><a href="#toc4" tabindex="0">シミュレーション結果</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">接続された回路をシミュレーションする</span></h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:50%">
<p></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="542" height="142" src="https://meyon.gonna.jp/study/wp-content/uploads/image_980921.png" alt="" class="wp-image-5733" srcset="https://meyon.gonna.jp/study/wp-content/uploads/image_980921.png 542w, https://meyon.gonna.jp/study/wp-content/uploads/image_980921-300x79.png 300w" sizes="(max-width: 542px) 100vw, 542px" /><figcaption class="wp-element-caption">図 1 接続された回路</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:50%">
<p>ということで、タイトルが微妙に異なる (^_^;)</p>



<p>CLOCK をカウントし、7 セグメント LED に表示させる回路のシミュレーションをします。</p>



<p>CLOCK の立ち上がりエッジでカウントアップ。7 セグメント LED は HIGH で点灯、出力ビットはセグメント a が MSB、セグメント g が LSB で、ドットは使わない。<br>RESET はアクティブローです。</p>
</div>
</div>



<h3 class="wp-block-heading"><span id="toc2">回路記述</span></h3>



<p>前述したように、1 つのモジュールに回路を記述します。</p>



<code>
<ol start="1" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module COUNTER_7SEG (</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;input wire CLOCK, RESET,</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;output wire [6:0] OUTPUT</li>
<li style="background-color:#EEF;">);</li>
<li style="background-color:#EFF;"></li>
</ol></code>



<p>モジュール名とポートリスト。信号の宣言も () 内でやっています。CLOCK と RESET はネット宣言の 1 ビット入力。OUTPUT はネット宣言の 7 ビット出力。</p>



<code>
<ol start="6" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EEF;">&nbsp;&nbsp;reg [3:0] COUNTER_OUTPUT;</li>
<li style="background-color:#EFF;"></li>
</ol></code>



<p>内部で使う信号の宣言。10 進カウンタの出力なので、変数宣言しています。4 ビットです。</p>



<code>
<ol start="8" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EEF;">&nbsp;&nbsp;always @(posedge CLOCK) begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;if(1'b0 == RESET)</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNTER_OUTPUT = 4'd0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;else if(4'd9 == COUNTER_OUTPUT)</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNTER_OUTPUT = 4'd0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;else</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNTER_OUTPUT = COUNTER_OUTPUT + 4'd1;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>10 進カウンタの構成要素。always による順序回路です。RESET が 0 のときと、9 のときに、0 に戻す、それ以外はカウントアップ。RESET は同期。<br>順序回路のときはノンブロッキング代入にすべきなのかもしれないですが、まだ学習してないので、ブロッキング代入になってる。ここでは、どっちでも影響ないんじゃないのかな。<br>always 内の処理が if 文ひとつだけなので、begin~end はなくてもいいそうです。が、ちゃんと形を整えておくのが吉。</p>



<code>
<ol start="17" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">&nbsp;&nbsp;function [6:0] DECODER(</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;input [3:0] DECODER_INPUT</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case(DECODER_INPUT)</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd0: DECODER = 7'b1111110;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd1: DECODER = 7'b0110000;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd2: DECODER = 7'b1101101;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd3: DECODER = 7'b1111001;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd4: DECODER = 7'b0110011;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd5: DECODER = 7'b1011011;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd6: DECODER = 7'b0011111;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd7: DECODER = 7'b1110000;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd8: DECODER = 7'b1111111;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd9: DECODER = 7'b1110011;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default: DECODER = 7'b0000000;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endcase</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;endfunction</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>7 セグメント LED デコーダの構成要素。function による組み合わせ回路です。DECODER_INPUT が入力として宣言されています。<br>ここも、function 内の処理が case 文ひとつだけなので、begin~end はなくてもいい。が、ちゃんと形を整えておくのが吉。</p>



<code>
<ol start="37" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">&nbsp;&nbsp;assign OUTPUT = DECODER(COUNTER_OUTPUT);</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">endmodule</li>
</ol></code>



<p>function は呼び出して初めて仕事する。assign で DECODER() を呼び出して、OUTPUT に代入しています。<br>最後は endmodule で締めくくる、と。</p>



<h3 class="wp-block-heading"><span id="toc3">テストベンチ</span></h3>



<p>テストベンチファイルです。</p>



<code>
<ol start="1" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module COUNTER_7SEG_TEST;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;reg CLOCK, RESET;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;wire [6:0] OUTPUT;</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;parameter CYCLE = 10;</li>
<li style="background-color:#EFF;"></li>
</ol></code>



<p>モジュール名、入力と出力の宣言。パラメータはクロックの周期。</p>



<code>
<ol start="8" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EEF;">&nbsp;&nbsp;COUNTER_7SEG COUNTER_7SEG(CLOCK, RESET, OUTPUT);</li>
<li style="background-color:#EFF;"></li>
</ol></code>



<p>対象回路のインスタンス化。</p>



<code>
<ol start="10" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EEF;">&nbsp;&nbsp;always begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;CLOCK = 0;  #(CYCLE/2);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;CLOCK = 1;  #(CYCLE/2);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
</ol></code>



<p>クロックの生成。</p>



<code>
<ol start="15" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RESET = 0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;#33&nbsp;&nbsp;&nbsp;RESET = 1;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;#133&nbsp;&nbsp;RESET = 0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;#30&nbsp;&nbsp;&nbsp;$finish;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
</ol></code>



<p>入力の印加。33 ユニット時間経過したら、カウントアップを開始する。133 ユニット時間カウントして、リセット。</p>



<code>
<ol start="22" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EEF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpfile("counter_7seg.vcd");</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpvars(0, COUNTER_7SEG_TEST);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">endmodule</li>
</ol></code>



<p>VCD ファイル出力。<br>$dumpvars は、VCD ファイルに出力する対象です。数字は階層レベルで、0 は全階層の全変数の意。</p>



<h3 class="wp-block-heading"><span id="toc4">シミュレーション結果</span></h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-large"><a href="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_980921.png"><img loading="lazy" decoding="async" width="1024" height="579" src="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_980921-1024x579.png" alt="" class="wp-image-5734" srcset="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_980921-1024x579.png 1024w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_980921-300x170.png 300w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_980921-768x434.png 768w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_980921-120x68.png 120w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_980921-160x90.png 160w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_980921-320x180.png 320w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_980921-374x210.png 374w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_980921.png 1513w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">図 2 接続された回路のシミュレーション波形</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>まぁ、想定通りってことで。</p>



<p>カウントイネーブルつけたら、最後がリセットじゃなくて、4 を保持できるよなぁ、とか。<br>出力をみながらいろいろ考えちゃうようになってきたのは、少しばかり VerilogHDL が使えるようになってきた、ってことかしらん (^_^;)</p>
</div>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>VerilogHDL 7セグメントデコーダのシミュレーション</title>
		<link>https://meyon.gonna.jp/study/electronic/5708/</link>
		
		<dc:creator><![CDATA[meyon230]]></dc:creator>
		<pubDate>Mon, 21 Nov 2022 01:29:16 +0000</pubDate>
				<category><![CDATA[VerilogHDL]]></category>
		<category><![CDATA[電子工作]]></category>
		<guid isPermaLink="false">http://meyon.gonna.jp/study/?p=5708</guid>

					<description><![CDATA[引き続き、例題をシミュレーションしてみましょう。今回は、これ。 【問題6】 7セグメントLEDデコーダを作成しよう今回は、Verilog HDLで記述された10進カウンタの“テスト・ベンチ”を作成し、シミュレーションと波 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>引き続き、例題をシミュレーションしてみましょう。今回は、これ。</p>




<a rel="noopener" target="_blank" href="https://monoist.itmedia.co.jp/mn/articles/0810/09/news118.html" title="【問題6】 7セグメントLEDデコーダを作成しよう" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://image.itmedia.co.jp/mn/articles/0810/09/ay_dr03_06_ans01.gif" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【問題6】 7セグメントLEDデコーダを作成しよう</div><div class="blogcard-snippet external-blogcard-snippet">今回は、Verilog HDLで記述された10進カウンタの“テスト・ベンチ”を作成し、シミュレーションと波形表示にチャレンジする。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://monoist.itmedia.co.jp/mn/articles/0810/09/news118.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">monoist.itmedia.co.jp</div></div></div></div></a>



<p>えーと、記述のお作法ってゆーか、VerilogHDL の記述って新旧いろいろあるらしい。これまでの記述も間違いじゃなくて、そんなふうにも書けます、ってところかな。どれが新しいのか、どれが一般的なのか、ちょっとよくわかんないんですけど、気づいたところは変更していこうかなと思ってます。<br>んなわけで、これまでと違う記述がでてきますが、いちいち説明しませんので、あしからず。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">7 セグメント LED デコーダをシミュレーションする</a><ol><li><a href="#toc2" tabindex="0">always による組み合わせ回路の記述</a></li><li><a href="#toc3" tabindex="0">function による組み合わせ回路の記述</a></li><li><a href="#toc4" tabindex="0">テストベンチ</a></li><li><a href="#toc5" tabindex="0">シミュレーション結果</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">7 セグメント LED デコーダをシミュレーションする</span></h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<p></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="275" height="207" src="https://meyon.gonna.jp/study/wp-content/uploads/image_649072.png" alt="" class="wp-image-5710"/><figcaption class="wp-element-caption">図 1 7セグメントLEDデコーダ</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>問題は図 1 のようになっています。</p>



<p>逆らうわけじゃないですが、どうせやるなら、いつも使っている TC4511 を倣いたいと思います。なので、DP は考慮しません。出力は TC4511 の真理値表に従います。<span style="text-decoration: overline;">BI</span> などの制御入力は、なしです。</p>



<p>問題の解説にもありますが、回路の記述には 2 とおりのやりかたがあります。ひとつは always による組み合わせ回路の記述、もうひとつは function による組み合わせ回路の記述、です。</p>
</div>
</div>



<h3 class="wp-block-heading"><span id="toc2">always による組み合わせ回路の記述</span></h3>



<p>まずは、理解しやすかった always による組み合わせ回路の記述。</p>



<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module DECODER_7SEGMENT (</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;input wire [3:0] DATA_INPUT,</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;output reg [6:0] DATA_OUTPUT</li>
<li style="background-color:#EEF;">);</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">always @*</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;case (DATA_INPUT)</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd0: DATA_OUTPUT = 7'b1111110;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd1: DATA_OUTPUT = 7'b0110000;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd2: DATA_OUTPUT = 7'b1101101;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd3: DATA_OUTPUT = 7'b1111001;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd4: DATA_OUTPUT = 7'b0110011;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd5: DATA_OUTPUT = 7'b1011011;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd6: DATA_OUTPUT = 7'b0011111;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd7: DATA_OUTPUT = 7'b1110000;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd8: DATA_OUTPUT = 7'b1111111;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd9: DATA_OUTPUT = 7'b1110011;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default: DATA_OUTPUT = 7'b0000000;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;endcase</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">endmodule</li>
</ol></code>



<p></p>



<p>3 行目。always を使うばあい、出力信号は reg で変数宣言します。<br>6 行目。always は、カウンタのシミュレーションでも使いましたが、@ の信号が変化した時に実行されて、無限にループします。@* とは、入力のいずれかが変化したら、という意味。ここでは、入力 DATA_INPUT が変化したら begin~end を実行、always へ戻り、信号の変化を待つ、ということになります。</p>



<p>8~20 行。おなじみの case 文。たとえば DATA_INPUT が 0 だったら、0b1111110 を出力する。これは、セグメント a~f が点灯、g が消灯の意。10 以上のときは全消灯。<br>なお、ケースが一致したら case 文を抜けます。同じケースがあったら、上の記述が優先される。C 言語とちょっと違いますね。</p>



<p>ちなみに、出力を不定にしたければ、7&#8217;bx とします。ビット列が長くてみづらければ、7&#8217;b111_1110 とか、書いてもいいらしい。</p>



<h3 class="wp-block-heading"><span id="toc3">function による組み合わせ回路の記述</span></h3>



<p>function とは、関数のこと。論理式で簡単に記述できないデーコーダなどの回路は、関数にするってことね。</p>



<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module DECODER_7SEGMENT (</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;input wire [3:0] DATA_INPUT,</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;output wire [6:0] DATA_OUTPUT</li>
<li style="background-color:#EEF;">);</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">function [6:0] DECDR (</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;input [3:0] DECDR_INPUT</li>
<li style="background-color:#EEF;">);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;case (DECDR_INPUT)</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd0: DECDR = 7'b1111110;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd1: DECDR = 7'b0110000;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd2: DECDR = 7'b1101101;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd3: DECDR = 7'b1111001;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd4: DECDR = 7'b0110011;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd5: DECDR = 7'b1011011;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd6: DECDR = 7'b0011111;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd7: DECDR = 7'b1110000;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd8: DECDR = 7'b1111111;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4'd9: DECDR = 7'b1110011;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default: DECDR = 7'b0000000;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;endcase</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;">endfunction</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">assign DATA_OUTPUT = DECDR(DATA_INPUT);</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">endmodule</li>
</ol></code>



<p></p>



<p>6~8 行目が、function の記述。DECDR_INPUT は引数で、関数名そのものが戻り値になる、みたいな。function の中身は、always と同様の case 文です。<br>26 行目。assign で function を呼び出す。なので、出力信号は wire でネット宣言する (3 行目)。</p>



<h3 class="wp-block-heading"><span id="toc4">テストベンチ</span></h3>



<p>テストベンチファイルです。</p>



<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module DECODER_7SEGMENT_TEST;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">reg [3:0] DATA_INPUT;</li>
<li style="background-color:#EEF;">wire [6:0] DATA_OUTPUT;</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">parameter STEP = 10;</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">DECODER_7SEGMENT DEC0(DATA_INPUT, DATA_OUTPUT);</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">initial begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATA_INPUT = 4'd0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd1;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd2;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd3;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd4;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd5;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd6;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd7;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd8;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd9;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd10;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd11;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd12;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd13;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd14;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;#STEP DATA_INPUT = 4'd15;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;#STEP $finish;</li>
<li style="background-color:#EEF;">end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">initial begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;$monitor("input = %d, output = %b", DATA_INPUT, DATA_OUTPUT);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;$dumpfile("dec_7seg_test.vcd");</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;$dumpvars(0, DECODER_7SEGMENT_TEST);</li>
<li style="background-color:#EEF;">end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">endmodule</li>
</ol></code>



<p></p>



<p>6 行目。遅延時間をパラメータ宣言にしてみました。<br>その他、これまでと同様です (^_^;)</p>



<h3 class="wp-block-heading"><span id="toc5">シミュレーション結果</span></h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-large"><a href="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_649072.png"><img loading="lazy" decoding="async" width="1024" height="702" src="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_649072-1024x702.png" alt="" class="wp-image-5716" srcset="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_649072-1024x702.png 1024w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_649072-300x206.png 300w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_649072-768x526.png 768w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_649072.png 1248w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">図 2 7セグメントLEDデコーダ シミュレーション波形</figcaption></figure>



<p></p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>図 2 が、シミュレーション波形です。</p>



<p>入力 0~15 に対して、表示に応じたセグメントデータが出力されています。</p>



<p>んー、それ以上でもそれ以下でもない (；´Д｀)</p>
</div>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>VerilogHDL 4ビットカウンタのシミュレーション</title>
		<link>https://meyon.gonna.jp/study/electronic/5679/</link>
		
		<dc:creator><![CDATA[meyon230]]></dc:creator>
		<pubDate>Sun, 20 Nov 2022 03:36:50 +0000</pubDate>
				<category><![CDATA[VerilogHDL]]></category>
		<category><![CDATA[電子工作]]></category>
		<guid isPermaLink="false">http://meyon.gonna.jp/study/?p=5679</guid>

					<description><![CDATA[少しづつですが、なんだか、わかってきましたね (^_^;)　今回は、この問題をやってみます。 【問題4】 always文でカウンタを作ろうVerilog HDLで記述したOR回路をFPGAボードで動作させたところ、なぜか [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>少しづつですが、なんだか、わかってきましたね (^_^;)　今回は、この問題をやってみます。</p>




<a rel="noopener" target="_blank" href="https://monoist.itmedia.co.jp/mn/articles/0809/25/news156.html" title="【問題4】 always文でカウンタを作ろう" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://image.itmedia.co.jp/mn/articles/0809/25/ay_dr03_04_fig01.gif" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【問題4】 always文でカウンタを作ろう</div><div class="blogcard-snippet external-blogcard-snippet">Verilog HDLで記述したOR回路をFPGAボードで動作させたところ、なぜかANDで動作した……。その原因について詳しく解説する。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://monoist.itmedia.co.jp/mn/articles/0809/25/news156.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">monoist.itmedia.co.jp</div></div></div></div></a>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">4 ビットカウンタをシミュレーションする</a><ol><li><a href="#toc2" tabindex="0">回路記述</a></li><li><a href="#toc3" tabindex="0">テストベンチ</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">4 ビットカウンタをシミュレーションする</span></h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<p></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="196" height="94" src="https://meyon.gonna.jp/study/wp-content/uploads/image_212439.png" alt="" class="wp-image-5681"/><figcaption class="wp-element-caption">図 1 4ビットカウンタ</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>4 ビットカウンタは、クロックをカウントして 4 ビットの値を出力する、順序回路です。<a href="https://meyon.gonna.jp/study/electronic/5056/">過去記事</a>で、じっさいにつくりましたね。</p>



<p>図 1 のブロック図、クロック CLK は立ち上がりエッジでカウントするという表示になっています。RES はリセットですが、◯ がついているので、アクティブロー (0 でリセットされる) とします。</p>
</div>
</div>



<h3 class="wp-block-heading"><span id="toc2">回路記述</span></h3>



<p>回路をつくりましょう。</p>



<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module counter_4bit(CLK, RES, Q);</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;input CLK, RES;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;output [3:0] Q;</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;wire CLK, RES;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;reg [3:0] Q;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;always @(posedge CLK) begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;if(RES == 1'b0)</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q = 4'd0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;else</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q = Q + 4'd1;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">endmodule</li>
</ol></code>



<p></p>



<p>9 行目。組み合わせ回路では assign でしたが、順序回路では always を使います。posedge は CLK の立ち上がりエッジを意味します。立ち下がりエッジは negedge です。<br>7 行目。always を使う場合、出力信号は reg として「変数宣言」します。wire は「ネット宣言」といいます。変数は値を記憶する、ネットは信号を流す、ってことなのかな。<br>10~13 行目は if 文。1&#8217;b0 は定数で、サイズが 1 ビットの 2 進数で 0b0 です。RES が 0 なら、Q を 4&#8217;d0、つまりサイズが 4 ビットの 10 進数で 0 にする。つまり、リセットする。esle ならば、Q をカウントアップする。<br>ちなみに、定数のサイズを指定しないと 32 ビットになります。そうだ、前回、for() 文のループ変数 i を integer で宣言したけど、これも 32 ビットです。</p>



<p>なお、CLK の立ち上がりエッジだけで動作するので、リセットも CLK に同期します。<br>非同期リセットにするときは、</p>



<code>
<ol start="9" style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">&nbsp;&nbsp;always @(posedge CLK, negedge RES) begin</li>
</ol></code>



<p></p>



<p>とします。RES の立ち下がりエッジで、非同期リセットされます。</p>



<h3 class="wp-block-heading"><span id="toc3">テストベンチ</span></h3>



<p>テストベンチファイルです。</p>



<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module counter_4bit_test;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;reg CLK, RES;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;wire [3:0] Q;</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;counter_4bit ctr0(CLK, RES, Q);</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;always begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;#5 CLK = ~CLK;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLK = 0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RES = 0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;#30   RES = 1;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;#200  RES = 0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;#30   RES = 1;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;#50   $finish;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$monitor("CLK = %d RES = %d Q = %d", CLK, RES, Q);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpfile("counter_4bit.vcd");</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpvars(0, counter_4bit_test);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">endmodule</li>
</ol></code>



<p></p>



<p>8~10 行目。クロック CLK を always で発生させます。5 ユニット時間ごとに反転させる、ってことは、周期が 10 ユニット時間のクロックになる。<br>12~19 行目が、入力信号。RES を 1 にするとカウントスタート、0 にするとリセット。</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-full"><a href="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_827530.png"><img loading="lazy" decoding="async" width="840" height="855" src="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_827530.png" alt="" class="wp-image-5698" srcset="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_827530.png 840w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_827530-295x300.png 295w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_827530-768x782.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></a><figcaption class="wp-element-caption">図 2 4ビットカウンタのシミュレーション波形</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>図 2 が、シミュレーション波形です。</p>



<p>RES が 1 のときに、カウントアップし、0xF までカウントしたら 0 に戻る 16 進カウンタです。RES が 0 になると、CLK に同期して 0 になっています。</p>
</div>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>VerilogHDL 4ビット加算器のシミュレーション</title>
		<link>https://meyon.gonna.jp/study/electronic/5653/</link>
		
		<dc:creator><![CDATA[meyon230]]></dc:creator>
		<pubDate>Sat, 19 Nov 2022 02:17:34 +0000</pubDate>
				<category><![CDATA[VerilogHDL]]></category>
		<category><![CDATA[電子工作]]></category>
		<guid isPermaLink="false">http://meyon.gonna.jp/study/?p=5653</guid>

					<description><![CDATA[2つ目の例題です。 【問題2】 4ビット加算器をVerilog HDLで記述しよう今回は、Verilog HDLの記述スタイルについて解説。回路は“モジュール”の枠に収めて定義し、信号は“ポート”として定義する。mono [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>2つ目の例題です。</p>




<a rel="noopener" target="_blank" href="https://monoist.itmedia.co.jp/mn/articles/0809/11/news145.html" title="【問題2】 4ビット加算器をVerilog HDLで記述しよう" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://image.itmedia.co.jp/mn/articles/0809/11/ay_dr03_02_ans01.gif" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【問題2】 4ビット加算器をVerilog HDLで記述しよう</div><div class="blogcard-snippet external-blogcard-snippet">今回は、Verilog HDLの記述スタイルについて解説。回路は“モジュール”の枠に収めて定義し、信号は“ポート”として定義する。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://monoist.itmedia.co.jp/mn/articles/0809/11/news145.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">monoist.itmedia.co.jp</div></div></div></div></a>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">4 ビット加算器をシミュレーションする</a><ol><li><a href="#toc2" tabindex="0">回路記述</a></li><li><a href="#toc3" tabindex="0">テストベンチ</a></li><li><a href="#toc4" tabindex="0">シミュレーション結果</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">4 ビット加算器をシミュレーションする</span></h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<p></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="295" height="180" src="https://meyon.gonna.jp/study/wp-content/uploads/image_662533.png" alt="" class="wp-image-5654"/><figcaption class="wp-element-caption">図 1 4ビット加算器</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>図 1 に示す、4 ビット加算器のシミュレーションをしましょう。</p>



<p>論理回路のおさらいに、加算器はまだ登場してませんけど、むずかしいもんじゃないです。4 ビット加算器なら、4 ビットのデータ A と B を足し算するだけ。桁上がりすると carry (1 ビット) が出力される。<br>あー、でも、ロジック IC で 4 ビット加算器をつくるのは、それなりに大変、か (；´Д｀)</p>
</div>
</div>



<h3 class="wp-block-heading"><span id="toc2">回路記述</span></h3>



<p>回路をつくります。</p>



<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module adder_4bit(A, B, X, carry);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;input [3:0] A, B;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;output [3:0] X;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;output carry;</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;wire [3:0] A, B, X;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;wire carry;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;assign {carry, X} = A + B;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">endmodule</li>
</ol></code>



<p></p>



<p>基本的には、組み合わせ回路とおなじです。<br>A、B、X は、それぞれ 4 ビットなので、[MSB:LSB] ってふうにして 4 ビットの信号を表します。<br>9 行目が、加算器をつくる記述。{carry, X} は、信号を連結する記述、だそうです。</p>



<h3 class="wp-block-heading"><span id="toc3">テストベンチ</span></h3>



<p>テストベンチファイルです。</p>



<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module adder_4bit_test;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;integer i;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;reg [3:0] A, B;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;wire [3:0] X;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;wire carry;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;adder_4bit adder0(A, B, X, carry);</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;A = 4<font style="color:brown;">'b0; B = 4'</font>b0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; 16; i=i+1)begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#10 A = i; B = i % 4;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;#10 $finish;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$monitor(<font style="color:brown;">"%d + %d = %d"</font>, A, B, X);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpfile(<font style="color:brown;">"adder_4bit_test.vcd"</font>);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpvars(0, adder_4bit_test);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">endmodule</li>
</ol></code>



<p></p>



<p>3 行目。for() 文のループ変数の宣言。C 言語みたいに for() 文のなかでは、できない、みたい。<br>12 行目。定数は「4&#8217;b0」のように記述する。「4 桁の 2 進数 (b) の 0」って意味です。<br>13 行目。for() 文。i++ も使えない、みたい。処理内容は begin と end でくくられる。C 言語だと {} だね。<br>14 行目。10 ユニット時間ごとに実行する内容。A は 0~15 を、B は 0~3 を繰返し、これを入力としてみました。お好みで。入力をどうするか、ってのは、シミュレーションのためのポイントかな。</p>



<h3 class="wp-block-heading"><span id="toc4">シミュレーション結果</span></h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-full"><a href="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_724758.png"><img loading="lazy" decoding="async" width="936" height="855" src="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_724758.png" alt="" class="wp-image-5656" srcset="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_724758.png 936w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_724758-300x274.png 300w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_724758-768x702.png 768w" sizes="(max-width: 936px) 100vw, 936px" /></a><figcaption class="wp-element-caption">図 2 4ビット加算器のシミュレーション波形</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>図 2 が、シミュレーション波形です。</p>



<p>おかしなところもあるだろうけど、とりあえずこれで動いた (^_^;)<br>ちゃんと足し算できてます。</p>
</div>
</div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>VerilogHDL 組み合わせ回路のシミュレーション</title>
		<link>https://meyon.gonna.jp/study/electronic/5635/</link>
		
		<dc:creator><![CDATA[meyon230]]></dc:creator>
		<pubDate>Fri, 18 Nov 2022 01:12:55 +0000</pubDate>
				<category><![CDATA[VerilogHDL]]></category>
		<category><![CDATA[電子工作]]></category>
		<guid isPermaLink="false">http://meyon.gonna.jp/study/?p=5635</guid>

					<description><![CDATA[VerilogHDL と GTKWave の環境が整いましたので、いくつか例題を試してみようと思います。以下のサイトの問題を、例題にさせていただきました。 【問題1】 Verilog HDLをマスターしよう!!「完全マス [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>VerilogHDL と GTKWave の環境が整いましたので、いくつか例題を試してみようと思います。以下のサイトの問題を、例題にさせていただきました。</p>




<a rel="noopener" target="_blank" href="https://monoist.itmedia.co.jp/mn/articles/0809/04/news122.html" title="【問題1】 Verilog HDLをマスターしよう!!" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://image.itmedia.co.jp/mn/articles/0809/04/ay_drl3_01_fig01.gif" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【問題1】 Verilog HDLをマスターしよう!!</div><div class="blogcard-snippet external-blogcard-snippet">「完全マスター！ 電子回路ドリル」の3学期がスタート！ “ハードウェア記述言語”をテーマにさまざまな問題を毎週お届けします。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://monoist.itmedia.co.jp/mn/articles/0809/04/news122.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">monoist.itmedia.co.jp</div></div></div></div></a>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">組み合わせ回路をシミュレーションする</a><ol><li><a href="#toc2" tabindex="0">回路記述</a></li><li><a href="#toc3" tabindex="0">テストベンチ</a></li><li><a href="#toc4" tabindex="0">シミュレーション結果</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">組み合わせ回路をシミュレーションする</span></h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<p></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="248" height="131" src="https://meyon.gonna.jp/study/wp-content/uploads/image_120180.png" alt="" class="wp-image-5642"/><figcaption class="wp-element-caption">図 1 組み合わせ回路</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>組み合わせ回路です。</p>



<p>まぁ、簡単ですね、みればわかる (^_^;)<br>A または B のどちらか、もしくは両方が 1 のときに、<span style="text-decoration: overline;">C</span> が出力される回路です。<br>これをシミュレーションしてみましょう。</p>



<p>基本は、準備編でやった AND 回路とおなじです、入力が 3 つになっただけ。</p>
</div>
</div>



<h3 class="wp-block-heading"><span id="toc2">回路記述</span></h3>



<p>まずは、回路をつくります。</p>



<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module combinational_circuit(A, B, C, X);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;input A, B, C;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;output X;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;wire A, B, C, X;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;assign X = ( A | B ) &amp; ~C;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">endmodule</li>
</ol></code>



<p></p>



<p>AND 回路のときと同じなので、説明は省略 m(__)m</p>



<h3 class="wp-block-heading"><span id="toc3">テストベンチ</span></h3>



<p>つぎに、テストベンチファイル。</p>



<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module combinational_circuit_test;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;reg A, B, C;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;wire X;</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;combinational_circuit comb_ckt0(A, B, C, X);</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A=0;  B=0;  C=0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;#10             C=1;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;#10       B=1;  C=0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;#10             C=1;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;#10 A=1;  B=0;  C=0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;#10             C=1;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;#10       B=1;  C=0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;#10             C=1;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;#10 $finish;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;$monitor(<font style="color:brown;">"A=%d, B=%d, C=%d, X=%d"</font>, A, B, C, X);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpfile(<font style="color:brown;">"comb_ckt_test.vcd"</font>);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpvars(0, combinational_circuit_test);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">endmodule</li>
</ol></code>



<p></p>



<p>信号の入力は、変化するところだけ記述すればいいですね。コンソール出力が不要なら、21 行の $monitor は不要です。が、波形ファイルを生成するために、vvp は実行しないといけません。</p>



<h3 class="wp-block-heading"><span id="toc4">シミュレーション結果</span></h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-full"><a href="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_044430.png"><img loading="lazy" decoding="async" width="840" height="855" src="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_044430.png" alt="" class="wp-image-5645" srcset="https://meyon.gonna.jp/study/wp-content/uploads/twinwave_044430.png 840w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_044430-295x300.png 295w, https://meyon.gonna.jp/study/wp-content/uploads/twinwave_044430-768x782.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></a><figcaption class="wp-element-caption">図 2 組み合わせ回路のシミュレーション波形</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>図 2 がシミュレーション波形です。</p>



<p>うーん、説明するまでもない (；´Д｀)<br>最初に書いたように、A または B のどちらか、もしくは両方が 1 のときに、<span style="text-decoration: overline;">C</span> が出力される、ってことが、シミュレーションで確認できました。ってことね。</p>
</div>
</div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>VerilogHDL シミュレーション環境のインストール</title>
		<link>https://meyon.gonna.jp/study/electronic/5614/</link>
		
		<dc:creator><![CDATA[meyon230]]></dc:creator>
		<pubDate>Thu, 17 Nov 2022 05:54:23 +0000</pubDate>
				<category><![CDATA[VerilogHDL]]></category>
		<category><![CDATA[電子工作]]></category>
		<guid isPermaLink="false">http://meyon.gonna.jp/study/?p=5614</guid>

					<description><![CDATA[カウンタ回路で遊びつかれたので (；´Д｀)、ちょっと違うことをしようかな。といっても、論理回路つながりで、VerilogHDL を勉強してみようと思います。 まぁ、FPGA とか使うつもりはないんだけど、パソコン上でシ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>カウンタ回路で遊びつかれたので (；´Д｀)、ちょっと違うことをしようかな。といっても、論理回路つながりで、VerilogHDL を勉強してみようと思います。</p>



<p>まぁ、FPGA とか使うつもりはないんだけど、パソコン上でシミュレーションできるのは便利かな、と。Arduino と同様に、俺がちょっとだけ電子回路さわっていた 40 年ほど前にはなかったものだし、ちょっとだけの技術的な興味です。</p>



<p>まいどまいどですが、VerilogHDL が何ものか、についてはググって下さいませ m(__)m</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">環境の準備</a><ol><li><a href="#toc2" tabindex="0">シミュレータ環境のインストール</a></li><li><a href="#toc3" tabindex="0">AND 回路をつくる</a></li><li><a href="#toc4" tabindex="0">テストベンチファイルの作成</a></li></ol></li><li><a href="#toc5" tabindex="0">シミュレーション波形表示</a><ol><li><a href="#toc6" tabindex="0">コンパイル</a></li><li><a href="#toc7" tabindex="0">シミュレータの起動</a></li><li><a href="#toc8" tabindex="0">波形の確認</a></li><li><a href="#toc9" tabindex="0">エラーへの対処</a></li></ol></li><li><a href="#toc10" tabindex="0">後記</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">環境の準備</span></h2>



<h3 class="wp-block-heading"><span id="toc2">シミュレータ環境のインストール</span></h3>



<p>俺のパソコンの OS は ubuntu 20.04.5 LTS です。こいつに、波形データを作成するためのシミュレータ「IcarusVerilog」と、波形を表示する「GTKWave」をインストールします。</p>



<p>インストールは、ターミナルから以下のコマンドで。GUI なら、Synaptic パッケージマネージャからでもいいです。</p>



<pre class="wp-block-preformatted">sudo apt install iverilog
sudo apt install gtkwave</pre>



<h3 class="wp-block-heading"><span id="toc3">AND 回路をつくる</span></h3>



<p>シミュレータを試してみるために、AND 回路を VerilogHDL で記述してみましょう。</p>



<p>まずは、回路の部品にあたるモジュールをつくります。</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label"><span class="tab-caption-box-label-text block-box-label-text box-label-text">andGate.v</span></div><div class="tab-caption-box-content block-box-content box-content">
<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module andGate(A, B, Y);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;input A, B;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;output Y;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;wire A, B, Y;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;assign Y = A &amp; B;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">endmodule</li>
</ol></code>
</div></div>



<p>C 言語に影響を受けているらしいので、C 言語のような書き方ですね。</p>



<p>1 行目。モジュール名 andGate で、モジュールを定義します。() 内にポート名を記述します。<br>2 行目が入力ポート、3 行目が出力ポートの宣言。<br>5 行目は、モジュール内で使う信号の宣言、だそうです。wire で宣言すると「信号線」を意味する。いまいち、わかりませんケド (；´Д｀)</p>



<p>7 行目が回路機能の宣言。回路を論理式で表せるときは assign 文をつかう、と。AND ゲートなので、論理式は Y = A･B ですね。</p>



<p>最後に endmodule で定義を終了します。</p>



<h3 class="wp-block-heading"><span id="toc4">テストベンチファイルの作成</span></h3>



<p>テストベンチファイルは、上でつくった AND 回路に信号を入れて、動作させるためのプログラムファイルです。これも VerilogHDL で記述します。</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label"><span class="tab-caption-box-label-text block-box-label-text box-label-text">andTest.v</span></div><div class="tab-caption-box-content block-box-content box-content">
<code>
<ol style="list-style:decimal-leading-zero outside;in-left:0;padding-left:36px;margin:0;background-color:#EEF;color:#000;">
<li style="background-color:#EFF;">module andTest;</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;reg A, B;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;wire Y;</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;andGate and0(A, B, Y);</li>
<li style="background-color:#EFF;"></li>
<li style="background-color:#EEF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A = 0; B = 0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;#10 A = 1; B = 0;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;#10 A = 0; B = 1;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;#10 A = 1; B = 1;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;#10 A = 0; B = 0;</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;#10 $finish;</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">&nbsp;&nbsp;initial begin</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$monitor(<font style="color:brown;">"A = %d, B = %d, Y = %d"</font> , A, B, Y);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpfile(<font style="color:brown;">"andTest.vcd"</font>);</li>
<li style="background-color:#EEF;">&nbsp;&nbsp;&nbsp;&nbsp;$dumpvars(0, andTest);</li>
<li style="background-color:#EFF;">&nbsp;&nbsp;end</li>
<li style="background-color:#EEF;"></li>
<li style="background-color:#EFF;">endmodule</li>
</ol></code>
</div></div>



<p>テストベンチも module で始まって、endmodule で終わります。</p>



<p>1 行目はモジュール名。andTest としました。<br>3~4 行目。reg は信号を印加するポート、wire は出力を観測するポート、だそうです。<br>6 行目。モジュール andGate をインスタンス化して and0 を生成する。そうそう、C++ クラスでそんなのやったですねぇ。オブジェクト指向プログラミング、ってやつ。</p>



<p>8~15 行は、テスト信号の作成です。initial begin で始まって、end で終わる。<br>まず A=0、B=0 を入力に印加。#10 は 10 ユニット時間の遅延、遅延時間後に A=1 にする。さらに 10 ユニット時間後に、A=0、B=1 にする。そして、A=1、B=1 にする。ふむ、真理値表の状態遷移をいれてみればいいんだな。<br>$finish でシミュレーション終了。</p>



<p>17~21 行は、観察する信号の指示です。<br>$monitor は、信号の値をコンソールに出力する。つまり、ディスプレイに表示する、ってこと。<br>$dumpfile は、波形データのファイル名の指定。$dumpvars は、レベルとモジュールの指定。ここでは、モジュール andTest を、ファイル名 andTest.vcd で出力することになる。レベル？ん、わかんないけど、0。</p>



<p>理解できそうなところ、よくわかんないところ、いろいろあるけど、とりあえず準備完了。</p>



<h2 class="wp-block-heading"><span id="toc5">シミュレーション波形表示</span></h2>



<p>回路をつくり、テストベンチを用意したので、シミュレーションしてみましょう。</p>



<h3 class="wp-block-heading"><span id="toc6">コンパイル</span></h3>



<p>まず、シミュレーションのためのオブジェクトファイルをつくります。C 言語などのプログラムとおんなじですねぇ。</p>



<pre class="wp-block-preformatted">iverilog -o andTest.out andGate.v andTest.v</pre>



<p>-o オプションは出力ファイル名。省略すると a.out になります。</p>



<h3 class="wp-block-heading"><span id="toc7">シミュレータの起動</span></h3>



<p>シミュレータで、生成されたオブジェクトファイルを起動すると、$monitor で指定されたコンソールに、結果が出力されます。</p>



<pre class="wp-block-preformatted">vvp andTest.out
VCD info: dumpfile andTest.vcd opened for output.
A = 0, B = 0, Y = 0
A = 1, B = 0, Y = 0
A = 0, B = 1, Y = 0
A = 1, B = 1, Y = 1
A = 0, B = 0, Y = 0</pre>



<p>お、たしかに AND ゲートの入出力が表示されましたよ。うまくいったようです。</p>



<h3 class="wp-block-heading"><span id="toc8">波形の確認</span></h3>



<p>vvp コマンドを実行すると、$dumpfile で指定した波形ファイル andTest.vcd が生成されます。これを GTKWave で表示させます。</p>



<pre class="wp-block-preformatted">twinwave + andTest.vcd</pre>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p></p>



<figure class="wp-block-image size-full"><a href="https://meyon.gonna.jp/study/wp-content/uploads/TwinWave_913617.png"><img loading="lazy" decoding="async" width="840" height="855" src="https://meyon.gonna.jp/study/wp-content/uploads/TwinWave_913617.png" alt="" class="wp-image-5626" srcset="https://meyon.gonna.jp/study/wp-content/uploads/TwinWave_913617.png 840w, https://meyon.gonna.jp/study/wp-content/uploads/TwinWave_913617-295x300.png 295w, https://meyon.gonna.jp/study/wp-content/uploads/TwinWave_913617-768x782.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></a><figcaption class="wp-element-caption">図 1 TwinWave によるシミュレーション</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>GUI のアプリケーションが起動しましたが、ん？ TwinWave ってアプリケーション？</p>



<p>SST にあるandTest をクリックすると、下に Signals が表示されます。選択して  Append ボタンを押すと、Waves に信号が追加されます。</p>



<p>操作方法？ よくわからんです (；´Д｀)　まぁいろいろさわっているうちに、わかってくるでしょう。</p>



<p>ちなみに、</p>



<pre class="wp-block-preformatted">twinwave ++ andTest.vcd</pre>



<p>と起動すると、GTKWave で二画面に分割されて起動します。TwinWave は、複数の GTKWave を 1 つ、または 2 つのウインドウで開く、ものらしいです。</p>
</div>
</div>



<h3 class="wp-block-heading"><span id="toc9">エラーへの対処</span></h3>



<p>とりあえず GTKWave が動きましたが、ターミナルにエラーがでています。</p>



<pre class="wp-block-preformatted">Gtk-Message: 19:44:04.359: Failed to load module "canberra-gtk-module"</pre>



<p>こいつを消すには、ライブラリをインストールすればよいそうです。</p>



<pre class="wp-block-preformatted">sudo apt install libcanberra-gtk*</pre>



<p>ということで、エラーはすっきり消えました。</p>



<h2 class="wp-block-heading"><span id="toc10">後記</span></h2>



<p>「HDLとは」ってググると、善玉コレステロールがでてきます (^_^;)　検索は「HDL言語」とかでどうぞ。</p>



<p>HDL には、VerilogHDL と VHDL があるそうですが、別物だそうです。VHDL は VerilogHDL を略したものではないんです。まぎらわしい。<br>で、よくわからんのですが、SystemVerilog ってのがあるらしい。VerilogHDL を改良したものらしいんですけど、バージョンアップされたもの、とは違う？ C と C++ みたいな？</p>



<p>多くの Google 先生に教えていただきました。特に、下記のサイトがたいへん参考になりました。ありがとうございます。</p>



<div class="wp-block-cocoon-blocks-caption-box-1 caption-box block-box"><div class="caption-box-label block-box-label box-label"><span class="caption-box-label-text block-box-label-text box-label-text">参考にさせていただいたサイト</span></div><div class="caption-box-content block-box-content box-content">
<p>・<a rel="noopener" target="_blank" href="https://monoist.itmedia.co.jp/mn/articles/0810/09/news118.html">完全マスター！ 電子回路ドリル III（6）【問題6】 7セグメントLEDデコーダを作成しよう</a><br>・<a rel="noopener" target="_blank" href="https://qiita.com/aurueps/items/72444c9b44a6940825f1">Icarus Verilogの導入とAND回路のシミュレーション<br></a>・<a rel="noopener" target="_blank" href="https://qiita.com/igor-bond16/items/d5641e39ad93ad57826e">OpenCVを実行するとでてくるFailed to load module &#8220;canberra-gtk-module&#8221;というエラーの対処法</a></p>
</div></div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
