<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.8.5">Jekyll</generator><link href="https://jokeysenpai.github.io//feed.xml" rel="self" type="application/atom+xml" /><link href="https://jokeysenpai.github.io//" rel="alternate" type="text/html" /><updated>2019-05-28T09:39:14+00:00</updated><id>https://jokeysenpai.github.io//feed.xml</id><title type="html">Centriii</title><subtitle>TeaCh Me Or seNd Me to hEll.</subtitle><entry><title type="html">几个RFIC模拟电路中的注意</title><link href="https://jokeysenpai.github.io//routine/2019/05/16/%E5%87%A0%E4%B8%AARFIC%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF%E4%B8%AD%E7%9A%84%E6%B3%A8%E6%84%8F.html" rel="alternate" type="text/html" title="几个RFIC模拟电路中的注意" /><published>2019-05-16T06:00:00+00:00</published><updated>2019-05-16T06:00:00+00:00</updated><id>https://jokeysenpai.github.io//routine/2019/05/16/%E5%87%A0%E4%B8%AARFIC%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF%E4%B8%AD%E7%9A%84%E6%B3%A8%E6%84%8F</id><content type="html" xml:base="https://jokeysenpai.github.io//routine/2019/05/16/%E5%87%A0%E4%B8%AARFIC%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF%E4%B8%AD%E7%9A%84%E6%B3%A8%E6%84%8F.html">&lt;h2 id=&quot;反馈电路topology的判断&quot;&gt;反馈电路topology的判断&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;反馈放大器可以减小放大倍数，增大通过带宽，减小信号变化造成的失真。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;问题主要出现在Sandra Smith的Microelectronic Circuits中，对反馈结构的描述基于理解原理后建立的基础模型，在实际应用环境下很难判断放大器的基础结构。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;四种不同的基本拓扑结构如图，在Sandra Smith的MC中，介绍主要使用括号中写的名词进行描述（方法②），不方便理解，所以使用括号外的描述方法①并且介绍一种简单粗暴的观察方法。&lt;/p&gt;

&lt;h4 id=&quot;首先是两种表述方法的转换方式&quot;&gt;首先是两种表述方法的转换方式&lt;/h4&gt;

&lt;p&gt;我们之后会首先从电路中得出方法①的描述然后转换成方法②，所以先介绍如何从方法①转换成方法②。&lt;/p&gt;

&lt;p&gt;以经验结果论，我们有原则：sampling 方法voltage对应shunt， 方法current 对应series，替换后改变前后顺序即是方法二的结果。&lt;/p&gt;

&lt;p&gt;以上图图一为例，输出量为电压，所以是voltage sampling，而反馈信号也是电压，连接回输入电路的方法是串联（反馈信号和连接方式有对应），所以是series mixing。&lt;/p&gt;

&lt;p&gt;voltage sampling 对应 shunt 前后替换后 voltage-series feedback就变成了 series-shunt feedback，对应Voltage Amp 适用的反馈拓扑结构。&lt;/p&gt;

&lt;h4 id=&quot;例子&quot;&gt;例子&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/img/image3.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;图为未连接左下节点的一个反馈放大器。&lt;/p&gt;

&lt;p&gt;连接上断开 节点后，输出信号为电压（我们想要的），反馈信号是电压（有一端接地，只有电压信号），所以我们可以知道这是Voltage-sampling series-mixing Feedback。&lt;/p&gt;

&lt;p&gt;而转换成方法②中的表示方法即是 series-shunt feedback。[https://www.youtube.com/watch?v=GufufacT88o]&lt;/p&gt;

&lt;p&gt;Sandra Smith书中写的被认为是对的但是引起了很多误解【大概】&lt;/p&gt;

&lt;h2 id=&quot;带源极电阻的共源极mosfet输出电阻计算&quot;&gt;带源极电阻的共源极MOSFET输出电阻计算&lt;/h2&gt;

&lt;p&gt;骚气邓老师的第五章ppt里面写 CSwith Rs的忽视r0输出电阻是 下拉电阻RD，但许多例题里面的输出电阻并没有那么简单，枯了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image24.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image25.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;经过计算 正确式子是:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;rout=RD||(ro*(1+gmRs)+Rs)&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&quot;工程相关计算的时候记得约等于&quot;&gt;工程相关计算的时候记得约等于&lt;/h2&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;A=X+Y+Z;
B=(1+MN);
C=A+B
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;遇到这种情况的时候，观察XYZ，MN的值，有较大值（相加两项比较超过一百倍就忽略小的那项）。&lt;/p&gt;

&lt;p&gt;再带入数据计算结果，不然你就会变成卡兹sama。&lt;/p&gt;</content><author><name></name></author><summary type="html">反馈电路topology的判断</summary></entry><entry><title type="html">数字频率产生器</title><link href="https://jokeysenpai.github.io//routine/2019/04/15/%E6%95%B0%E5%AD%97%E9%A2%91%E7%8E%87%E4%BA%A7%E7%94%9F%E5%99%A8DDS.html" rel="alternate" type="text/html" title="数字频率产生器" /><published>2019-04-15T09:00:00+00:00</published><updated>2019-04-15T09:00:00+00:00</updated><id>https://jokeysenpai.github.io//routine/2019/04/15/%E6%95%B0%E5%AD%97%E9%A2%91%E7%8E%87%E4%BA%A7%E7%94%9F%E5%99%A8DDS</id><content type="html" xml:base="https://jokeysenpai.github.io//routine/2019/04/15/%E6%95%B0%E5%AD%97%E9%A2%91%E7%8E%87%E4%BA%A7%E7%94%9F%E5%99%A8DDS.html">&lt;p&gt;紧急复习紧急复习，在要做信号调制之前赶紧把上一次的数字频率生成器复习一下——已经什么都不知道了。&lt;/p&gt;

&lt;p&gt;知识点需要：信号与系统里面的时域频域相位域，数字电路基础里面的DAC转换。&lt;/p&gt;

&lt;h2 id=&quot;数字频率生成器&quot;&gt;数字频率生成器&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;频率合成技术简介&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;所谓频率合成技术指的是将一个或者多个具有高稳定度和高精确度的&lt;/p&gt;

&lt;p&gt;频率参考源，经过混频、倍频或者分频等处理，得到具有同样稳定度和精确度的所需要频率。&lt;/p&gt;

&lt;p&gt;早在 20 世纪 30 年代，频率合成理论便已经形成，早期主要代表器件有可控晶体振荡器。这种频率合成器需要通过手动切换开关来输出频率，石英晶体的稳定度和准确度决定了输出频率的稳定度和精度。此后出现了釆用多个晶体振荡器产生所需频点的合成方法，与可控晶体振荡器相比，这种方法使用的晶体振荡器数量要少，成本要低。&lt;/p&gt;

&lt;p&gt;随着电子技术的发展和通信领域对频率的精度和稳定度的要求的提高，出现了一种非相干频率合成技术。非相干频率合成指的是使用一个参考源产生与参考源具有相同的精确度和稳定度的频率的技术。主要有四种实现方法：&lt;/p&gt;

&lt;p&gt;直接频率合成技术、间接频率合成技术、直接数字频率合成技术与混合式频率合成技术。&lt;/p&gt;

&lt;p&gt;1)	直接频率合成技术&lt;/p&gt;

