<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Verilog on Lishengxie</title>
		<link>https://lishengxie.github.io/categories/verilog/</link>
		<description>Recent content in Verilog on Lishengxie</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Sun, 30 Apr 2023 08:30:15 +0800</lastBuildDate>
		
			<atom:link href="https://lishengxie.github.io/categories/verilog/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Verilog Note</title>
				<link>https://lishengxie.github.io/post/verilog-note/</link>
				<pubDate>Sun, 30 Apr 2023 08:30:15 +0800</pubDate>
				<guid>https://lishengxie.github.io/post/verilog-note/</guid>
				<description>&lt;h3 id=&#34;参考书籍&#34;&gt;参考书籍：&lt;/h3&gt;&#xA;&lt;p&gt;《手把手教你学FPGA设计：基于大道至简的至简设计法》&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;百度网盘链接：https://pan.baidu.com/s/12knuxzb4Z6z_8gR-By-l-A&#xA;提取码：mwzd&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;自己实现的书中的模块和相应的testbench测试：&lt;a href=&#34;https://github.com/lishengxie/verilog-learning.git&#34;&gt;https://github.com/lishengxie/verilog-learning.git&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;计数器&#34;&gt;计数器&lt;/h3&gt;&#xA;&lt;h4 id=&#34;设计规则&#34;&gt;设计规则&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;计数器需要考虑三要素：初值、加一条件和结束值（通常依次考虑）；&lt;/li&gt;&#xA;&lt;li&gt;计数初值必须为0；&lt;/li&gt;&#xA;&lt;li&gt;使用某个计数值时必须同时满足加1条件；例如加1条件为&lt;code&gt;add_cnt&lt;/code&gt;且&lt;code&gt;add_cnt &amp;amp;&amp;amp; cnt==4&lt;/code&gt;时表示计数到第五个，而&lt;code&gt;add_cnt==0 &amp;amp;&amp;amp; cnt==4&lt;/code&gt;不表示计数到第五个；&lt;/li&gt;&#xA;&lt;li&gt;计数条件必须&lt;strong&gt;同时满足加一条件&lt;/strong&gt;，且结束值必须是&lt;code&gt;x-1&lt;/code&gt;的形式；&lt;/li&gt;&#xA;&lt;li&gt;当从计数器取某个数时，assign形式必须为：&lt;code&gt;(加一条件) &amp;amp;&amp;amp; (cnt==计数值-1)&lt;/code&gt;；&lt;/li&gt;&#xA;&lt;li&gt;结束后计数值需要回到0；&lt;/li&gt;&#xA;&lt;li&gt;需要限定范围时，推荐使用&lt;code&gt;&amp;gt;=&lt;/code&gt;和&lt;code&gt;&amp;lt;&lt;/code&gt;两种符号，尽量不要使用大于或者小于等于两种符号；&lt;/li&gt;&#xA;&lt;li&gt;计数器设计时，先写计数器的always段，条件用名字代替，随后使用assign语句依次写出加一条件和结束条件；由此可以得出计数器的模板写法如下所示&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-verilog&#34; data-lang=&#34;verilog&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 中文词语方便理解，实际使用需要更改为相应的变量名&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;always&lt;/span&gt; @(&lt;span style=&#34;color:#66d9ef&#34;&gt;posedge&lt;/span&gt; clk &lt;span style=&#34;color:#66d9ef&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;negedge&lt;/span&gt; rst_n) &lt;span style=&#34;color:#66d9ef&#34;&gt;begin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(rst_n&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;#39;b0&lt;/span&gt;)&lt;span style=&#34;color:#66d9ef&#34;&gt;begin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cnt &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;加一条件&lt;/span&gt;)&lt;span style=&#34;color:#66d9ef&#34;&gt;begin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;结束条件&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cnt &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cnt &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; cnt &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;assign&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;加一条件&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xxxxxx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;assign&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;结束条件&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;加一条件&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; (cnt&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;计数值&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;9&#34;&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;加一条件必须与计数器严格对齐，其他信号一律向计数器对齐；例如，现在需要输出两个信号&lt;code&gt;dout0&lt;/code&gt;和&lt;code&gt;dout1&lt;/code&gt;，&lt;code&gt;dout0&lt;/code&gt;在计数到6时拉高，&lt;code&gt;dout1&lt;/code&gt;在计数到7时拉高，因此&lt;code&gt;dout0&lt;/code&gt;变1的条件为&lt;code&gt;add_cnt &amp;amp;&amp;amp; cnt==6-1&lt;/code&gt;，&lt;code&gt;dout1&lt;/code&gt;变1的条件有两种写法&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;dout0 == 1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;add_cnt &amp;amp;&amp;amp; cnt==7-1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;第一种写法是间接向计数器对齐，是非常不好的方法，建议使用第二种直接向计数器对齐；&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;加一条件统一前缀为&lt;code&gt;add_&lt;/code&gt;，结束条件统一前缀为&lt;code&gt;end_&lt;/code&gt;；&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;暂不使用减1计数器。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;状态机&#34;&gt;状态机&lt;/h3&gt;&#xA;&lt;h4 id=&#34;设计规则-1&#34;&gt;设计规则&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用四段式写法&#xA;第一段为同步时序的always模块，用于格式化描述次态迁移到现态寄存器；&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-verilog&#34; data-lang=&#34;verilog&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;always&lt;/span&gt; @(&lt;span style=&#34;color:#66d9ef&#34;&gt;posedge&lt;/span&gt; clk &lt;span style=&#34;color:#66d9ef&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;negedge&lt;/span&gt; rst_n) &lt;span style=&#34;color:#66d9ef&#34;&gt;begin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;rst_n) &lt;span style=&#34;color:#66d9ef&#34;&gt;begin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;state_c &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; IDLE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;begin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;state_c &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; state_n;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二段为组合逻辑的always块，用于描述状态转移条件判断，以三个状态的状态机IDLE-&amp;gt;S1-&amp;gt;S2-&amp;gt;IDLE为例；&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