&lt;p&gt;直接频率合成理论是指使用一个或多个参考频率源经过谐波发生器&lt;/p&gt;

&lt;p&gt;产生各次谐波，然后经过分频、倍频、混频滤波等处理产生所需要的各个频点。这种方法产生的波形具有：相位噪声小、频率转换时间短、工作频段宽等优点。但是直接频率合成技术使用了大量的分频器、倍频器、混频器，电路比较复杂、成本较高、设备笨重，并且容易产生杂散，因此应用范围并不是很广。&lt;/p&gt;

&lt;p&gt;2)	间接频率合成技术&lt;/p&gt;

&lt;p&gt;间接频率合成又被称为锁相频率合成，根据反馈原理产生频率步进，采用锁相环技术，输出高稳定度频率。锁相环理论早在年就被提出来，但是直到世纪年代第一次被使用于电视接收机水平和垂直的同步扫描。锁相环就相当于一个窄带跟踪滤波器，对杂散有很好的抑止作用，但是频率转换时间比较长，且在单环的情况下频率分辨率也不是很好。&lt;/p&gt;

&lt;p&gt;3)	直接数字频率合成技术&lt;/p&gt;

&lt;p&gt;直接数字频率合成（Direct Digital Frequency Synthesis 即 DDFS,—般简称 DDS）是从相位概念出发直接合成所需要波形的一种新的全数字频率合成技术。1971 年，美国学者 J.Tierncy,C.M.Rader 和 B.Gold 提出一种采用数字技术从相位概念出发，直接合成所需波形的频率合成原理。限于当时的数字技术和器件工艺水平，直接数字频率合成的性能指标还无法与已有的频率合成技术相比，所以未能受到重视。近年来，数字技术和器件工艺水平不断的得到发展和提高，直接数字频率合成得到了快速发展，在频率转换、分辨率、相位连续性、正交输出以及集成化等方面的性能都超越了其他频率合成技术所能达到旳水平，为电子系统提供了高质量频率源。但是直接数字频率合成也存在一些难以克服的缺点，如：杂散指标差，输出频率较低。&lt;/p&gt;

&lt;p&gt;4)	混合式频率合成技术&lt;/p&gt;

&lt;p&gt;混合式频率合成是综合不同合成技术的优点，将多种频率合技术混合使用的方法，常用的混合方案有直接数字频率合成与锁相频率合成混合方案。直接数字频率合成的优点是频率分辨率高、频率转换快、相位连续，缺点是输出频率低，杂散比较大。锁相频率合成的优点是频率比较高，对信号杂散的分量能有效抑制，缺点是分辨率不够，频率转换慢。可见，二者具有互补性，将这两种技术结合起来，充分利用各自的优点，可以输出宽频带、高分辨率、低杂散和低相噪的频率。&lt;/p&gt;

&lt;p&gt;2&lt;/p&gt;

&lt;p&gt;综上所述，目前常使用的频率合成技术各有其特点，设计者需要根据设计需求综合考虑各种频率合成技术的优缺点，制定合理设计方案。在实际应用中，主要从以下几个技术指标考虑频率合成器的优缺点：&lt;/p&gt;

&lt;p&gt;1)	输出频率范围：频率范围即频率合成器的最低输出频率和最高输出频率之间的间隔。&lt;/p&gt;

&lt;p&gt;2)	频率分辨率：频率分辨率又称频率步进，指的是两个相邻的输出频点之间的最小间隔。&lt;/p&gt;

&lt;p&gt;3)	频率稳定度：频率稳定度是指在一定时间内，输出频率偏离标准频率的大小，分为长期稳定度和短期稳定。长期稳定度是指由于元件老化引起的元件参数变化和工作环境的变化引起的频率漂移。短期稳定度是输出频率在秒或者毫秒单位内的频率起伏，影响短期频率稳定度的主要原因是各种随机噪声。&lt;/p&gt;

&lt;p&gt;4)	杂散指标：杂散指标是表示输出的频率中包含不需要的信号成分它表征频率源的输出谱的纯度。杂散的产生主要有三个因素：①外部的福射干扰；②系统内部频率成分的福射；③在频率合成过程中产生。&lt;/p&gt;

&lt;p&gt;5)	相位噪声：相位噪声是频率稳定度的频域表示，表现为在主频两边的连续噪声。&lt;/p&gt;

&lt;p&gt;6)	频率转换速度：频率转换速度是从个工作频率转换到另一个工作频率所需要的快慢的表征。&lt;/p&gt;

&lt;p&gt;——————————————————废话结束————————————————————————————————————&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image16.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image17.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image18.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;原理分析来自保骏的实验开发指导书，可能摘自《通信原理》&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;从以上原理可见， 通过控制K 和采样频率，可以通过相位累加器获得想要得到频率波形的相位信息。&lt;/p&gt;

&lt;p&gt;之后我们通过相位信息映射内存地址，从某个存储了幅值信息的rom中获取正弦波的幅值输出（查找表方法），通过DAC转换成模拟波形。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image19.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;相位累加器&quot;&gt;相位累加器&lt;/h3&gt;

&lt;p&gt;使用一个加法器，每次对频率控制字K进行累加，K越大，每次累加的步进越大。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image20.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;对于特定的频率生成器K，其对应的生成频率为 Kfc/2^N；K=1时，输出最小波形频率nabla=fc/2^N。&lt;/p&gt;

&lt;p&gt;相位累加器采用二进制进行计算方便、快速，但不能保证输出频率为整数，会产生一定的误差。比如，时钟频率为10MHz，相位累加器的位数为32，
则最小输出频率分辨率为：&lt;/p&gt;

&lt;p&gt;0.0233Hz=10^7/2^32;&lt;/p&gt;

&lt;p&gt;可以通过增加累加器位数（使分辨率更小），调整时钟频率（使输出频率为负数防止舍去）来减小误差。&lt;/p&gt;

&lt;p&gt;使用成本更高的十进制累加器可以完全解决问题。&lt;/p&gt;

&lt;h3 id=&quot;波形存储器&quot;&gt;波形存储器&lt;/h3&gt;

&lt;p&gt;波形存储器用于存储波形一个周期的幅值信息。可以使用rom，也可以使用不同的存储器。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image21.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;原生杂散和后期处理杂散都会suffer from 这个截取。&lt;/p&gt;

&lt;p&gt;在指导书的叙述中，不明白为什么当DAC量化位数为15，ROM地址线位数为32时候，ROM容量为2^32×15——每个rom地址都有15个DAC输出量化结果？&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;等待补充回答遗留问题
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/img/mangqu.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;fpga顶层设计图&quot;&gt;FPGA顶层设计图：&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/img/image22.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;其中一边使用NCO内置模块直接生成波形（原理未知），一边使用上文介绍原理从内存中拉取幅值信息进行DAC转换输出。&lt;/p&gt;

&lt;h3 id=&quot;波形图&quot;&gt;波形图&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/img/image23.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;</content><author><name></name></author><summary type="html">紧急复习紧急复习，在要做信号调制之前赶紧把上一次的数字频率生成器复习一下——已经什么都不知道了。</summary></entry><entry><title type="html">二补法存储&amp;amp;固定点法和浮点法存储小数位</title><link href="https://jokeysenpai.github.io//routine/2019/04/13/%E6%9C%BA%E5%99%A8%E5%AD%98%E5%82%A8%E5%B0%8F%E6%95%B0%E4%BD%8D%E6%95%B0%E7%9A%84%E4%B8%8D%E5%90%8C%E6%96%B9%E6%B3%95.html" rel="alternate" type="text/html" title="二补法存储&amp;固定点法和浮点法存储小数位" /><published>2019-04-13T13:17:23+00:00</published><updated>2019-04-13T13:17:23+00:00</updated><id>https://jokeysenpai.github.io//routine/2019/04/13/%E6%9C%BA%E5%99%A8%E5%AD%98%E5%82%A8%E5%B0%8F%E6%95%B0%E4%BD%8D%E6%95%B0%E7%9A%84%E4%B8%8D%E5%90%8C%E6%96%B9%E6%B3%95</id><content type="html" xml:base="https://jokeysenpai.github.io//routine/2019/04/13/%E6%9C%BA%E5%99%A8%E5%AD%98%E5%82%A8%E5%B0%8F%E6%95%B0%E4%BD%8D%E6%95%B0%E7%9A%84%E4%B8%8D%E5%90%8C%E6%96%B9%E6%B3%95.html">&lt;p&gt;本文介绍关于电脑建构中小数存储的方法。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“There are only 10 types of programmers: those who understand binary, and those who don’t.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;当涉及计算机中符号数的存取时，数据一般分为原码，反码（1’s complement code)和补码（2’s complement code)。&lt;/p&gt;

&lt;p&gt;unsigned变量貌似没有这些说法，对于signed变量来说：&lt;/p&gt;

&lt;p&gt;原码以第一位作为符号位，0代表正数，1代表负数，后面位数以二进制正常表示数字。&lt;/p&gt;

&lt;p&gt;反码仍然以第一位作为符号位，从十进制变为有符号二进制表达的角度来说：&lt;/p&gt;

&lt;p&gt;1.如果十进制数是个正数，除第一位0以外的二进制位内的数字即十进制转换来的二进制数（和原码一样）。&lt;/p&gt;

&lt;p&gt;2.如果十进制数是个负数，那么第一位是1，之后的数字是十进制转换来的二进制数取反。&lt;/p&gt;

&lt;p&gt;这么做的好处是不用设计负数的比较电路（可见-1&amp;gt;-2），但以上两种方法都有正0和负0的重复存储。&lt;/p&gt;

&lt;p&gt;补码，以第一位作为符号位，从十进制变为有符号二进制表达的角度来说：&lt;/p&gt;

&lt;p&gt;1.如果十进制数是个正数，除第一位0以外的二进制位内的数字即十进制转换来的二进制数（和原码一样）。&lt;/p&gt;

&lt;p&gt;2.如果十进制数是个负数，那么第一位是1，之后的数字是十进制转换来的二进制数取反之后+1。&lt;/p&gt;

&lt;p&gt;补码解决了重复0的问题并多存储了一位负数。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image14.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在研究有限位带符号二进制加法的时候出现了一些问题：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;1001+0111=? Is there an overflow?
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;有符号的二进制加法做法是将两个数字本身取补码，然后相加获得一个原码的结果。&lt;/p&gt;

&lt;p&gt;这里1001+0111即 -1+7 即转换为 1 111+ 0 111 （正数补码为其本身），最终得出结果是（1） 0110，即+6，可是这里本身存在一个进位溢出——尽管得到结果本身并没有超出4位带符号的值域。&lt;/p&gt;

&lt;p&gt;经过查询发现有以下规则：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image15.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;而小数存储一般分为fixed-point 和floating-point两种，&lt;/p&gt;

&lt;p&gt;fixed-point方法是机器内默认了小数点的位置之后，用对应位数存储所有的数字，在写出的时候会默认乘上一个指数来变成小数：&lt;/p&gt;

&lt;p&gt;Example: with m=-3 (resolution of 0.001 or milli) the value range is 0.000 to 65.535 (with 16-bit)
What is π represented as in memory, when using Decimal Fixed-Point with m = -3?&lt;/p&gt;

&lt;p&gt;π(3.14159…) = I*10^-3&lt;/p&gt;

&lt;p&gt;=&amp;gt; I = Integral approximation of (3.14159…*10^3)&lt;/p&gt;

&lt;p&gt;I = Integral approximation of (3141.59)&lt;/p&gt;

&lt;p&gt;I = 3142&lt;/p&gt;

&lt;p&gt;二进制的fixed point就将指数幂的底数变成2，&lt;/p&gt;

&lt;p&gt;但至今没明白题目如果让我“用fixed-point的表示方法”写出来的时候我是写一个式子还是把他算成十进制的样子表示出来。&lt;/p&gt;

&lt;p&gt;浮点方法表示数字，小数点可以在内存位数中间移动，从而获得更大的小数分辨率或者整数范围——具体方法有些忘记了，之后有时间了再看了补上。&lt;/p&gt;</content><author><name></name></author><summary type="html">本文介绍关于电脑建构中小数存储的方法。</summary></entry><entry><title type="html">移位法进行二进制转十进制</title><link href="https://jokeysenpai.github.io//routine/2019/04/12/%E7%A7%BB%E4%BD%8D%E6%B3%95%E8%BF%9B%E8%A1%8C%E8%BF%9B%E5%88%B6%E8%BD%AC%E6%8D%A2.html" rel="alternate" type="text/html" title="移位法进行二进制转十进制" /><published>2019-04-12T12:37:23+00:00</published><updated>2019-04-12T12:37:23+00:00</updated><id>https://jokeysenpai.github.io//routine/2019/04/12/%E7%A7%BB%E4%BD%8D%E6%B3%95%E8%BF%9B%E8%A1%8C%E8%BF%9B%E5%88%B6%E8%BD%AC%E6%8D%A2</id><content type="html" xml:base="https://jokeysenpai.github.io//routine/2019/04/12/%E7%A7%BB%E4%BD%8D%E6%B3%95%E8%BF%9B%E8%A1%8C%E8%BF%9B%E5%88%B6%E8%BD%AC%E6%8D%A2.html">&lt;p&gt;本文介绍verilog中使用移位法进行二进制转换十进制的方法。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image13.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在FPGA中，寄存器定义和存储的数据都是采用二进制的格式，而FPGA输
出给数码显示管的数据必须是十进制的格式，所以需要一个专门把二进制数据转
换为十进制BCD码的模块。图3为以十进制255举例的转换算法，具体算法流程为：&lt;/p&gt;

&lt;p&gt;1) 二进制左移一位；&lt;/p&gt;

&lt;p&gt;2) 判断个位、十位、百位是否大于等于5，是则加3；&lt;/p&gt;

&lt;p&gt;3) 重复上述过程直到完成8次移位&lt;/p&gt;

&lt;p&gt;移位法的优点是占用最少的片上资源实现进制转换的功能，相比传统不用脑子的本科生会写的除余进制转换电脑程序，在基础电路中的表现更加高效。&lt;/p&gt;

&lt;p&gt;实例如下：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;`timescale 1ns / 1ps


module bin_dec(clk,sec_start,bin,rst_n,one,ten,hun,count,shift_reg 
    ); 
input  [7:0] bin; 
input        clk,rst_n,sec_start; 
output [3:0] one,ten; 
output [3:0] count; 
output [1:0] hun; 
output [17:0]shift_reg; 
reg    [3:0] one,ten; 
reg    [1:0] hun; 
reg    [3:0] count; 
reg    [17:0]shift_reg=18'b000000000000000000;


////////////////////// 计数部分 //////////////////////// 
always @ ( posedge clk ) 
	begin 
	 if( !rst_n )  
		count&amp;lt;=0; 
	 else if(sec_start)
	   count&amp;lt;=0;
	 else if (count&amp;lt;=8) 
		count&amp;lt;=count+1; 
	 else 
		count&amp;lt;=9; 
	end


////////////////////// 二进制转换为十进制 ///////////////// 
always @ (posedge clk) 
begin 
  if (!rst_n) 
       shift_reg=0; 
  else if (count==0) 
       shift_reg={10'b0000000000,bin}; 
  else if (count&amp;lt;=8)                //实现8次移位操作 
       begin 
          if(shift_reg[11:8]&amp;gt;=5)         //判断个位是否&amp;gt;5，如果是则+3   
             begin 
               if(shift_reg[15:12]&amp;gt;=5) //判断十位是否&amp;gt;5，如果是则+3   
                 begin 
							shift_reg[15:12]=shift_reg[15:12]+2'b11;    
							shift_reg[11:8]=shift_reg[11:8]+2'b11; 
							shift_reg=shift_reg&amp;lt;&amp;lt;1;  //对个位和十位操作结束后，整体左移 
					  end 
               else 
                 begin 
                   shift_reg[15:12]=shift_reg[15:12]; 
						 shift_reg[11:8]=shift_reg[11:8]+2'b11; 
						 shift_reg=shift_reg&amp;lt;&amp;lt;1; 
                 end 
             end   
          else 
             begin 
               if(shift_reg[15:12]&amp;gt;=5) 
                 begin 
							shift_reg[15:12]=shift_reg[15:12]+2'b11; 
							shift_reg[11:8]=shift_reg[11:8]; 
							shift_reg=shift_reg&amp;lt;&amp;lt;1; 
					  end 
               else 
                 begin 
                   shift_reg[15:12]=shift_reg[15:12]; 
						 shift_reg[11:8]=shift_reg[11:8]; 
						 shift_reg=shift_reg&amp;lt;&amp;lt;1; 
                 end 
             end   
        end 
end


/////////////////输出赋值////////////////////////// 
always @ ( posedge clk or negedge rst_n ) 
begin 
 if ( !rst_n ) 
  begin 
    one&amp;lt;=0; 
    ten&amp;lt;=0; 
    hun&amp;lt;=0;  
  end 
 else if (count==9)  //此时8次移位全部完成，将对应的值分别赋给个,十,百位 
  begin 
    one&amp;lt;=shift_reg[11:8]; 
    ten&amp;lt;=shift_reg[15:12]; 
    hun&amp;lt;=shift_reg[17:16];  
  end 
end
endmodule


&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;该程序输出给另外的单个数码管输出模块即可，实现移位+3的转换方法。&lt;/p&gt;

&lt;p&gt;并不明白具体原理，但是这个方法确实成功实现。待补充&lt;/p&gt;

&lt;p&gt;以上。&lt;/p&gt;</content><author><name></name></author><summary type="html">本文介绍verilog中使用移位法进行二进制转换十进制的方法。</summary></entry><entry><title type="html">FSM概念和FPGA中的简单LCD操作</title><link href="https://jokeysenpai.github.io//routine/2019/04/11/FSM&LCD.html" rel="alternate" type="text/html" title="FSM概念和FPGA中的简单LCD操作" /><published>2019-04-11T00:58:23+00:00</published><updated>2019-04-11T00:58:23+00:00</updated><id>https://jokeysenpai.github.io//routine/2019/04/11/FSM&amp;LCD</id><content type="html" xml:base="https://jokeysenpai.github.io//routine/2019/04/11/FSM&amp;LCD.html">&lt;h1 id=&quot;有限状态机finite-state-machine&quot;&gt;有限状态机Finite state machine&lt;/h1&gt;

&lt;p&gt;简单的逻辑概念，用图表方式表达。复杂的多模块电路设计可以非常方便地表示出来。&lt;/p&gt;

&lt;p&gt;分为Moore状态机和Mealy状态机。&lt;/p&gt;

&lt;p&gt;Moore状态机的输出由current state决定，而mealy状态机的输出由current state和input决定。&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;确定状态机内部没有缺少逻辑的方法：
1. 不缺状态
2. 不缺状态转换字（看输入脚是几位，就有2^n个转换箭头）
3. 不缺输出
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/img/image5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;本文主要介绍在FPGA（verilog）中使用mealy状态机双模块交互并行操作1602LCD的方法&lt;/p&gt;

&lt;p&gt;并行针脚连接如下&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;1602LCD显示的内容为 16×2，即可以显示两行，即可以显示两16个字符，目前市面 上字符液晶大多数是基于 HD44780和SPLC780D液晶芯片，控制原理是完全相同 的，因此基于 HD44780和SPLC780D写的控制程序可以很方便地应用于市面上大 写的控制程序可以很方便地应用于市面上大部分LCD屏幕。&lt;/p&gt;

&lt;p&gt;本文中显示字符操作通过从LCD控制模块的CGROM中读取出默认保存的字符，出厂时CGROM中默认保存了标准的ascii码，日文字符和希腊文字符。&lt;/p&gt;

&lt;p&gt;字符表如下：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image10.png&quot; alt=&quot;word&quot; /&gt;&lt;/p&gt;

&lt;p&gt;1602LCD的控制器显存有80个byte，而1602LCD只有两行X16字符的显示区域，所以显存中有些地址是无法对应上LCD屏幕的，但是可以预先保存在显存中，通过
移位操作进行显示，下图为显存地址对应图：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image11.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;要显示字符时要先输入首个字符的地址，然后由于置输入模式的设置，再次读取使能时会读取预设位置的字符。&lt;/p&gt;

&lt;p&gt;比如第二行第一个字符，我们需要写入地址等于C0H——尽管第二行第一个字符是40H的地址，但是由于读取CGROM时的状态字设定D7最高位恒为1，所以
设定时将数据位设置为01000000B(40H）+10000000B(80H）=11000000B(C0H).&lt;/p&gt;

&lt;p&gt;也因此，每个字节位置的地址要加80H或者C0H（状态字设定）。&lt;/p&gt;

&lt;p&gt;给出1602控制字表:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image12.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;并行操作时序图如下：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/img7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;看上去很复杂，图中需要注意的地方有给电平的顺序，每个针脚电平变化的时间间隔（为了保证针脚电平稳定）。&lt;/p&gt;

&lt;p&gt;具体可以参考时序时间参数图&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/img8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;RS针脚决定data位读取是数据还是状态字，R/W针脚决定是读取还是将LCD内信息写出给处理器，使能针脚的高电平是数据针脚稳定之后让模块使能并读取数据的命令——设置好输入顺序状态字之后，
每次重新激活使能就会往下一个地址位写入数据（控制模块自带功能，都不用每次重新写数据位）&lt;/p&gt;

&lt;p&gt;简单总结LCD并行操作的关键顺序即：选RS，上数据（包含R/W文字），给使能。给数据和给使能步骤有严谨的先后顺序，
在单片机C中，低端IC（如51）先后语句有可观的延时，所以顺序编写程序语句可以实现功能。&lt;/p&gt;

&lt;p&gt;在更加高端的使用高频时钟信号的FPGA中(或者高性能IC单片也需要注意），由于Verilog语句大多是并行执行，这里采用一个双模块状态机来确保数据读取的使能过程和全部的针脚设置过程分开。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;实例：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;使能控制端&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;module LCD_Controller (	iCLK,iRST_N,iStart,oDone,LCD_EN);
parameter	CLK_Divide	=	16;


input	 iStart;
input	 iCLK,iRST_N;
output oDone;
output LCD_EN;
reg oDone;
reg LCD_EN;
//	Internal Register
reg		[4:0]	Cont;
reg		[1:0]	ST;
reg		preStart,mStart;



always@(posedge iCLK or negedge iRST_N)
begin
	if(!iRST_N)
	begin
		oDone	&amp;lt;=	1'b0;
		LCD_EN	&amp;lt;=	1'b0;
		preStart&amp;lt;=	1'b0;
		mStart	&amp;lt;=	1'b0;
		Cont	&amp;lt;=	0;
		ST		&amp;lt;=	0;
	end
	else
	begin
		//////	Input Start Detect ///////
		preStart&amp;lt;=	iStart;
		if({preStart,iStart}==2'b01)
		begin
			mStart	&amp;lt;=	1'b1;
			oDone	&amp;lt;=	1'b0;
		end
		//////////////////////////////////
		if(mStart)
		begin
			case(ST)
			0:	ST	&amp;lt;=	1;	//	Wait Setup
			1:	begin
					LCD_EN	&amp;lt;=	1'b1;
					ST		&amp;lt;=	2;
				end
			2:	begin					
					if(Cont&amp;lt;CLK_Divide)
					Cont	&amp;lt;=	Cont+1;
					else
					ST		&amp;lt;=	3;
				end
			3:	begin
					LCD_EN	&amp;lt;=	1'b0;
					mStart	&amp;lt;=	1'b0;
					oDone	&amp;lt;=	1'b1;
					Cont	&amp;lt;=	0;
					ST		&amp;lt;=	0;
				end
			endcase
		end
	end
end

endmodule
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;2.数据端口&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;module	LCD_TEST (	//	Host Side
					      iCLK,iRST_N,mLCD_Done,
					     // LCD Side
					      mLCD_DATA,mLCD_RS,mLCD_Start);
//	Host Side
input			iCLK,iRST_N,mLCD_Done;
//	LCD Side
output	[7:0]	mLCD_DATA;
output			mLCD_RS,mLCD_Start;
//	Internal Wires/Registers
reg	[5:0]	LUT_INDEX;
reg	[8:0]	LUT_DATA;
reg	[5:0]	mLCD_ST;
reg	[17:0]	mDLY;
reg			mLCD_Start;
reg	[7:0]	mLCD_DATA;
reg			mLCD_RS;
wire		mLCD_Done;

parameter	LCD_INTIAL	=	0;
parameter	LCD_LINE1	=	5;//初始化
parameter	LCD_CH_LINE	=	LCD_LINE1+16;
parameter	LCD_LINE2	=	LCD_LINE1+16+1;
parameter	LUT_SIZE	=	LCD_LINE1+32+1;

always@(posedge iCLK or negedge iRST_N)
begin
	if(!iRST_N)
	begin
		LUT_INDEX	&amp;lt;=	0;
		mLCD_ST		&amp;lt;=	0;
		mDLY		&amp;lt;=	0;
		mLCD_Start	&amp;lt;=	0;
		mLCD_DATA	&amp;lt;=	0;
		mLCD_RS		&amp;lt;=	0;
	end
	else
	begin
		if(LUT_INDEX&amp;lt;LUT_SIZE)
		begin
			case(mLCD_ST)
			0:	begin//确定当前八位data位读出是数据本身还是状态字，并读出八位数据位，给控制enable端送出开始指令，跳到case2
					mLCD_D	ATA	&amp;lt;=	LUT_DATA[7:0];
					mLCD_RS		&amp;lt;=	LUT_DATA[8];
					mLCD_Start	&amp;lt;=	1;
					mLCD_ST		&amp;lt;=	1;
				end
			1:	begin//接受控制enable端的结束指令，立刻停止输出开始信号防止控制端再读一次enable指令，跳到case3
					if(mLCD_Done)
					begin
						mLCD_Start	&amp;lt;=	0;
						mLCD_ST		&amp;lt;=	2;					
					end
				end
			2:	begin//延迟保证阵针脚电平稳定，跳到case3
					if(mDLY&amp;lt;18'h3FFFE)
					mDLY	&amp;lt;=	mDLY+1;
					else
					begin
						mDLY	&amp;lt;=	0;
						mLCD_ST	&amp;lt;=	3;
					end
				end
			3:	begin// 进行下一个字符位置的读取，跳到case0
					LUT_INDEX	&amp;lt;=	LUT_INDEX+1;
					mLCD_ST	&amp;lt;=	0;
				end
			endcase
		end
	end
end

always
begin
	case(LUT_INDEX)
	//	Initial
	LCD_INTIAL+0:	LUT_DATA	&amp;lt;=	9'h038;// 八总线，双行 5X7点阵字符
	LCD_INTIAL+1:	LUT_DATA	&amp;lt;=	9'h00C;//打开显示屏，关闭光标和光标闪动功能
	LCD_INTIAL+2:	LUT_DATA	&amp;lt;=	9'h001;//清空LCD显示器
	LCD_INTIAL+3:	LUT_DATA	&amp;lt;=	9'h006;//字符输入向右，输入时文字本身不移动
	LCD_INTIAL+4:	LUT_DATA	&amp;lt;=	9'h080;//读取初始字符位置 第一行
	//	Line 1
	LCD_LINE1+0:	LUT_DATA	&amp;lt;=	9'h120;	//	Welcome to the
	LCD_LINE1+1:	LUT_DATA	&amp;lt;=	9'h157;
	LCD_LINE1+2:	LUT_DATA	&amp;lt;=	9'h165;
	LCD_LINE1+3:	LUT_DATA	&amp;lt;=	9'h16C;
	LCD_LINE1+4:	LUT_DATA	&amp;lt;=	9'h163;
	LCD_LINE1+5:	LUT_DATA	&amp;lt;=	9'h16F;
	LCD_LINE1+6:	LUT_DATA	&amp;lt;=	9'h16D;
	LCD_LINE1+7:	LUT_DATA	&amp;lt;=	9'h165;
	LCD_LINE1+8:	LUT_DATA	&amp;lt;=	9'h120;
	LCD_LINE1+9:	LUT_DATA	&amp;lt;=	9'h174;
	LCD_LINE1+10:	LUT_DATA	&amp;lt;=	9'h16F;
	LCD_LINE1+11:	LUT_DATA	&amp;lt;=	9'h120;
	LCD_LINE1+12:	LUT_DATA	&amp;lt;=	9'h174;
	LCD_LINE1+13:	LUT_DATA	&amp;lt;=	9'h168;
	LCD_LINE1+14:	LUT_DATA	&amp;lt;=	9'h165;
	LCD_LINE1+15:	LUT_DATA	&amp;lt;=	9'h120;
	//	Change Line
	LCD_CH_LINE:	LUT_DATA	&amp;lt;=	9'h0C0;//将初始字符位置放置到第二行
	//	Line 2
	LCD_LINE2+0:	LUT_DATA	&amp;lt;=	9'h145;	//	ETCEIS of UESTC
	LCD_LINE2+1:	LUT_DATA	&amp;lt;=	9'h154;	
	LCD_LINE2+2:	LUT_DATA	&amp;lt;=	9'h143;
	LCD_LINE2+3:	LUT_DATA	&amp;lt;=	9'h145;
	LCD_LINE2+4:	LUT_DATA	&amp;lt;=	9'h149;
	LCD_LINE2+5:	LUT_DATA	&amp;lt;=	9'h153;
	LCD_LINE2+6:	LUT_DATA	&amp;lt;=	9'h120;
	LCD_LINE2+7:	LUT_DATA	&amp;lt;=	9'h16F;
	LCD_LINE2+8:	LUT_DATA	&amp;lt;=	9'h166;
	LCD_LINE2+9:	LUT_DATA	&amp;lt;=	9'h120;
	LCD_LINE2+10:	LUT_DATA	&amp;lt;=	9'h155;
	LCD_LINE2+11:	LUT_DATA	&amp;lt;=	9'h145;
	LCD_LINE2+12:	LUT_DATA	&amp;lt;=	9'h153;
	LCD_LINE2+13:	LUT_DATA	&amp;lt;=	9'h154;
	LCD_LINE2+14:	LUT_DATA	&amp;lt;=	9'h143;
	LCD_LINE2+15:	LUT_DATA	&amp;lt;=	9'h121;//Space
	default:		LUT_DATA	&amp;lt;=	9'h120;
	endcase
end
endmodule

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上。&lt;/p&gt;</content><author><name></name></author><summary type="html">有限状态机Finite state machine</summary></entry><entry><title type="html">Jekyll Setup</title><link href="https://jokeysenpai.github.io//routine/2019/04/09/JekyllSetup.html" rel="alternate" type="text/html" title="Jekyll Setup" /><published>2019-04-09T16:01:22+00:00</published><updated>2019-04-09T16:01:22+00:00</updated><id>https://jokeysenpai.github.io//routine/2019/04/09/JekyllSetup</id><content type="html" xml:base="https://jokeysenpai.github.io//routine/2019/04/09/JekyllSetup.html">&lt;h1 id=&quot;jekyll真香&quot;&gt;Jekyll真香&lt;/h1&gt;

&lt;p&gt;围绕github服务建立服务器的方法有jekyll框架和hexo框架，本文希望能通俗易懂地介绍在windows环境下由jekyll框架从零开始建立github静态博客的方法。&lt;/p&gt;

&lt;p&gt;使用github+jekyll的方法编写博客的优点有：&lt;/p&gt;

&lt;p&gt;1.免费&lt;/p&gt;

&lt;p&gt;2.可定义度高&lt;/p&gt;

&lt;p&gt;3.运行效率高&lt;/p&gt;

&lt;p&gt;缺点有：&lt;/p&gt;

&lt;p&gt;1.没有独立域名&lt;/p&gt;

&lt;p&gt;2.交互需要用不便利的插件disqus&lt;/p&gt;

&lt;p&gt;3.需要前端知识&lt;/p&gt;

&lt;h2 id=&quot;需要的工具有&quot;&gt;需要的工具有&lt;/h2&gt;

&lt;p&gt;· &lt;a href=&quot;https://git-scm.com/&quot;&gt;git&lt;/a&gt;: 版本管理工具，在本文过程中通过git来和云端交互信息。&lt;/p&gt;

&lt;p&gt;· &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;: 嘿嘿嘿嘿嘿嘿&lt;/p&gt;

&lt;p&gt;· &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;: 我们搭建博客的框架；需要&lt;a href=&quot;https://www.ruby-lang.org/en/downloads/&quot;&gt;Ruby&lt;/a&gt;支持，下载最新版本ruby环境即可，ruby命令行可以从开始菜单直接打开&lt;/p&gt;

&lt;p&gt;· Markdown: 需要一些基础的md知识来编写博客内容&lt;/p&gt;

&lt;h2 id=&quot;总体流程是&quot;&gt;总体流程是：&lt;/h2&gt;

&lt;p&gt;创建GitHub账户，创建新库作为网站host，然后由ruby命令行在本地下载生成原生的jekyll网站，经过编辑之后重新上传到GitHub库中，直接上线！&lt;/p&gt;

&lt;h2 id=&quot;创建github账号和库&quot;&gt;创建GitHub账号和库&lt;/h2&gt;

&lt;p&gt;注册一个GitHub账号并登陆，看右上角加号位置，点击创建新库&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image1.png&quot; alt=&quot;repo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;然后记得输入库名的时候要和自己的username一致（图中id就填写jokeysenpai），虽然没弄清楚为什么，但是大概和框架建立时的连接有关系&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image2.png&quot; alt=&quot;na&quot; /&gt;&lt;/p&gt;

&lt;p&gt;按下创建即可，此时在库内会生成一些文件，不过无所谓之后全部都要换掉！&lt;/p&gt;

&lt;h2 id=&quot;使用github-desktop把库文件拉下来&quot;&gt;使用GitHub desktop把库文件拉下来&lt;/h2&gt;

&lt;p&gt;下载&lt;a href=&quot;https://desktop.github.com/&quot;&gt;GitHub desktop&lt;/a&gt; 然后可以看到自己的库文件，fetch下来一个文件夹然后我们在文件夹中进行操作。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image3.png&quot; alt=&quot;fetch&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;在本地环境下安装jekyll&quot;&gt;在本地环境下安装jekyll&lt;/h2&gt;

&lt;p&gt;然后我们在本地环境下运行jekyll，建立一个本地网站，调试也最好在本地条件下进行，节省服务器资源也避免上传效果不是实时显示的麻烦。&lt;/p&gt;

&lt;p&gt;打开ruby命令行（装好了ruby之后一般情况下就在开始菜单里）&lt;/p&gt;

&lt;p&gt;我们首先需要安装&lt;code class=&quot;highlighter-rouge&quot;&gt;bundler&lt;/code&gt; 和 &lt;code class=&quot;highlighter-rouge&quot;&gt;jekyll&lt;/code&gt; ，分别运行&lt;code class=&quot;highlighter-rouge&quot;&gt;gem install bundler&lt;/code&gt;  &lt;code class=&quot;highlighter-rouge&quot;&gt;gem install github-pages&lt;/code&gt;  后者包含了用pages做blog所需要的所有工具和jekyll，&lt;/p&gt;

&lt;p&gt;之后可以先输入盘符，或者找准路径直接输入：&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt; jekyll new web_name &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;生成一个网页文件夹&lt;/p&gt;

&lt;p&gt;用git来确定其中文件插件的版本&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git init 
git add .
git commit -m&quot;Initial Commit&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这时候你会发现文件夹中有个gemfile 文件 打开，按照说明编辑成以下格式：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;source &quot;https://rubygems.org&quot;

# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
#
#     bundle exec jekyll serve
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!


# This is the default theme for new Jekyll sites. You may change this to anything you like.
gem &quot;minima&quot;, &quot;~&amp;gt; 2.0&quot;

# If you want to use GitHub Pages, remove the &quot;gem &quot;jekyll&quot;&quot; above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
gem &quot;github-pages&quot;, group: :jekyll_plugins

# If you have any plugins, put them here!
group :jekyll_plugins do
  gem &quot;jekyll-feed&quot;, &quot;~&amp;gt; 0.6&quot;
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem &quot;tzinfo-data&quot;, platforms: [:mingw, :mswin, :x64_mingw, :jruby]

# Performance-booster for watching directories on Windows
gem &quot;wdm&quot;, &quot;~&amp;gt; 0.1.0&quot; if Gem.win_platform?
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;运行 &lt;code class=&quot;highlighter-rouge&quot;&gt;bundle install&lt;/code&gt;  然后commit文件&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;git add . &amp;amp;&amp;amp; git commit -m&quot;Add Gemfile&quot;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;这里可能出错，按照命令行内提示进行操作即可。&lt;/p&gt;

&lt;p&gt;可以看到源网站是rubygems，这里可能需要vpn进行update，也可能不需要，这里做的时候由于我这里网络环境很复杂，有命令行hanged不动的情况，调试vpn服务器之后正常。&lt;/p&gt;

&lt;h2 id=&quot;在本地运行jekyll&quot;&gt;在本地运行Jekyll&lt;/h2&gt;

&lt;p&gt;在命令行中输入&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bundle exec jekyll serve&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;即可在&lt;a href=&quot;http://localhost:4000/&quot;&gt;http://localhost:4000/&lt;/a&gt;中看到初始的awesome title网站 （笑&lt;/p&gt;

&lt;h2 id=&quot;推上github&quot;&gt;推上GitHub&lt;/h2&gt;

&lt;p&gt;把生成网站文件全部覆盖到之前拉下来的库文件夹里面，然后进入GitHub desktop，观察到changes跳改变气泡，修改这次commit的注释topic然后commit，
点击右上的push（图中是fetch），就可以把网站推到username.github.io上面啦。&lt;/p&gt;

&lt;p&gt;Et Voila！&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/image4.png&quot; alt=&quot;voila&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;设置&quot;&gt;设置&lt;/h2&gt;

&lt;p&gt;打开原文件夹内的_config.yml，你会看到&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Site settings
title: Your awesome title
email: your-email@domain.com
description: &amp;gt; # this means to ignore newlines until &quot;baseurl:&quot;
  Write an awesome description for your new site here. You can edit this
  line in _config.yml. It will appear in your document head meta (for
  Google search results) and in your feed.xml site description.
baseurl: &quot;&quot; # the subpath of your site, e.g. /blog/
url: &quot;http://yourdomain.com&quot; # the base hostname &amp;amp; protocol for your site
twitter_username: jekyllrb
github_username:  jekyll

# Build settings
markdown: kramdown
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;改变其中的对应的内容，如果你还在&lt;code class=&quot;highlighter-rouge&quot;&gt;bundle exec jekyll serve&lt;/code&gt; 的状态下，刷新localhost页面就能看到改变了&lt;/p&gt;

&lt;p&gt;可以修改的内容有网站名，描述，推特和GitHub用户名，还有邮箱&lt;/p&gt;

&lt;p&gt;url和baseurl会影响一些东西，但是可以不改~&lt;/p&gt;

&lt;h2 id=&quot;修改关于页面&quot;&gt;修改关于页面&lt;/h2&gt;

&lt;p&gt;和上面讲的差不多，打开about.md文件 可以看到&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;---
layout: page       # ---&amp;gt; Type of the page (page or post)
title: About       # ---&amp;gt; Name of the page
permalink: /about/ # ---&amp;gt; Path of the page
---

This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](http://jekyllrb.com/)

You can find the source code for the Jekyll new theme at: [github.com/jglovier/jekyll-new](https://github.com/jglovier/jekyll-new)

You can find the source code for Jekyll at [github.com/jekyll/jekyll](https://github.com/jekyll/jekyll)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;通过在头文字下面加文字描述就可以修改关于信息了！&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;注意：中文输入的话，文本文档需要保存为UTF-8代码&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;写文章&quot;&gt;写文章&lt;/h2&gt;

&lt;p&gt;用三个短划线隔开头文字，&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;---
layout: post
title:  &quot;My First Post&quot;
date:   2015-11-13 21:00:00 +0800
categories: stuff
---
 Hello world!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;后面就可以写想要写的东西了，可以实现markdown语法的所有功能，与普通代码博客中的一样。&lt;/p&gt;

&lt;p&gt;写完之后保存utf8码然后存到_post文件夹里面上传即可。&lt;/p&gt;

&lt;p&gt;这篇文章就在如此基础上编写出来的。&lt;/p&gt;

&lt;p&gt;需要注意的地方有：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;保存日期不能是未来，否则不会显示&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;相关资源保存路径不能是中文也不能以下划线_开头【难过&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;UTF-8，win默认文本保存是ANSI，导致乱码&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;以上简单结束了&quot;&gt;以上，简单结束了&lt;/h4&gt;

&lt;p&gt;其他类似disqus的安装，更换主题甚至自己编写主题，还有使用自有域名等都不在本人考虑范围内了，有空的话会搞搞，在这里重新写进去！&lt;/p&gt;</content><author><name></name></author><summary type="html">Jekyll真香</summary></entry><entry><title type="html">LaunchCentriii</title><link href="https://jokeysenpai.github.io//routine/2019/04/09/centriii.html" rel="alternate" type="text/html" title="LaunchCentriii" /><published>2019-04-09T12:38:22+00:00</published><updated>2019-04-09T12:38:22+00:00</updated><id>https://jokeysenpai.github.io//routine/2019/04/09/centriii</id><content type="html" xml:base="https://jokeysenpai.github.io//routine/2019/04/09/centriii.html">&lt;p&gt;可能过了很多年吧，以前也有过写博客的想法。
今天看着FPGA的DDS生成器回想32的寄存器操作什么都想不起来，又想要搞个有点逼格，舒服的博客用用。
也看了很多云服务器的教育优惠，转念忽然想起来github不是个云盘来着么，然后一查发现还真能当作博客服务器用，于是忙活一天就把这个伪Centriii建起来了。
虽然效率很低，没学什么东西，但是好歹也是半个码农，github也该好好用用。&lt;/p&gt;

&lt;p&gt;也为了致敬偶像Patina27，如今对嵌入式，对程序的兴趣也都算有他的影响。
从前曾经那么接近自己喜欢的一切却又不知道珍惜，长大了一定要学会珍惜每一个细节。&lt;/p&gt;</content><author><name></name></author><summary type="html">可能过了很多年吧，以前也有过写博客的想法。 今天看着FPGA的DDS生成器回想32的寄存器操作什么都想不起来，又想要搞个有点逼格，舒服的博客用用。 也看了很多云服务器的教育优惠，转念忽然想起来github不是个云盘来着么，然后一查发现还真能当作博客服务器用，于是忙活一天就把这个伪Centriii建起来了。 虽然效率很低，没学什么东西，但是好歹也是半个码农，github也该好好用用。</summary></entry></feed>