remove some deprecated dependencies

This commit is contained in:
2023-04-07 00:27:17 +08:00
commit 147fa954c0
668 changed files with 41793 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
josh-gao.top
View File
+5
View File
@@ -0,0 +1,5 @@
<div>
{% if not is_index %}
<div style="text-align:center;color: #ccc;font-size:18px;">--------------------------The End--------------------------</div>
{% endif %}
</div>
+11
View File
@@ -0,0 +1,11 @@
{% if site.tags.length > 1 %}
<script type="text/javascript" charset="utf-8" src="{{ url_for('/js/tagcloud.js') }}"></script>
<script type="text/javascript" charset="utf-8" src="{{ url_for('/js/tagcanvas.js') }}"></script>
<div class="widget-wrap">
<div id="myCanvasContainer" class="widget tagcloud">
<canvas width="250" height="250" id="resCanvas" style="width:100%">
{{ list_tags() }}
</canvas>
</div>
</div>
{% endif %}
+293
View File
@@ -0,0 +1,293 @@
// Custom styles.
// 网站最顶部条线的颜色
// .headband {
// height: 3px;
// background: #222222;
// }
// 设置背景图片
body{
// background:url('https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/backgroud.jpg');
background:url(../images/bg.svg);
background-repeat:repeat;
// background-attachment:fixed;
// background-position:center;
// background-size:100% 100%;
}
// 设置侧边栏左上角网站标题和副标题区颜色
// .site-meta {
// background: #222222;
// }
// 设置侧边栏网站标题样式
.site-title {
}
// 设置侧边栏网站标题鼠标悬浮样式
// .site-title:hover {
// letter-spacing: 0.1rem;
// }
// 侧边栏网站副标题样式
// .site-subtitle {
// color:#fff;
// }
// 文章标题鼠标悬浮下划线样式
// .posts-expand .post-title-link::before {
// content: "";
// position: absolute;
// width: 100%;
// height: 2px;
// bottom: 0;
// left: 0;
// background-color: #222222;
// visibility: hidden;
// transform: scaleX(0);
// transition-duration: 0.2s;
// transition-timing-function: ease-in-out;
// transition-delay: 0s;
// }
// // 文章标题颜色
// .posts-expand .post-title-link {
// color:#222222;
// }
// // 阅读全文按钮样式
// .btn {
// border:2px solid #222222;
// color:#222222;
// }
// // 阅读全文按钮鼠标悬浮样式
// .btn:hover {
// border-color: #222222;
// color: #fff;
// background: #222222;
// }
// // 设置文章和侧边栏中链接样式
// a:hover,
// span.exturl:hover {
// color: #222222;
// border-bottom-color: #222222;
// }
// // 修改文章页侧边栏文章目录下面的第一个标题的鼠标悬浮样式
// // 真的有毒,文章目录第一个标题的样式还是单独设置的...一开始还没发现
// .post-toc .nav .active-current > a:hover {
// color: #222222;
// }
// // 文章页面左边文章标题颜色
// .post-toc ol a:hover {
// color: #222222;
// border-bottom-color: #222222;
// }
// // 文章页面左边文章标题active时颜色
// .post-toc .nav .active > a {
// color: #222222;
// border-bottom-color: #222222;
// }
// // 文章页侧边栏文章目录和站点概况鼠标悬浮样式
// .sidebar-nav li:hover {
// color: #222222;
// }
// // 文章页侧边栏文章目录和站点概况active时鼠标悬浮样式
// .sidebar-nav .sidebar-nav-active:hover {
// color: #222222;
// }
// // 文章页侧边栏文章目录和站点概况active时样式
// .sidebar-nav .sidebar-nav-active {
// color: #222222;
// border-bottom-color: #222222;
// }
// // 社交栏鼠标悬浮样式
// #sidebar div.links-of-author.motion-element a:hover {
// color: #222222;
// background: rgba(255, 255, 255, 0);
// }
// // 友链鼠标悬浮样式
// .sidebar a:hover,
// .sidebar span.exturl:hover {
// border-bottom-color: #222222;
// color: #222222;
// }
// RSS文字颜色
//#sidebar div.feed-link.motion-element > a {
// color: #222222;
//}
// RSS图标颜色
//#sidebar div.feed-link.motion-element > a i{
// color: #222222;
//}
// 侧边栏日志、分类、标签 上面的数字的颜色
// .site-state-item-count {
// color: #222222;
// }
// 设置底部文章分页数字鼠标悬浮上划线颜色
// .pagination .prev:hover,
// .pagination .next:hover,
// .pagination .page-number:hover {
// border-top-color: #222222;
// }
// 设置文章页上一篇文章和下一篇文章鼠标悬浮样式
// .post-nav-item a:hover {
// color: #222222;
// border-bottom: none;
// }
// 修改鼠标选中字符的颜色
/* webkit, opera, IE9 */
// ::selection {
// background: #222222;
// color: #f7f7f7;
// }
/* firefox */
// ::-moz-selection {
// background: #222222;
// color: #f7f7f7;
// }
// 侧边栏返回顶部按钮鼠标悬浮样式
// .back-to-top:hover {
// background: #eee;
// color: #222222;
// }
// 当页面处于 首页、标签、分类、归档、关于页面其中之一时,处于哪个页面哪个选项就变蓝
// #menu > li.menu-item-active > a {
// color: #222222;
// }
// 侧边栏导航小圆点颜色
// .menu-item-active a:after,
// .menu .menu-item a:hover:after,
// .menu .menu-item span.exturl:hover:after {
// background-color: #222222;
// }
// 侧边栏上半部分设置为透明
.menu-item-active a,
.menu .menu-item a:hover,
.menu .menu-item span.exturl:hover {
background: rgba(255, 255, 255, 0);
border-bottom-color: rgba(255, 255, 255, 0);;
}
// 侧边栏下半部分设置为透明
.sidebar{
background: rgba(255, 255, 255, 0);
}
.sidebar-inner{
background: rgba(255, 255, 255, 0.94);
}
// 设置底部文章分页部分为透明
.pagination{
background: rgba(255, 255, 255, 0.94);
}
.pagination .page-number.current {
color: #fff;
background: #222222;
}
// 导航栏底部百分比透明
.back-to-top,
.back-to-top:hover
{
background: rgba(255, 255, 255, 0);
}
// 设置文章背景透明度
.post-block{
background: rgba(255, 255, 255, 0.94);
}
// 这里需要完全透明,不然就会在上面的0.7基础上再进行透明度计算
.btn{
background: rgba(255, 255, 255, 0);
}
.header-inner{
background: rgba(255, 255, 255, 0.94);
}
.main-inner {
background: rgba(255, 255, 255, 0.94);
}
// 代码高亮背景透明
// .table-container{
// background: rgba(29, 31, 33, 0.94);
// }
// table > tbody > tr:nth-of-type(odd) {
// background-color: rgba(29, 31, 33, 0);
// }
// table > tbody > tr:hover {
// background-color: rgba(29, 31, 33, 0);
// }
// pre,
// .highlight {
// background: rgba(29, 31, 33, 0);
// }
// .highlight .gutter pre {
// background: rgba(29, 31, 33, 0.94);
// }
// .highlight .code pre {
// background: rgba(29, 31, 33, 0);
// }
// 评论
.comments {
background: rgba(255, 255, 255, 0.94);
}
// 文章页内作者信息
.post-copyright {
border-left: 3px solid #222222;
background: rgba(255, 255, 255, 0.3);
}
/* 行内代码块的自定义样式 */
// code {
// color: #222222;
// background: rgba(220,220,220, 0.94);
// margin: 2px;
// border: 1px solid #90EE90;
// }
// 底部动态的叶子图标
// .with-love{
// color: green;
// }
// 去掉文章白色背景
.main-inner {
background: rgba(255,255,255,0);
}
// // 标签页链接下划线颜色
// a,
// span.exturl {
// border-bottom: 1px solid #222222;
// }
// // 标签页链接鼠标悬浮颜色
// .tag-cloud a:hover {
// color: #222222 !important;
// }
+5
View File
@@ -0,0 +1,5 @@
// 圆角设置
$border-radius-inner = 10px;
$border-radius = 10px;
// $font-family-chinese = "PingFang SC", "Microsoft YaHei";
@@ -0,0 +1,72 @@
---
title: Josh 的学习笔记之信息论(Part 1 —— 绪论)
mathjax: true
comments: true
copyright: true
sticky: false
toc:
enable: true
number: true
wrap: true
expand_all: true
max_depth: 4
tags:
- 信息的概念
- 信息论的研究内容
categories:
- - Josh 的学习笔记
- 信息论
abbrlink: 71ccf914
date: 2021-11-27 19:20:36
---
# 信息的概念
## 信息的定义
1. Hartly 对信息的定义:信息是选择的自由度。
2. Wiener 对信息的定义:
1. 信息既不是物质又不是能量,信息就是信息。表明了信息是独立于物质和能量之外存在于客观世界的第三要素。
2. 信息是人们适应外部世界并且使这种适应反作用于外部世界的过程中,同外部世界进行互相交换的内容的名称。
3. Shannon 对信息的定义:信息是事物运动状态或存在方式的**不确定性**的描述。
## 信息、消息和信号的区别
1. 信号:是信息的物理表达层,是三个层次中最具体的层次。
2. 消息(或符号):是信息的数学表达层,可以定量地加以描述,它是具体物理信号的进一步数学抽象。可分为离散(数字)消息和连续(模拟)消息。
3. 信息:是指各个事物运动的状态及状态变化的方式,是抽象的意识或知识,是三个层次中最抽象的层次。
> 信号是消息的载体,消息是信息的载体。
<!-- more -->
# 信息论研究的对象、目的和内容
## 研究对象
应用概率论、随机过程、数理统计等方法来研究信息的传输、提取和处理系统中的一般规律。
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2021-11-27-josh-toi-part-1/2021-11-27-josh-toi-part-1-010-SystemModel.png" width=600px alt="图1-1 信息传输系统的模型"/>
</div>
## 研究目的
提高信息系统的**可靠性**、**有效性**和**安全性**以便达到系统最优化。
## 研究内容
1. 狭义信息论(Shannon 信息论):主要研究信息的测度、信道容量、信息率失真函数,与这三个概念相对应的香农三定理以及信源和信道编码。Shannon 研究的对象是从信源到信宿的全过程,是收、发端联合最优化问题,重点是编码。
> Shannon 信息论的缺陷
>
> 1. Shannon 定义信息的出发点是假定事物的状态可以用一个以经典集合论为基础的概率模型来描述,对实际存在的某些事物的运动状态要寻找一个合适的概率模型往往是非常困难的,并且这一模型不一定存在。
> 2. Shannon 定义信息的度量没有考虑收信者的主观性和主观意义,也撇开了信息的具体含义、具体用途、重要程度和引起的后果等元素,这就与实际情况不完全一致。
2. 一般信息论:主要是研究信息传输和处理问题。除了 Shannon 基本理论之外,还包括噪声理论、信号滤波和预测、统计检测与估计理论、调制理论。重点研究接收端。
3. 广义信息论 $^*$。
# 信息论发展简史与信息科学$^*$
@@ -0,0 +1,266 @@
---
title: Josh 的学习笔记之信息论(Part 2 —— 离散信源及其信息测度)
mathjax: true
comments: true
copyright: true
sticky: false
toc:
enable: true
number: true
wrap: true
expand_all: true
max_depth: 4
tags:
- 信息测度
- 离散信源
- 离散平稳信源
- Markov 信源
- 信息熵
categories:
- - Josh 的学习笔记
- 信息论
abbrlink: 3db469da
date: 2021-11-28 00:13:29
---
# 信源的数学模型及分类[^MathematicalModelofInformationSource]
[^MathematicalModelofInformationSource]: 在通信系统中,收信者在未收到信息以前,对信源发出什么样的消息是不确定的,是随机的,所以可以用随机变量、随机矢量或随机过程来描述信源输出的消息,或者说用一个样本空间及其概率测度来描述信源。不同的信源根据其输出消息的不同的随机性质进行分类。
## 一维离散信源和一维连续信源(单符号)
| | 概率空间 | 完备约束 | 含义 |
| :--: | :--------------: | :----: | :-------------- |
| 一维离散信源 | $$
\left[ \begin{array}{c}
X\\
P\left( x \right)\\
\end{array} \right] =\left[ \begin{matrix}
x_1,& x_2,& \cdots ,& x_q\\
P\left( x_1 \right) ,& P\left( x_2 \right) ,& \cdots ,& P\left( x_q \right)\\
\end{matrix} \right]
$$ | $$
\sum_i{P\left( x_i \right)}=1
$$ | 其中 $0\leq P\left( x_i \right) \leq 1\left( i=1,2,\cdots ,q \right)$ 是信源输出符号 $x_i\left( i=1,2,\cdots ,q \right)$ 的先验概率。一维离散信源每次只输出一个消息,消息的可能数目是**有限多个** |
| 一维连续信源 | $$
\left[ \begin{array}{c}
X\\
p\left( x \right)\\
\end{array} \right] =\left[ \begin{array}{c}
\left( a,b \right)\\
p\left( x \right)\\
\end{array} \right]
$$ | $$
\int_a^b{p\left( x \right) \mathrm{d}x}=1
$$ | 其中 $p\left( x \right)$ 是随机变量 $X$ 的概率密度函数。一维连续信源每次只输出一个消息,但消息的可能数目是**无限多个** |
## 多符号离散信源
&emsp;&emsp;采用随机矢量描述多符号离散信源,即
$$\begin{equation}\label{eq2-1}
\vec{X}=\left( X_1X_2\cdots X_N \right)
\end{equation}$$
$N$ 维随机矢量 $\vec{X}$ 也称为**随机序列**。
<!-- more -->
## 离散平稳信源和连续平稳信源
### 离散平稳信源
&emsp;&emsp;若信源输出的随机序列中每个随机变量都是离散型随机变量,且随机序列的各维概率密度函数与时间起点无关,即随机变量的统计特性不随着时间的推移而有所变化,此时称为离散平稳信源。
### 连续平稳信源
&emsp;&emsp;若信源输出的消息可用 $N$ 维随机矢量来描述,其中每个随机分量都是连续型随机变量,且随机变量的各维概率密度函数与时间起点无关,即随机变量的统计特性不随着时间的推移而有所变化,此时称为连续平稳信源。
> 平稳信源又分为无记忆信源(输出符号彼此统计独立)和有记忆信源。
# 离散信源的信息熵
## 信息量
### 信息量的直观定义
$$\begin{align}
&\text{收到某消息获得的信息量} \nonumber \\
=&\text{不确定性减少的量} \nonumber \\
=&(\text{收到消息}\textbf{前}\text{关于某件事发生的不确定性})-(\text{收到此消息}\textbf{后}\text{的不确定性}) \nonumber
\end{align}$$
> 特别地,对于无噪信道
> $$\begin{align}
&\text{收到某消息获得的信息量} \nonumber \\
=&\text{收到消息前关于某事件发生的不确定性} \nonumber \\
=&\text{信源输出某消息中所含信息量} \nonumber
\end{align}$$
### 自信息量
&emsp;&emsp;若已知事件 $a_i$ 发生,则该事件所含有的信息量称为自信息量,定义为[^BaseNumberNote] [^SelfInformationNote]
$$\begin{equation}\begin{aligned}
&\bbox{I\left( a_i \right) =\log _2\frac{1}{P\left( a_i \right)}\left( \mathrm{bit} \right) =\log \frac{1}{P\left( a_i \right)}\left( \mathrm{bit} \right) } \\
&\phantom{\,I\left( a_i \right) }=\ln \frac{1}{P\left( a_i \right)}\left( \mathrm{nat} \right) =\lg \frac{1}{P\left( a_i \right)}\left( \mathrm{hart} \right) =\log _r\frac{1}{P\left( a_i \right)}\left( r\text{进制单位} \right)
\end{aligned}\end{equation}$$
[^BaseNumberNote]: 一般采用以2 为底的对数,且为了书写简洁,把底数“2”略去不写。
[^SelfInformationNote]: $a_i$ 是一个随机变量,而 $I\left( a_i \right)$ 是 $a_i$ 的函数,没有确定的值,**不能作为整个信源的信息测度**。
> 自信息量的含义:当事件 $a_i$ 发生以前,表示事件 $x_i$ 发生的不确定性;当事件 $a_i$ 发生以后,表示事件 $a_i$ 所含有(或所提供)的信息量。在**无噪信道**中,能正确无误地传输到收信者,所以 $I\left( a_i \right)$ 可代表接收到消息 $x_i$ 后所获得的信息量,这是因为消除了 $I\left( a_i \right)$ 大小的不确定性,才获得这么大小的信息量。
### 联合自信息量
&emsp;&emsp;设信源模型为
$$\begin{equation}
\left[ \begin{array}{c}
XY\\
P\left( XY \right)\\
\end{array} \right] =\left[ \begin{matrix}
x_1y_1,& \cdots ,& x_1y_m,& x_2y_1,& \cdots ,& x_2y_m,& \cdots ,& x_ny_1,& \cdots ,& x_ny_m\\
P\left( x_1y_1 \right) ,& \cdots ,& P\left( x_1y_m \right) ,& P\left( x_2y_1 \right) ,& \cdots ,& P\left( x_2y_m \right) ,& \cdots ,& P\left( x_ny_1 \right) ,& \cdots ,& P\left( x_ny_m \right)\\
\end{matrix} \right]
\end{equation}$$
其中 $0\leq P\left( x_iy_j \right) \leq 1\left( i=1,2,\cdots n;j=1,2,\cdots ,m \right)$ 且 $\displaystyle\sum_i{\sum_j{P\left( x_iy_j \right)}}=1$,则联合自信息量为
$$\begin{equation}
\bbox{I\left( x_iy_j \right) =\log _2\frac{1}{P\left( x_iy_j \right)}}
\end{equation}$$
> 当 $X$ 和 $Y$ 相互独立时,$P\left( x_iy_j \right) =P\left( x_i \right) P\left( y_j \right)$
> $$\begin{equation}
I\left( x_iy_j \right) =\log _2\frac{1}{P\left( x_iy_j \right)}=\log _2\frac{1}{P\left( x_i \right)}+\log _2\frac{1}{P\left( y_j \right)}=I\left( x_i \right) +I\left( y_j \right)
\end{equation}$$
> 即**两个随机事件相互独立时,同时发生得到的信息量,等于各自自信息量之和**。
### 条件自信息量
&emsp;&emsp;设在 $y_i$ 条件下发生 $x_i$ 的条件概率为 $P\left( x_i|y_j \right) $,则其条件自信息量定义为
$$\begin{equation}
\bbox{I\left( x_i|y_j \right) =\log _2\frac{1}{P\left( x_i|y_j \right)}}
\end{equation}$$
表示在特定的条件下($y_i$ 已定)随机事件 $x_i$ 所带来的信息量。
> 自信息量、条件自信息量和联合自信息量之间的关系:
> $$\begin{equation}
\bbox{\begin{array}{c}
I\left( x_iy_j \right) =\displaystyle\frac{1}{\log _2P\left( y_j \right) P\left( x_i|y_j \right)}=I\left( y_j \right) +I\left( x_i|y_j \right)\\
\phantom{I\left( x_iy_j \right) }=\displaystyle\frac{1}{\log _2P\left( x_i \right) P\left( y_j|x_i \right)}=I\left( x_i \right) +I\left( y_j|x_i \right) \\
\end{array}}
\end{equation}$$
## 互信息量及其性质
### 互信息的定义
&emsp;&emsp;考虑信源 $X$、信宿 $Y$ 均为一维离散信源的情况,则 $y_i$ 对 $x_i$ 的互信息量定义为**后验概率与先验概率比值的对数**,即
$$\begin{equation}\begin{aligned}
I\left( x_i;y_j \right) &=\log _2\frac{P\left( x_i|y_j \right)}{P\left( x_i \right)}=\log _2\frac{1}{P\left( x_i \right)}-\log _2\frac{1}{P\left( x_i|y_j \right)}
\\
&=I\left( x_i \right) -I\left( x_i|y_j \right)
\end{aligned}\end{equation}$$
其中 $i=1,2,\cdots ,n; j=1,2,\cdots ,m$;信源发出消息 $x_i$ 的概率 $P\left( x_i \right)$ 称为**先验概率**;信宿收到 $y_i$ 后推测信源发出
的概率 $P\left( x_i|y_j \right)$ 称为**后验概率**。
| 观察角度 | 互信息量 | 含义 |
| :--: | :--------------: | :------------ |
| 接收端 | $$\begin{align}
I\left( x_i;y_j \right) &=\log _2\frac{1}{P\left( x_i \right)}-\log _2\frac{1}{P\left( x_i|y_j \right)} \nonumber \\
&\bbox{=I\left( x_i \right) -I\left( x_i|y_j \right) } \nonumber
\end{align}$$ | 两个不确定度之差是**不确定度被消除的部分**,即等于自信息量减去条件自信息量 |
| 发送端 | $$\begin{align}
I\left( y_j;x_i \right) &=\log _2\frac{1}{P\left( y_j \right)}-\log _2\frac{1}{P\left( y_j|x_i \right)} \nonumber \\
&\bbox{=I\left( y_j \right) -I\left( y_j|x_i \right) } \nonumber
\end{align}$$ | 观察者得知输入端发出 $x_i$ 前、后对输出端出现 $y_i$ 的不确定度的差 |
| 通信系统 | $$\begin{align}
I\left( x_i;y_j \right) &=\log _2\frac{1}{P\left( x_i \right) P\left( y_j \right)}-\log _2\frac{1}{P\left( x_iy_j \right)} \nonumber \\
&\bbox{=I\left( x_i \right) +I\left( y_j \right) -I\left( x_iy_j \right) } \nonumber
\end{align}$$ | 通信前,输入随机变量 $X$ 和输出随机变量 $Y$ 之间没有任何关联关系,即 $X$,$Y$ 统计独立;通信后,输入随机变量 $X$ 和输出随机变量 $Y$ 之间由信道的统计特性相联系
> 注:这三种表达式实际上是**等效的**,在实际应用中可根据具体情况选用一种较为方便的表达式。
### 互信息的性质
#### 对称性
$$
\bbox{I\left( x_i;y_j \right) =I\left( y_j;x_i \right) }
$$
互信息量反映两个随机事件的可能结果 $x_i$ 和 $y_i$ 之间的**统计约束程度**,从 $y_i$ 得到的关于 $x_i$ 的信息量 $I\left( x_i;y_j \right)$ 与从 $x_i$ 得到的关于 $y_i$ 的信息量 $I\left( y_i;x_j \right)$ 是一样的,只是观察的角度不同而已。
#### $X$ 和 $Y$ 相互独立时的互信息
$$\begin{align}
I\left( x_i;y_j \right) &=\log _2\frac{1}{P\left( x_i \right) P\left( y_j \right)}-\log _2\frac{1}{P\left( x_iy_j \right)} \nonumber \\
&\xlongequal{P\left( x_iy_j \right) =P\left( x_i \right) P\left( y_j \right)}0 \nonumber
\end{align}$$
$x_i$ 和 $y_i$ 之间不存在统计约束关系,从 $y_i$ 得不到关于 $x_i$ 的任何信息,反之亦然。
#### 互信息量可为正值或负值
- 当后验概率**大于**先验概率时,互信息量为**正**。
- 当后验概率**小于**先验概率时,互信息量为**负**[^NegativeInformation]。
[^NegativeInformation]: 收信者未收到 $y_i$ 以前,对消息 $x_i$ 是否出现的猜测难疑程度较小;但由于噪声的存在,接收到消息 $y_i$ 后对 $x_i$ 是否出现的猜测的难疑程度增加了,也就是收信者接收到消息 $y_i$ 后对 $x_i$ 出现的不确定性反而增加,所以获得的信息量为负值。
#### 条件互信息量
&emsp;&emsp;给定 $z_k$ 的条件下,$x_i$ 与 $y_i$ 之间的互信息量称为条件互信息量,记作
$$
\bbox{I\left( x_i;y_j|z_k \right) =\log _2\frac{P\left( x_i|y_jz_k \right)}{P\left( x_i|z_k \right)}} =\log _2\frac{1}{P\left( x_i|z_k \right)}-\log _2\frac{1}{P\left( x_i|y_jz_k \right)}
$$
消息 $x_i$ 与消息 $y_jz_k$ 之间的互信息量记作
$$
I\left( x_i;y_jz_k \right) =\log _2\frac{P\left( x_i|y_jz_k \right)}{P\left( x_i \right)}=\log _2\frac{1}{P\left( x_i \right)}-\log _2\frac{1}{P\left( x_i|y_jz_k \right)}
$$
则 $x_i$ 与 $y_jz_k$ 之间的互信息量可进一步表示为
$$
I\left( x_i;y_jz_k \right) =I\left( x_i;z_k \right) +I\left( x_i;y_j|z_k \right)
$$
即一个联合事件 $y_jz_k$ 发生后所提供的有关 $x_i$ 的信息量 ,等于 $z_k$ 发生后提供的有关 $x_i$ 的信息量 $I\left( x_i;z_k \right)$ 与给定 $z_k$ 条件下再出现 $y_i$ 后所提供的有关 $x_i$ 的信息量 $I\left( x_i;y_j|z_k \right)$ 之和。
## 信息熵
### 信息熵的定义
&emsp;&emsp;已知单符号离散无记忆信源的数学模型为
$$
\left[ \begin{matrix}
X\\ P\left( x \right)\\
\end{matrix} \right] =\left[ \begin{matrix}
a_i\\ P\left( a_i \right)\\
\end{matrix} \right]
$$
则定义信源的信息熵(也称为无条件熵、Shannon 熵、熵函数、熵),即各离散消息**自信息量的数学期望**,为信源的**平均自信息量**[^AverageSelfInformation],表示为
$$\begin{equation}
\bbox{H\left( X \right) =E\left[ \log _2\frac{1}{P\left( a_i \right)} \right] =-\sum_i{P\left( a_i \right) \log _2P\left( a_i \right)}\,\, \left( \mathrm{bit}/\text{符号} \right) }
\end{equation}$$
[^AverageSelfInformation]: 信源熵和平均自信息量两者在数值上是相等的,但含义并不相同。**信源熵表征信源的<u>平均不确定度</u>**,平均自信息量是消除信源不确定度所需要的信息的量度。信源一定,不管它是否输出离散消息,只要这些离散消息具有一定的概率特性,必有信源的熵值,这熵值在总体平均的意义上才有意义,因而是一个确定值。
### 信源熵三种物理含义
1. 信源熵 $H\left(X\right)$ 是表示信源输出**后**,每个消息/符号所提供的平均信息量;
2. 信源熵 $H\left(X\right)$ 是表示信源输出**前**,信源的平均不确定性;
3. 用信源熵 $H\left(X\right)$ 来表征变量 $X$ 的随机性。
@@ -0,0 +1,32 @@
---
title: Josh 的学习笔记之凸优化 (Part 1 —— 凸集)
mathjax: true
comments: true
copyright: true
sticky: false
toc:
enable: true
number: false
wrap: true
expand_all: true
max_depth: 4
categories:
- - Josh 的学习笔记
- 凸优化
tags:
- 凸优化
abbrlink: 43146ee9
date: 2022-03-29 11:07:04
---
# 仿射集合和凸集
&emsp;&emsp;设 $x_1 \ne x_2$ 是 $\mathbf{R}^n$ 空间中的两个点,则具有下列形式的点
$$
y = \theta x_1 + (1-\theta)x_2,\theta \in \mathbf{R}
$$
组成一条穿过 $x_1$ 和 $x_2$ 的**直线**(*line*). 参数 $\theta = 0$ 对应 $y=x_2$,$\theta = 1$ 表明 $y = x_2$. 参数 $\theta$ 的值在
<!-- more -->
@@ -0,0 +1,213 @@
---
title: MATLAB 函数 —— rcosdesign
tags:
- MATLAB
- 翻译
- 成型滤波器
- 滤波器
categories:
- - MATLAB
- - 翻译
- 帮助文档
mathjax: true
copyright: true
abbrlink: 5c45edfe
date: 2020-11-25 22:32:42
---
`rcosdesign`:升余弦 FIR 脉冲成型滤波器设计
# 语法
`b = rcosdesign(beta,span,sps)`
`b = rcosdesign(beta,span,sps,shape)`
<!-- more -->
# 说明
`b = rcosdesign(beta,span,sps)` 返回系数 `b`,该系数对应于具有由 `beta` 指定的衰减因子的平方根升余弦 FIR 滤波器。滤波器有 `span` 个符号,每个符号包含 `sps` 个样本。 滤波器的阶次,也即 `sps * span` 必须是偶数。滤波器的能量为 1。[举例](#Examples-01)
`b = rcosdesign(beta,span,sps,shape)` 根据 `shape` 返回不同的滤波器。当 `shape` 为 `sqrt` 时,将返回根升余弦滤波器;当 `shape` 为 `normal` 时,将返回升余弦 FIR 滤波器。[举例](#Examples-02)
# 示例
## 设计根升余弦滤波器<span id="Examples-01"></span>
将滚降系数设为 `0.25`,波器的符号数设为 `6`,每个符号 `4` 个采样点。验证 `sqrt` 是 `shape` 参数的默认值。
```m
h = rcosdesign(0.25,6,4);
mx = max(abs(h-rcosdesign(0.25,6,4,'sqrt')))
```
> <font face="Consolas">mx = 0</font><br>
```m
fvtool(h,'Analysis','impulse')
```
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-25-matlab-rcosdesign/2020-11-25-matlab-rcosdesign-010-DesignASquareRootRaisedCosineFilterExample-01.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
## 升余弦和根升余弦滤波器的脉冲响应<span id="Examples-02"></span>
将升余弦滤波器与根升余弦滤波器进行比较。一个理想的(无限长)升余弦脉冲成型滤波器等效于两个级联的理想的根升余弦滤波器。因此,FIR 升余弦滤波器的脉冲响应应类似于与其自身卷积的根升余弦滤波器的脉冲响应。
设计一个衰减为 `0.25` 的升余弦滤波器。指定滤波器有 `4` 个符号,每个符号 `3` 个采样点。
```m
rf = 0.25;
span = 4;
sps = 3;
h1 = rcosdesign(rf,span,sps,'normal');
fvtool(h1,'impulse')
```
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-25-matlab-rcosdesign/2020-11-25-matlab-rcosdesign-020-ImpulseResponsesOfNormalAndSquareRootRaisedCosineFiltersExample-01.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
**升余弦滤波器在 `sps` 的整数倍处具有零值点**。因此,它满足无码间串扰(ISI)的 Nyquist 准则。但是,根升余弦滤波器没有这样的特性:
```m
h2 = rcosdesign(rf,span,sps,'sqrt');
fvtool(h2,'impulse')
```
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-25-matlab-rcosdesign/2020-11-25-matlab-rcosdesign-030-ImpulseResponsesOfNormalAndSquareRootRaisedCosineFiltersExample-02.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
将根升余弦滤波器与自身进行卷积。在最大值处截断脉冲响应,使其长度与 `h1` 相同。使用最大值将响应归一化。然后,将卷积后的根升余弦滤波器与升余弦滤波器进行比较。
```m
h3 = conv(h2,h2);
p2 = ceil(length(h3)/2);
m2 = ceil(p2-length(h1)/2);
M2 = floor(p2+length(h1)/2);
ct = h3(m2:M2);
stem([h1/max(abs(h1));ct/max(abs(ct))]','filled')
xlabel('Samples')
ylabel('Normalized amplitude')
legend('h1','h2 * h2')
```
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-25-matlab-rcosdesign/2020-11-25-matlab-rcosdesign-040-ImpulseResponsesOfNormalAndSquareRootRaisedCosineFiltersExample-03.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
卷积响应的长度是有限的,因此根升余弦滤波器与自身进行卷积得到的结果会与升余弦滤波器不一致。增加 `span` 可以在响应之间获得更紧密的一致性,并更好地符合 Nyquist 准则。
## 将信号通过升余弦滤波器<span id="Examples-03"></span>
本例说明如何将信号通过根升余弦滤波器。
指定滤波器参数。
```m
rolloff = 0.25; % 滚降因子
span = 6; % 滤波器宽度(符号数)
sps = 4; % 每个符号的样本数
```
生成根升余弦滤波器的系数。
```m
b = rcosdesign(rolloff, span, sps);
```
生成双极性数据向量。
```m
d = 2*randi([0 1], 100, 1) - 1;
```
上采样并对数据进行滤波以实现脉冲成型。
```m
x = upfirdn(d, b, sps);
```
添加噪声。
```m
r = x + randn(size(x))*0.01;
```
对接收到的信号进行滤波和下采样以进行匹配滤波。
```m
y = upfirdn(r, b, 1, sps);
```
有关如何使用根升余弦滤波器对信号进行插值和抽取的信息,请参见使[用 RRC 滤波器进行插值和抽取](https://ww2.mathworks.cn/help/comm/ug/interpolate-and-decimate-using-rrc-filter.html)(Communications Toolbox)。
# 输入参数
## `beta` - 滚降系数
滚降系数,指定为不大于 `1` 的**实非负标量**。滚降系数决定滤波器的多余带宽。滚降系数为 `0` 时为矩形滤波器(brick-wall filter),滚降因子为 `1` 时为纯升余弦滤波器。
**数据类型**:`double` | `single`
## `span` - 符号数
符号数,指定为**正整数标量**。
**数据类型**:`double` | `single`
## `sps` - 每个符号的样本数
每个符号的样本数(上采样因子),指定为**正整数标量**。
**数据类型**:`double` | `single`
## `shape` - 升余弦滤波器的形状
升余弦滤波器的形状,指定为 `normal` 或 `sqrt`。
# 输出参数
## `b` - FIR 滤波器系数
升余弦滤波器的系数,以**列向量**的形式返回。
**数据类型**:`double` | `single`
# 提示
- 如果您拥有 Communications Toolbox™ 软件的许可证,则可以执行具有流传输行为的多速率升余弦滤波。为此,请使用 System object™ 滤波器——`comm.RaisedCosineTransmitFilter` 和 `comm.RaisedCosineReceiveFilter`。
# 参考
[1] Tranter, William H., K. Sam Shanmugan, Theodore S. Rappaport, and Kurt L. Kosbar. *Principles of Communication Systems Simulation with Wireless Applications.* Upper Saddle River, NJ: Prentice Hall, 2004.
# 扩展功能
## C/C++ 代码生成
> 使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
>
>> 用法说明和限制:
>>
>> 所有输入必须为常数。 如果表达式或变量的值不变,则也允许使用。
# 另请参阅
[`gaussdesign`](https://ww2.mathworks.cn/help/signal/ref/gaussdesign.html)
## 主题
[用 RRC 滤波器进行插值和抽取](https://ww2.mathworks.cn/help/comm/ug/interpolate-and-decimate-using-rrc-filter.html)(Communications Toolbox)
----
在 R2013b 中推出
----
原文参考:[https://ww2.mathworks.cn/help/signal/ref/rcosdesign.html](https://ww2.mathworks.cn/help/signal/ref/rcosdesign.html)
@@ -0,0 +1,92 @@
---
title: MATLAB 函数 —— gaussdesign
tags:
- MATLAB
- 翻译
- 成型滤波器
- 滤波器
categories:
- - MATLAB
- - 翻译
- 帮助文档
mathjax: true
copyright: true
abbrlink: a2967b00
date: 2020-11-26 15:56:26
---
`gaussdesign`:高斯 FIR 脉冲成型滤波器设计
# 语法
`h = gaussdesign(bt,span,sps)`
<!-- more -->
# 说明
`h = gaussdesign(bt,span,sps)` 设计一个低通 FIR 高斯脉冲成型滤波器,并返回滤波器系数向量 `h`。滤波器有 `span` 个符号,每个符号包含 `sps` 个样本。滤波器的阶次,也即 `sps * span` 必须是偶数。[举例](#Examples-01)
# 示例
## GSM GMSK 数字蜂窝通信系统的高斯滤波器<span id="Examples-01"></span>
指定用于传输比特位的调制是高斯最小频移键控(GMSK)脉冲。此脉冲的 3-dB 带宽等于比特率的 `0.3` 倍,滤波器的符号数为 `4`,每个符号 `8` 个采样点。
```m
bt = 0.3;
span = 4;
sps = 8;
h = gaussdesign(bt,span,sps);
fvtool(h,'impulse')
```
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-26-matlab-gaussdesign/2020-11-26-matlab-gaussdesign-010-GaussianFilterForAGSMGMSKDigitalCellularCommunicationSysExample-01.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
# 输入参数
## `bt` - 3-dB带宽符号时间积
3-dB 单边带带宽(以 Hz 为单位)和符号时间(以秒为单位)的乘积,指定为**正实标量**。较小的 `bt` 值会产生较大的脉冲宽度。
**数据类型**:`double` | `single`
## `span` - 符号数
符号数,指定为**正整数标量**(默认为 3)。
**数据类型**:`double` | `single`
## `sps` - 每个符号的样本数
每个符号周期的样本数(上采样因子),指定为**正整数标量**(默认为 2)。
**数据类型**:`double` | `single`
# 输出参数
## `h` - FIR 滤波器系数
高斯脉冲成型滤波器的 FIR 系数,以**行向量**的形式返回。系数已被归一化,因此标称通带增益始终为 1。
**数据类型**:`double` | `single`
# 参考
[1] Krishnapura, N., S. Pavan, C. Mathiazhagan, and B. Ramamurthi. “A baseband pulse shaping filter for Gaussian minimum shift keying.” *Proceedings of the 1998 IEEE International Symposium on Circuits and Systems*. Vol. 1, 1998, pp. 249–252.
[2] Rappaport, Theodore S. *Wireless Communications: Principles and Practice.* 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 2002.
# 另请参阅
[`rcosdesign`](https://ww2.mathworks.cn/help/signal/ref/rcosdesign.html)
---
在 R2013b 中推出
---
原文参考:[https://ww2.mathworks.cn/help/signal/ref/gaussdesign.html](https://ww2.mathworks.cn/help/signal/ref/gaussdesign.html)
@@ -0,0 +1,126 @@
---
title: MATLAB 函数 —— upsample(Signal Processing Toolbox)
tags:
- MATLAB
- 翻译
- 上采样
categories:
- - MATLAB
- - 翻译
- 帮助文档
mathjax: true
copyright: true
abbrlink: 3a606c9c
date: 2020-11-26 22:23:39
---
`upsample`:将采样率提高整数倍
# 语法
`y = upsample(x,n)`
`y = upsample(x,n,phase)`
<!-- more -->
# 说明
`y = upsample(x,n)` 通过在样本之间插入 `n - 1`个零来增加 `x` 的采样率。如果 `x` 是矩阵,则该函数将每一列视为单独的序列。[举例](#Examples-01)
`y = upsample(x,n,phase)` 指定未采样序列所偏移的样本数。
# 示例
## 提高采样率<span id="Examples-01"></span>
将序列的采样率提高 `3` 倍。
```m
x = [1 2 3 4];
y = upsample(x,3)
```
```no
y = 1×12
1 0 0 2 0 0 3 0 0 4 0 0
```
将序列的采样率增加 `3` 倍,并将相位偏移增加 `2`。
```m
x = [1 2 3 4];
y = upsample(x,3,2)
```
```no
y = 1×12
0 0 1 0 0 2 0 0 3 0 0 4 0
```
将矩阵的采样率提高3倍。
```m
x = [1 2;
3 4;
5 6];
y = upsample(x,3)
```
```no
y = 9×2
1 2
0 0
0 0
3 4
0 0
0 0
5 6
0 0
0 0
```
# 输入参数
## `x` - 输入数组
输入数组,指定为**向量**或**矩阵**。如果 `x` 是矩阵,该函数会将不同列向量视为独立的通道。
**举例**:`cos(pi/4*(0:159)) + randn(1,160)` 指定加有高斯白噪声的正弦曲线。
**举例**:`cos(pi./[4;2]*(0:159))' + randn(160,2)` 指定一个两通道的正弦波。
## `n` - 上采样因子
上采样因子,指定为**正整数**。
**数据类型**:`single` | `double`
## `phase` - 偏移量
偏移量,指定为从 `0` 到 `n - 1` 的**正整数**。默认为 `0`。
**数据类型**:`single` | `double`
# 输出参数
## `y` - 上采样数组
上采样数组,以**向量**或**矩阵**的形式返回。`y` 有 `x × n` 个样本。
# 扩展功能
## C/C++ 代码生成
> 使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
# 另请参阅
[`decimate`](https://ww2.mathworks.cn/help/signal/ref/decimate.html) | [`downsample`](https://ww2.mathworks.cn/help/signal/ref/downsample.html) | [`interp`](https://ww2.mathworks.cn/help/signal/ref/interp.html) | [`interp1`](https://ww2.mathworks.cn/help/matlab/ref/interp1.html) | [`resample`](https://ww2.mathworks.cn/help/signal/ref/resample.html) | [`spline`](https://ww2.mathworks.cn/help/matlab/ref/spline.html) | [`upfirdn`](https://ww2.mathworks.cn/help/signal/ref/upfirdn.html)
--------------------------------------------------------------------------------
在 R2006a 之前推出
--------------------------------------------------------------------------------
原文参考:[https://ww2.mathworks.cn/help/signal/ref/upsample.html](https://ww2.mathworks.cn/help/signal/ref/upsample.html)
@@ -0,0 +1,120 @@
---
title: Hexo NexT 主题不蒜子相关问题汇总
tags:
- 博客
- Hexo
- Next
categories:
- [Blog, Hexo, Next]
abbrlink: e96c9b26
date: 2020-11-27 11:15:21
---
# 什么是不蒜子
[不蒜子](https://busuanzi.ibruce.info/)是 [Bruce](http://ibruce.info/) 开发的一款轻量级的网页计数器,可以将网站访问计数直接显示在网页上。
# 启用不蒜子
NexT 预置了不蒜子提供的网页计数功能。只需要在配置文件中启用即可。
``` yaml next/_config.yml
# Show Views / Visitors of the website / page with busuanzi.
# Get more information on http://ibruce.info/2015/04/04/busuanzi
busuanzi_count:
enable: true # 启用不蒜子
total_visitors: true # 网站总访客数
total_visitors_icon: fa fa-user
total_views: true # 网站总浏览数
total_views_icon: fa fa-eye
post_views: true # 文章浏览数
post_views_icon: fa fa-eye
```
# 不蒜子和 Live2D 冲突的问题
<!-- more -->
> Hexo 版本:5.2.0
> NexT 版本:8.0.2
> 不蒜子版本: 2.3
## 问题描述
添加 Live2D 前的不蒜子显示情况如下。
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-27-hexo-next-busuanzi-issues/2020-11-27-hexo-next-busuanzi-issues-010-Live2D-01.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-27-hexo-next-busuanzi-issues/2020-11-27-hexo-next-busuanzi-issues-020-Live2D-02.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
添加 Live2D 后,不蒜子在页面中不显示。
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-27-hexo-next-busuanzi-issues/2020-11-27-hexo-next-busuanzi-issues-030-Live2D-03.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-27-hexo-next-busuanzi-issues/2020-11-27-hexo-next-busuanzi-issues-040-Live2D-04.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
## 问题原因
经查,添加 Live2D 后网页的不蒜子部分源码的 `style` 从 `"display: inline;"` 替换为了 `"display: none;"`。
``` html 不蒜子不正常显示的网页源码
<span class="post-meta-item" title="阅读次数" id="busuanzi_container_page_pv" style="display: none;">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text"> 阅读次数:</span>
<span id="busuanzi_value_page_pv">19</span>
</span>
```
``` html 不蒜子正常显示的网页源码
<span class="post-meta-item" title="阅读次数" id="busuanzi_container_page_pv" style="display: inline;">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text"> 阅读次数:</span>
<span id="busuanzi_value_page_pv">18</span>
</span>
```
## 解决方法
在网页生成引擎中修改代码,去掉不蒜子部分的 `id` 和 `style` 属性,重新生成网页即可解决该问题。若将 `class` 属性一并删除,会导不蒜子部分和前面的其他显示部分缺少分隔符,如下图。
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-27-hexo-next-busuanzi-issues/2020-11-27-hexo-next-busuanzi-issues-050-Delimeter-01.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
具体需要修改两个文件,`next/layout/_third-party/statistics/busuanzi-counter.swig` 中修改的是网页页脚部分的不蒜子显示,`next/layout/_macro/post.swig` 中修改的博客文章阅览数的不蒜子显示。
``` html next/layout/_third-party/statistics/busuanzi-counter.swig
{%- if theme.busuanzi_count.total_visitors %}
<span class="post-meta-item" id="busuanzi_container_site_uv" style="display: none;">
<!-- ... -->
</span>
{%- endif %}
<!-- ... -->
{%- if theme.busuanzi_count.total_views %}
<span class="post-meta-item" id="busuanzi_container_site_pv" style="display: none;">
<!-- ... -->
</span>
{%- endif %}
```
``` html next/layout/_macro/post.swig
{%- if not is_index and theme.busuanzi_count.enable and theme.busuanzi_count.post_views %}
<span class="post-meta-item" title="{{ __('post.views') }}" id="busuanzi_container_page_pv" style="display: none;">
<!-- ... -->
</span>
{%- endif %}
```
@@ -0,0 +1,151 @@
---
title: Josh 的学习笔记之 Verilog(Part 1 —— 初识 HDL 设计方法)
date: 2020-11-27 22:58:07
tags:
- Verilog
- HDL
- 硬件描述语言
- 行为级
- RTL
- 寄存器传输级
categories:
- [Verilog, Verilog 简介]
- [Josh 的学习笔记, Verilog]
mathjax: true
comments: true
copyright: true
sticky: false
toc:
enable: true
number: false
wrap: true
expand_all: true
max_depth: 4
abbrlink: 460433dd
---
本文阐述了 HDL 语言/设计方法的基本概念。主要介绍了数字系统建模方法的演变,引入了 HDL 语言的基本概念,对 Verilog HDL 和 VHDL、Verilog HDL 和 C 的联系与区别进行了说明,在最后引入了 HDL 的设计和验证流程,并对各个流程进行了简单介绍。
# 1. 设计方法的变迁<a name="01"></a>
随着微电子设计技术与工艺的发展,数字集成电路从电子管、晶体管、中小规模集成电路、超大规模集成电路(Very Large Scale Integrated Circuit, VLSIC)逐步发展到今天的专用集成电路(Application Specific Integrated Circuit, ASIC),愈发数字化的产品如计算机、手机、数字电视等都运用了复杂的专用数字集成电路。数字逻辑器件从简单的逻辑门到复杂的 SoC,种类繁多,提供了对复杂系统的灵活支撑。
<!-- more -->
随着数字电路系统的不断发展,系统的逻辑复杂度与规模日益增加,数字系统的设计方法也随之不断演进。早期简单的门逻辑设计阶段,EDA 工具应用范围十分有限,工程师们习惯于使用**{% label @卡诺图 %}**简化设计,然后通过面包板等实验系统验证设计;系统相对复杂后,工程师们借助 EDA 工具通过原理图描述数字系统。
{% note default %}
原理图由元件库中的元件构成,使用 EDA(Electronic Design Automation,电子设计自动化)工具可以对原理图进行仿真并分析其性能。
{% endnote %}
当数字系统发展到 ASIC 与 PLD(Programmable Logic Device,可编程逻辑器件) 设计阶段后,原理图不利于移植、维护费时费力等缺点逐步显现,这时需要抽象度更高、更灵活的设计方式 —— HDL(Hardware Description Language,硬件描述语言)。
使用 HDL 语言,可以从算法、系统级(System Level)、功能模块级(Functional Model Level)、行为级(Behavioral Level)、寄存器传输级(RTL, Register Transfer Level)、门级(Gate Level)到开关级(Switch Level)等不同层次描述数字电路系统,然后通过 EDA 工具综合、仿真并实现该系统。可以说 HDL 语言的出现是数字系统设计方法的一个重大飞跃。
数字电路系统设计方法的另一个重大飞跃是随着 EDA 工具的不断推陈出新发生的。早期 ASIC 和 PLD 设计时,人们需要直接描述 CMOS 的开关电路或门级电路,其设计量庞大,仿真速度也非常慢,像当今系统门数量为千万门级的 FPGA 用开关级或门级方法描述在当时是不可想象的。这时人们就希望能够使用 HDL 直接从更高的层次描述电路,然后使用 EDA 工具自动将高层次的 HDL 电路描述解析到门级,这些将大大节约设计与仿真时间,这个**{% label @从高层次的电路描述通过 EDA 工具解析到门级等低层次的电路描述的过程就叫“综合”(Synthesize),或者逻辑综合 %}**。
{% note default %}
综合工具能将高层次的 HDL 语言、原理图等设计描述翻译成由与、或、非门等基本逻辑单元组成的门级连接(**网表**)并根据设计目标与要求(约束条件)优化所生成的逻辑连接,输出门级网表文件。
{% endnote %}
目前最成熟的综合工具是 RTL 级综合工具,它能将 RTL 级描述翻译并优化为门级网表。综合工具的产生支撑了直接从 RTL 级描述硬件电路,这种从门级描述抽象到 RTL 级描述数字电路是设计方法的又一次伟大飞跃。
从上面描述可以看到 HDL 语言是分层次的,关于上述 HDL 语言设计层次的含义在 [3. HDL 的设计与验证流程](#03)小节和 [《Part 3——描述方式和设计层次》的 5. 设计层次](https://josh-gao.blog.csdn.net/article/details/105262549#5__1023)小节有详细论述。)
# 2. Verilog 语言的特点<a name="02"></a>
## 2.1. Verilog 的由来
Verilog 是 Verilog HDL 的简称。
{% note info %}
Verilog 语言最初于1983年由 Gateway Design Automation 公司开发,于1995年接受为 IEEE 标准。
{% endnote %}
Verilog 语言不仅定义了语法,而且对每个语法结构都清晰定义了仿真语义,从而便于仿真调试。而且 Verilog 从 C 语言继承了很多操作符和语法结构,对初学者而言易学易用。另外 Verilog 语言具有很强的扩展能力,最新的 Verilog 2001 标准[^1]大大扩展了 Verilog 的应用灵活性。
另外一个流行的 HDL 语言是 VHDL,其发展初期受到美国国防部支持,并于 1987 年成为 IEEE 标准。VHDL 语言的特点是描述严谨。
## 2.2. Verilog 和 VHDL
Verilog 和 VHDL 作为最为流行的 HDL 语言,从设计能力上而言都能胜任数字电路系统的设计任务。
VHDL 最初用作文档来描述数字硬件的行为,因此其**描述性和抽象层次更高**。也就是说,VHDL 更适合描述更高层次(如行为级、系统级等)的硬件电路。
Verilog 最初是为了更简洁有效地描述数字硬件电路和仿真而设计的,它的许多关键字与语法集成了 C 语言的体系,因此易学易懂,接受度很广。
前面已经提到最流行的 HDL 语言是 Verilog 和 VHDL。在其基础上发展出了许多抽象程度更高的硬件描述语言,如 SystemVerilog、Superlog、SystemC、CoWare C,这些高级 HDL 语言的语法结枃更加丰富,更适合做系统级、功能级等高层次的设计描述和仿真。
## 2.3. Verilog 和 C
Verilog 语言是根据 C 语言发明而来的,因此 Verilog 具备了 C 语言的简洁易用的特点。Verilog 从 C 语言中借鉴了许多语法,例如预编译指令和一些高级编程语言结构。
1. C 语言与 Verilog 的最大区别
C 语言与 Verilog 的最大区别在于 C 缺乏硬件描述的 3 个基本概念:
- **{% label primary @互连(connectivity) %}**:硬件系统中,互连是非常重要的组成部分,而在 C 语言中并没有直接可以用来表示模块间互连的变量;而 Verilog 的 `wire` 型变量配合一些驱动结构能有效地描述网线的互连。
- **{% label primary @并发(concurrency) %}**:C 语言天生是**串行**的,不能描述硬件之间并发的特性,C 语言编译后,其机器指令在 CPU 的高速缓冲队列中基本是顺序执行;而 Verilog 可以有效地描述并行的硬件系统,硬件系统比软件系统速度快、实时性高的一个重要原因就是硬件系统中**各个单元的运算是独立的,信号流是并行的**。
- **{% label primary @时间(time) %}**:C 程序运行的时候,没有一个严格的时间概念,程序运行的时间长短取决于处理器本身的性能;而 Verilog 语言本身定义了绝对和相对的时间度量,在仿真时可以通过时间度量与周期关系描述信号直接的时间关系。
2. HDL 语言的本质
硬件描述语言(HDL)同软件语言(如 C、C++ 等)是有本质区别的。Verilog 作为硬件描述语言,**它的本质作用在于描述硬件**。Verilog 虽然采用了 C 语言形式,但是它的最终描述结果是芯片内部的实际电路。所以评判一段 HDL 代码优劣的最终标准是其描述并实现的硬件电路的性能(包括面积和速度两个方面)。评价一个设计的代码水平较高,仅仅是说这个设计由硬件向 HDL 代码这种表现形式转换得更流畅、合理。而一个设计的最终性能更大程度上取决于设计工程师所构想的硬件实现方案的效率以及合理性。
{% note warning %}
初学者,特别是由软件转行的初学者,片面追求代码的整洁、简短,这是错误的,是与评价 HDL 的标准背道而驰的。正确的编写代码的方法是,首先要做到对所需实现的硬件电路“胸有成竹”,对该部分硬件的结构与连接十分清晰,然后再用适当的 HDL 语句表达出来即可。
{% endnote %}
3. Verilog 与 C 的结合
Verilog 毕竟是硬件描述语言,在抽象层次上比 C 语言要差一些,语法不如 C 灵活,例如文件输入和输出方面,Verilog 的功能显然不如 C。为了克服 Verilog 高级抽象的缺陷,Verilog 的设计者们发明了 PLI。PLI 可以在仿真器中将 C 语言的程序和 Verilog 的程序互相通信,或者在 Verilog 中调用 C 语言的函数库,这样就大大扩展了 Verilog 语言的灵活性和高层次抽象的能力。开发时,一方面,硬件设计者使用 Verilog 进行硬件建模;另一方面,验证工程师却常常使用 C 来编写测试向量,然后通过 Verilog 的 PLI 将 Verilog 和 C 联系起来。这样,C 语言就很好地弥补了 Verilog 高层次建模的缺陷。
# 3. HDL 的设计与验证流程<a name="03"></a>
HDL 的基本功能就是有效地描述并仿真硬件系统。在此部分,抛开具体的 PLD 或 ASIC 设计流程,从 HDL 语言层次入手,分析典型的 HDL 设计与验证流程。基于 HDL 的设计、仿真流程如下图所示。图中,虚线框表示的步骤可以根据项目的复杂度省略,而实线框表示的步骤为必须执行的步骤。
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-27-josh-verilog-part-1/2020-11-27-josh-verilog-part-1-010-DesignSimulationFlowChartBasedonHDL.png!800px"/>
</div>
下面对一些关键设计步骤与概念进行展开。
## 3.1. 系统与功能模块定义(系统与功能模块级)
在大型系统的设计与实现中,首先要进行详细的系统规划和描述,此时 HDL 描述 **{% label @侧重于整体系统的划分和实现 %}**。对系统级的仿真侧重于对整个系统的功能和性能指标的考量。功能模块级设计时将系统整体功能划分为可实现的具体功能模块,大致确定模块间的接口,如时钟、读写信号、数据流、控制信号等。在有些情况下,还要根据系统要求,描述每个模块或进程的时序约束。另外在此层次,必须权衡整个系统多种的实现方式的优劣,选出系统性能指标优并且可以高效实现的设计方案。功能模块级仿真主要是考察每个功能的功能和基本时序情况。系统与功能模块级设计与仿真常常要借助于 C 语言和抽象程度较高的 HDL 语言描述,如 SystemC、Coware C、SystemVerilog、Superlog 等。
## 3.2. 行为级描述测试激励(Behavioral Level)
行为级模块描述的最大特点是 **{% label @必须明确每个模块间的所有接口和边界 %}**。此时模块内部的功能已经明确,模块间的所有接口,顶层的输入、输出信号等在行为级已经被清晰地描述出来。在 PLD 和 ASIC 设计流程中,常用行为级描述方式编写测试激励。延时描述、监视描述等命令都是在编写测试激励过程中常用的行为级语法。行为级描述常用 HDL 语言如 Verilog 和 VHDL 等。
## 3.3. 寄存器传输级(RTL)
寄存器传输级指不关注寄存器和组合逻辑的细节(如使用了多少逻辑门,逻辑门之间的连接拓扑结构等),**{% label @通过描述寄存器到寄存器之间的逻辑功能描述电路 %}**的 HDL 层次。RTL 级是比门级更高的抽象层次,一般使用 RTL 级语言描述硬件电路比门级描述电路简单、高效得多。寄存器传输级描述的最大特点是可以直接用综合工具综合门级网表。RTL 设计直接决定着设计的功能和效率。好的 RTL 设计能在满足逻辑功能的前提下,使设计的速度和面积达到一种平衡的优化。RTL 级描述最常用的 HDL 语言是 Verilog 和 VHDL 语言。
## 3.4 对 RTL 级描述进行功能仿真
一般来说需要对 RTL 级设计进行功能仿真,仿真的目的为 **{% label @验证 RTL 级描述是否与设计意图一致 %}**。为了提高效率,一般功能仿真的测试激励使用行为级的 HDL 语言描述。
## 3.5. 逻辑综合(使用 RTL 级 EDA 工具)
RTL 级综合指 **{% label @将 RTL 级 HDL 语言翻译成由与、或、非门等基本逻辑单元组成的门级连接(网表),并根据设计目标与要求(约束条件)优化所生成的逻辑连接,输出门级网表文件 %}**。随着综合工具的不断智能化,使用 RTL 级语言描述硬件电路越来越方便,特别是在 PLD(主要指 FPGA 和 CPLD)设计领域,最重要的代码设计层次就是 RTL 级。
## 3.6. 门级(Gate Level)
由于目前 FPGA 设计大多数依靠专业综合工具完成从 RTL 级代码向门级代码的转换,所有设计者直接用 HDL 语言描述门级模型的情况越来越少,高效的综合工具将设计者从复杂繁琐的门级描述中彻底解脱出来。目前直接使用门级描述的场合一般是 ASIC 和 FPGA 设计中 **{% label @某些面积或时序要求较高的模块 %}**。门级描述的特点是整个设计用逻辑门实现,通过逻辑门的组合显化描述了设计的引脚、功能、时钟周期等所有信息。
## 3.7. 综合后门级仿真
综合完成后,如果需要检查综合结果是否与原设计一致,就需要做综合后仿真。在仿真时,把综合生成的标准延时文件反标注到综合仿真模型中去,可估计门延时带来的影响。综合后仿真虽然比功能仿真精确一些,但是**只能估计门延时,不能估计线延时**,仿真结果**与布线后的实际情况还有一定的差距**,并不十分准确。这种仿真的主要目的在于 **{% label @检查综合器的综合结果是否与设计输入一致 %}**。目前主流综合工具日益成熟,对于一般性设计,如果设计者确信自己表述明确,没有综合歧义发生,则可以省略综合后仿真步骤。**一般情况下,综合后仿真与功能仿真的仿真激励相同**。
## 3.8. 布局规划与布局布线
综合的门级结果最终要映射到目标库(如 ASIC 设计)或目标器件(如 PLD 设计)。ASIC 与 PLD 设计的相关流程在此不深究 。
## 3.9. 布局布线后时序仿真与验证
将最终布局规划或布局布线的时延信息反标注到设计网表中,所进行的仿真就叫时序仿真或布局规划与布局布线后仿真,简称后仿真。布局规划与布局布线之后生成的仿真时延文件包含的时延信息最全,不仅包含门延时,还包含实际布线延时,所以时序仿真最准确,能较好地反映芯片的实际工作情况。一般来说,建议进行时序仿真步骤,通过时序仿真能检查设计时序与芯片实际运行情况是否一致,确保设计的可靠性和稳定性。时序仿真的主要目的在于发现时序违规(Timing Violation),即不满足时序约束条件或者器件固有时序规则(建立时间、保持时间等)的情况。
[^1]: 最新的 Verilog HDL标准为 1364-2005。
+281
View File
@@ -0,0 +1,281 @@
---
title: MATLAB 函数 —— awgn
tags:
- MATLAB
- 翻译
- 高斯白噪声
categories:
- - MATLAB
- - 翻译
- 帮助文档
- - 信号处理
- 噪声
mathjax: true
copyright: true
abbrlink: 2f6db45b
date: 2020-11-27 01:15:12
---
`awgn`:在信号中添加高斯白斯噪声
# 语法
`out = awgn(in,snr)`
`out = awgn(in,snr,signalpower)`
`out = awgn(in,snr,signalpower,randobject)`
`out = awgn(in,snr,signalpower,seed)`
`out = awgn(___,powertype)`
<!-- more -->
# 说明
`out = awgn(in,snr)` 将高斯白噪声添加到矢量信号 `in` 中。此条语句假定 `in` 的功率为 0 dBW。
`out = awgn(in,snr,signalpower)` 接受以 dBW 为单位的输入信号功率值。要使该函数在添加噪声之前测量 `in` 的功率,请将 `signalpower` 指定为 `measured`。[举例](#Examples-01)
`out = awgn(in,snr,signalpower,randobject)` 接受满足前述两条语法,外加随机数流对象的输入组合以生成满足正态分布的随机噪声样本。有关产生可重复噪声样本的信息,请参见[提示](#tips)。[举例](#Examples-03)
`out = awgn(in,snr,signalpower,seed)` 指定用于初始化正态随机数生成器的种子值,该种子在添加高斯白噪声到输入信号时使用。有关产生可重复噪声样本的信息,请参见[提示](#tips)。
`out = awgn(___,powertype)` 除了前面任何语法中的输入自变量之外,还将可信号和噪声功率类型指定为 `dB` 或 `linear`。
有关 SNR 与噪声相对功率的其他度量(例如 $E_\mathrm{S}/N_0$ 和 $E_\mathrm{b}/N_0$)之间的关系,请参阅 [AWGN 信道噪声级别](https://ww2.mathworks.cn/help/comm/ug/awgn-channel.html#a1071501088)。
# 示例
## 将 AWGN 添加到锯齿波<span id="Examples-01"></span>
创建一个锯齿波。
```m
t = (0:0.1:10)';
x = sawtooth(t);
```
添加高斯白噪声并绘制结果。
```m
y = awgn(x,10,'measured');
plot(t,[x y])
legend('Original Signal','Signal with AWGN')
```
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-27-matlab-awgn/2020-11-27-matlab-awgn-010-AddAWGNToSawtoothSignalExample-01.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
## AWGN 信道中的常规 QAM 调制<span id="Examples-02"></span>
在存在高斯噪声的情况下,使用非矩形 16 元星座发送和接收数据。绘制噪声星座图,并针对两种不同的信噪比估算误符号率(SER)。
根据电话线调制解调器的 V.29 标准创建一个 16-QAM 星座。
```m
c = [-5 -5i 5 5i -3 -3-3i -3i 3-3i 3 3+3i 3i -3+3i -1 -1i 1 1i];
M = length(c);
```
生成随机符号。
```m
data = randi([0 M-1],2000,1);
```
使用 `genqammod` 函数调制数据。由于星座图不是矩形,因此必须进行常规 QAM 调制。
```m
modData = genqammod(data,c);
```
使信号通过具有 20 dB 信噪比(SNR)的 AWGN 信道。
```m
rxSig = awgn(modData,20,'measured');
```
显示接收信号的星座图和参考星座图。
```m
h = scatterplot(rxSig);
hold on
scatterplot(c,[],[],'r*',h)
grid
hold off
```
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-27-matlab-awgn/2020-11-27-matlab-awgn-020-GeneralQAMModulationInAnAWGNChannelExample-01.png?imageMogr2/thumbnail/!100p|watermark/2/text/QEpvc2ggR2Fv/fontsize/15/dissolve/60/gravity/southeast/dx/5/dy/5"/>
</div>
使用 `genqamdemod` 函数解调接收到的信号。计算误符号数和误符号率。
```m
demodData = genqamdemod(rxSig,c);
[numErrors,ser] = symerr(data,demodData)
```
```no
numErrors = 1
ser = 5.0000e-04
```
使用具有 10 dB SNR 的 AWGN 信道重复传输和解调过程。计算降低 SNR 后的误符号率。不出所料,当 SNR 降低时,性能会下降。
```m
rxSig = awgn(modData,10,'measured');
demodData = genqamdemod(rxSig,c);
[numErrors,ser] = symerr(data,demodData)
```
```no
numErrors = 462
ser = 0.2310
```
## 用 RandStream 产生可重复的 AWGN<span id="Examples-03"></span>
使用 [`RandStream`](https://ww2.mathworks.cn/help/matlab/ref/randstream.html) 和 [`reset`](https://ww2.mathworks.cn/help/matlab/ref/randstream.reset.html) 对象函数生成高斯白噪声相加的结果。
将 X 的功率指定为 0 dBW,添加噪声以产生 10 dB 的 SNR,并利用本地随机流。
```m
S = RandStream('mt19937ar','Seed',5489);
sigin = sqrt(2)*sin(0:pi/8:6*pi);
sigout1 = awgn(sigin,10,0,S);
```
将 AWGN 添加到 `sigin`。 使用 [`isequal`](https://ww2.mathworks.cn/help/matlab/ref/isequal.html) 比较 `sigout1` 和 `sigout2`。 当不重置随机流时,输出不相等。
```m
sigout2 = awgn(sigin,10,0,S);
isequal(sigout1,sigout2)
```
```no
ans = logical
0
```
重置随机流对象,将对象置为初始状态,然后再将 AWGN 添加到 `sigout1`。将 AWGN 添加到 `sigin` 并将 `sigout1` 与 `sigout3` 比较。 重置随机流后,输出相等。
```m
reset(S);
sigout3 = awgn(sigin,10,0,S);
isequal(sigout1,sigout3)
```
```no
ans = logical
1
```
# 输入参数
## `in` - 输入信号
输入信号,指定为**标量**,**向量**或**数组**。假定输入信号的功率为0 dBW。
**数据类型**:`double`
**复数支持**:是
## `snr` - 信噪比(SNR)
信噪比(以 dB 为单位),指定为**标量**。
{% note info %}
注意:
加上噪声后,此函数会将相同的 `snr` 应用于完整输入信号的所有元素。阵列输入信号没有独立通道的概念。 要独立考虑多个频道,请参阅 [`comm.AWGNChannel`](https://ww2.mathworks.cn/help/comm/ref/comm.awgnchannel-system-object.html)。
{% endnote %}
**数据类型**:`double`
## `signalpower` - 信号功率
信号功率,指定为**标量**或 `measured`。
- 当 `signalpower` 为标量时,该值用作 `in` 的信号电平,以便根据 `snr` 的值确定适当的噪声电平。
- 当 `signalpower` 为 `measured` 时,将计算 `in` 的信号电平,以根据 `snr` 的值确定适当的噪声电平。
{% note info %}
注意:
当指定 `measured` 时,此函数将使用完整输入信号的所有元素来计算信号功率。在计算功率时,阵列输入信号没有独立通道的概念。
{% endnote %}
**数据类型**:`double`
## `randobject` - 随机数流对象
随机数流对象,指定为 [`RandStream`](https://ww2.mathworks.cn/help/matlab/ref/randstream.html) 对象。 随机流对象的状态确定 [`randn`](https://ww2.mathworks.cn/help/matlab/ref/randn.html) 函数产生的数字序列。使用 [`reset (RandStream)`](https://ww2.mathworks.cn/help/matlab/ref/randstream.reset.html) 函数及其属性来配置随机流对象。
`wgn` 使用 [`randn`](https://ww2.mathworks.cn/help/matlab/ref/randn.html) 生成正常的随机噪声样本。[`randn`](https://ww2.mathworks.cn/help/matlab/ref/randn.html) 函数使用 [`RandStream`](https://ww2.mathworks.cn/help/matlab/ref/randstream.html) 对象中的一个或多个统一值来生成每个正态值。
有关产生可重复噪声样本的信息,请参见[提示](#tips)。
## `seed` - 随机数生成器种子
随机数生成器种子,指定为**标量**。
## `powertype` - 信号功率单元
信号功率单元,指定为 `dB` 或 `linear`。默认为 `dB`。
- 当功率类型为 `dB` 时,以 dB 为单位测量 snr,以 dBW 为单位测量信号功率。
- 当功率类型为 `linear` 时,`snr` 以比率进行测量,`signalpower` 以瓦特为单位。
有关 SNR 与噪声相对功率的其他度量(例如 $E_\mathrm{S}/N_0$ 和 $E_\mathrm{b}/N_0$)之间的关系,请参阅 [AWGN 信道噪声级别](https://ww2.mathworks.cn/help/comm/ug/awgn-channel.html#a1071501088)。
# 输出参数
## `out` - 输出信号
输出信号,以**标量**,**向量**或**数组**形式返回。 返回的输出信号是添加了高斯白噪声的输入信号。
# 提示<span id="tips"></span>
- 要生成可重复的高斯白噪声样本,请使用以下技巧之一:
- 提供静态 `seed` 值作为 `awgn` 的输入。
- 在将 `randobject` 传递为 `awgn` 的输入之前,请对 `randobject` 使用 [`reset (RandSteam)`](https://ww2.mathworks.cn/help/matlab/ref/randstream.reset.html) 函数。
- 将处于已知状态的 `randobject` 提供给 `awgn`。有关更多信息,请参见 [`RandStream`](https://ww2.mathworks.cn/help/matlab/ref/randstream.html)。
# 扩展功能
## C/C++ 代码生成
> 使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
>
>> 用法说明和限制:
>>
>> 支持代码生成,但包括 [`RandStream`](https://ww2.mathworks.cn/help/matlab/ref/randstream.html) 对象的语法除外。
# 另请参阅
## 函数
[`RandStream`](https://ww2.mathworks.cn/help/matlab/ref/randstream.html) | [`bsc`]([RandStream](https://ww2.mathworks.cn/help/matlab/ref/randstream.html)) | [`randn`](https://ww2.mathworks.cn/help/matlab/ref/randn.html) | [`wgn`](https://ww2.mathworks.cn/help/comm/ref/wgn.html)
## 对象
[`comm.AWGNChannel`](https://ww2.mathworks.cn/help/comm/ref/comm.awgnchannel-system-object.html)
## 话题
[AWGN Channel Noise Level](https://ww2.mathworks.cn/help/comm/ug/awgn-channel.html#a1071501088)
--------------------------------------------------------------------------------
在 R2006a 之前推出
--------------------------------------------------------------------------------
原文参考:[https://ww2.mathworks.cn/help/comm/ref/awgn.html](https://ww2.mathworks.cn/help/comm/ref/awgn.html)
@@ -0,0 +1,141 @@
---
title: Hexo-NexT 折腾就完事儿了
tags:
- 博客
- Hexo
- Next
categories:
- - Blog
- Hexo
- Next
abbrlink: b158f1b4
date: 2020-11-28 01:27:30
---
# 瞎折腾/~~美化~~侧边栏
在博客根目录下的 `source/_data` 文件夹中新建 `sidebar.swig` 文件。
## 添加 Tag Cloud
安装 `hexo-tag-cloud` 插件。
``` shell
npm install hexo-tag-cloud --save
```
添加相关代码写入 `sidebar.swig`。不喜欢标题的把 `<h3 class="widget-title">Tag Cloud</h3>` 去掉即可。
``` html source/_data/sidebar.swig
{% if site.tags.length > 1 %}
<script type="text/javascript" charset="utf-8" src="/js/tagcloud.js"></script>
<script type="text/javascript" charset="utf-8" src="/js/tagcanvas.js"></script>
<div class="widget-wrap">
<h3 class="widget-title">Tag Cloud</h3>
<div id="myCanvasContainer" class="widget tagcloud" style="font-size:20px;">
<canvas width="220" height="200" id="resCanvas" style="width=100%">
{{ list_tags() }}
</canvas>
</div>
</div>
{% endif %}
```
<!-- more -->
# 瞎折腾/~~美化~~页面
在博客根目录下的 `source/_data` 文件夹中新建 `variables.styl` 文件。
``` shell
cd hexo
vi source/_data/variables.styl
```
## 页面圆角
在 `variables.styl` 文件里添加圆角半径值
``` stylus source/_data/variables.styl
// 圆角设置
$border-radius-inner = 0px; // 内部圆角半径
$border-radius = 8px; // 外部圆角半径
```
# 需要修改源代码的操作
## 修改侧边栏最大高度
Sidebar 的高度在 `themes/next/source/js/util.js` 文件中计算出,修改计算公式可调整 Sidebar 的最大高度。
``` javascript themes/next/source/js/util.js - 原 Sidebar 最大高度
/**
* Init Sidebar & TOC inner dimensions on all pages and for all schemes.
* Need for Sidebar/TOC inner scrolling if content taller then viewport.
*/
initSidebarDimension: function() {
// ...
// Initialize Sidebar & TOC Height.
var sidebarWrapperHeight = document.body.offsetHeight - sidebarSchemePadding + 'px';
// ...
},
```
``` javascript themes/next/source/js/util.js - 修改后的 Sidebar 最大高度
initSidebarDimension: function() {
// ...
// Initialize Sidebar & TOC Height.
var sidebarWrapperHeight = document.body.offsetHeight - sidebarSchemePadding -100 + 'px';
// ...
},
```
- 参考文档:[Hexo Next 博客自定义配置 -> 更改-sidebar-大小](https://yi-yun.github.io/Hexo-Next-Custom/#更改-sidebar-大小https://yi-yun.github.io/Hexo-Next-Custom/#更改-sidebar-大小)
# 重装系统后配置 Hexo-Next
## 安装 Hexo 的支持环境
按照 [Hexo 官方文档](https://hexo.io/zh-cn/docs/index.html)的指导,Hexo 需要 [Node.js](http://nodejs.org/) (Node.js 版本需不低于 10.13,建议使用 Node.js 12.0 及以上版本) 和 [Git](http://git-scm.com/) 方可运行,因此首先需要下载安装 Node.js 和 Git。
### 生成 SSH 添加到 GitHub
使用 Git 之前需要配置用户名和邮箱,需要与 Github 用户名和邮箱一致。
``` shell
$ git config --global user.email "[email protected]"
$ git config --global user.name "Your Name"
```
然后创建 SSH,一路回车。
``` shell
$ ssh-keygen -t rsa -C "youremail"
```
生成的 `id_rsa` 是你这台电脑的私人秘钥,不能给别人看的,`id_rsa.pub` 是公共秘钥,可以随便给别人看。把这个公钥放在 GitHub 上,这样当你链接 GitHub 自己的账户时,它就会根据公钥匹配你的私钥,当能够相互匹配时,才能够顺利的通过 git 上传你的文件到 GitHub 上。
而后在 GitHub 的 setting 中,找到 SSH keys 的设置选项,点击 `New SSH key` 把你的 `id_rsa.pub` 里面的信息复制进去。
在 gitbash 中,查看是否成功
``` shell
$ ssh -T [email protected]
```
## 安装 Hexo
所有必备的应用程序安装完成后,即可使用 `npm` 安装 Hexo。
``` shell
$ npm install -g hexo-cli
```
## 安装 Next 用到的环境
### 安装 Pandoc
若文章中包含使用 [MathJax](https://www.mathjax.org/) 编译的公式,则需要首先安装 [pandoc](https://github.com/jgm/pandoc),才能编译包含公式的博客页面。
安装完后一定记得**重启**,方可正常使用。
@@ -0,0 +1,943 @@
---
title: Josh 的学习笔记之 Verilog(Part 2 —— Verilog 语言基础)
date: 2020-11-28 11:42:50
tags:
- Verilog
- HDL
- 自顶向下
- 自底向上
- Verilog 语法
categories:
- [Verilog, Verilog 语法]
- [Josh 的学习笔记, Verilog]
mathjax: true
comments: true
copyright: true
sticky: false
toc:
enable: true
number: false
wrap: true
expand_all: true
max_depth: 4
abbrlink: fd2ca242
---
本文从一个 Verilog 用例出发,对 Verilog 语言的语法进行了阐释。包括的内容主要有 Verilog 语言的基本词法,常用的编译指令,逻辑值、常量、变量的含义,操作符的概念和分类等,还对 Verilog 中的参数、并发以及系统任务和系统函数进行了简要说明。
# 1. 两种设计方法(Top-Down 和 Bottom-Up)
在传统意义上,设计硬件电路主要是使用自底向上(Bottom-Up)的设计方法。工程师们总是从最底层的逻辑门开始,逐渐搭建成较大的模块,然后再将这些模块组成更大的模块,最后形成整个设计。
在 [Part 1——初识 HDL 设计方法](https://josh-gao.top/posts/460433dd.html)中已经提到,随着 HDL 和逻辑综合技术的进步,工程师们逐渐可以使用自顶向下(Top-Down)的方法来设计硬件。这样,工程师们**首先关注于设计的规格(Specification),然后将规格分解为一个个模块,再分解为更小的模块**。然后采用 HDL 的可综合子集直接描述硬件的行为,由逻辑综合工具自动完成由 HDL 到门级电路的转换。
<!-- more -->
最近几年,随着 IP核 市场的逐渐兴起,许多设计者逐渐意识到**利用现有的 IP核 可以帮助节约设计成本、减少设计周期**,有许多设计工程师,甚至希望所有的设计模块都使用现成的模块,自己仅仅开发一些简单的粘合逻辑。这就有点像电路板设计的过程,工程师将各种芯片集成到一块电路板上,自己完成这些芯片间的互连和一些简单的 CPLD 逻辑设计,以及对微处理器的编程。使用现有的 IP 来搭建系统实际上也是一种自底向上(Bottom-Up)的设计方法。
从以上描述可以看出,设计硬件电路时,这两种设计方法都有可能采用。Verilog HDL 可以完全支持这两种设计方法。
- 在门级的设计中,用户可以直接实例化 Verilog 语言中的门级原语构建系统;
- 如果需要描述硬件的行为,可以使用 Verilog 的行为级描述功能;
- 如果要使用 IP核 ,只要在设计中直接实例化 IP核 即可。
EDA 行业的先行者们发明了 Verilog 硬件描述语言,其最根本的目的就是用 Verilog 来描述硬件的行为,但是有的描述是不需要实现为硬件电路的。
如果用户的 Verilog 描述的最终目的是要实现为硬件电路,那么要**时刻提醒自己是在设计电路**,这与用 C 语言对处理器编程有很大的区别。
硬件电路最大的特点是由一个个模块组成,模块之间使用互连线,各个模块**独立并行**工作。同时,它们通过输入和输出端口与相邻的模块互相沟通。每个硬件单元都有相应的**延时特性**,硬件的延时也是设计的目标之一。
# 2. 从 Verilog 实例出发
## 2.1. Verilog 实例
<a name="JoshVerilog模块"></a>首先看一个简单的如下图所示的电路(模块):JoshVerilog。它可以是一个独立的设计,也可以是更大的系统的一个组成部分。
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-28-josh-verilog-part-2/2020-11-28-josh-verilog-part-2-010-JoshVerilog.png!700px"/>
</div>
该电路首先在两个 2 位的输入数据 `A_in[1:0]` 的和 `B_in[1:0]` 之间,由 `sel` 信号做二选一。后面是一个 2-4 译码电路,将输入的信号 `result[1:0]`解析成 `eq0`、`eql`、`eq2` 和 `eq3` 这4个信号,它们同时只有一个为 1。
将 `eq0` 和 `eql` 相异或(xor),`eq2` 和 `eq3` 相异或。然后,将两个异或的结果 `A_xor_wire` 和 `XOR_B` 分别寄存输出给 `A_xor_out` 和 `B_xor_out` 两个输出寄存器带有低有效(active low)的异步复位端。
**这些电路单元都是同时并行工作的,相互之间并没有先后顺序关系,这一点与软件设计程序很不一样。**
下面具体分析 [JoshVerilog 模块](#JoshVerilog模块)的电路功能。源代码如下。
<a name="JoshVerilog代码"></a>
```verilog Josh.v
// 编译指令, 定义时间单位和时间精度
`timescale 1ns/100p // 每个时间单位是1ns, 仿真精度是100ps
// module名 + 端口列表
module Josh( clk, rst_n, A_in, B_in, sel, A_xor_out, B_xor_out );
// IO端口声明
input clk;
input rst_n;
input [1:0] A_in; // 该信号的输入位宽为2
input [1:0] B_in;
input sel;
output A_xor_out;
output B_xor_out;
// 内部线网和寄存器声明
wire A_xor_wire; // 模块内wire型变量
wire B_xor_wire;
wire [1:0] result;
reg eq0, eq1, eq2, eq3; // 模块内reg型变量
reg A_xor_out;
reg B_xor_out;
// 行为描述, DFF_A
always @(posedge clk or negedge rst_n)
if (~rst_n)
A_xor_out <= 0;
else
A_xor_out <= A_xor_wire;
// 行为描述, DFF_B
always @(posedge clk or negedge rst_n)
if (~rst_n)
B_xor_out <= 0;
else
B_xor_out <= B_xor_wire;
// 数据流描述, A_xor_wire
assign #1 A_xor_wire = eq0 ^ eq1;
// 结构化描述, XOR_B, 直接使用 Verilog 自带的 xor 门原句
xor #1 XOR_B(B_xor_wire, eq2, eq3);
// 数据流描述, MUX21
assign #3 result = sel ? B_in : A_in;
// 行为描述, DECODER, 一个2-4译码器
always @(result) begin
case(result)
2'b00: begin
{eq3, eq2, eq1, eq0} = #2 4'b0001;
$display ("At time %t-", $time, "eq0 = 1");
end
2'b01: begin
{eq3, eq2, eq1, eq0} = #2 4'b0010;
$display ("At time %t-", $time, "eq1 = 1");
end
2'b10: begin
{eq3, eq2, eq1, eq0} = #2 4'b0100;
$display ("At time %t-", $time, "eq2 = 1");
end
2'b11: begin
{eq3, eq2, eq1, eq0} = #2 4'b1000;
$display ("At time %t-", $time, "eq3 = 1");
end
default: ;
endcase
end
// module结束
endmodule
```
代码分析如下。
1. 二选一多路选择器
对于 `MUX21` 这样二选一的电路,将采用如下的数据流描述(assign语句):
```verilog Josh.v
assign #3 result = sel ? B_in : A_in;
```
`assign` 是 Verilog 中的关键词,用它赋值的语言称为**连续赋值语句**。
如果 `sel`为真(1),则选择 `B_in`,否则将选择 `A_in`,而 `#3` 表示经过 3 个延时单位,再将选择结果赋值给 `result`,这也模拟了组合逻辑的延时。由于在[代码](#JoshVerilog代码)最开头已经使用 Verilog 的编译指令将延时单位定义为 1ns(`timescale 1ns/100ps`),因此这里的 `#3` 代表 3ns 的延时。
2. 2 - 4 译码器
关于实现 2 - 4 译码器,则采用了如下的描述:
```verilog Josh.v
always @(result) begin
case(result)
2'b00: begin
{eq3, eq2, eq1, eq0} = #2 4'b0001;
$display ("At time %t-", $time, "eq0 = 1");
end
// ...
default: ;
endcase
end
```
这里采用了另一种描述方式:用 `always` 语句来描述电路的行为。通过 `case` 判断 `result` 的值来决定 `eq0`、`eq3` 的值。同样,也采用 `#2` 来模拟组合逻辑的延时。`always` 和 `case` 也是 Verilog 中的关键词。这样的描述方法称之为**行为描述**,它侧重于描述电路的行为。
```verilog Josh.v
{eq3, eq2, eq1, eq0} = #2 4'b0001;
```
该语句表示将 `4'b0001` 赋值给 `eq3~eq0` 合并成的 4 位变量。`{}` 是 Verilog 的合并符号。
3. 异或门
对于 `A_xor_wire` 和 `XOR_B` 的两个完全一样的异或门,也采用了两种不同的描述方式:
```verilog Josh.v
assign #1 A_xor_wire = eq0 ^ eq1;
```
和
```verilog Josh.v
xor #1 XOR_B(B_xor_wire, eq2, eq3);
```
`xor` 是 Verilog 中自带的基本逻辑门原语。这里相当于调用了该 `xor` 门。而 `B_xor_wire`、`eq2` 和 `eq3` 是代入到 `xor` 门中的参数。`eq2` 和 `eq3` 是输入,`B_xor_wire` 是输出。这里 `B_xor_wire` 是 `eq2` 和 `eq3` 相异或的结果。
在 Verilog 中,**将调用其他功能模块(包括 Verilog 的内嵌基本逻辑门)称为“实例化(lnstantiate)”**。实例化**类似**于软件设计中的调用,但不能简单理解为软件中的调用。软件调用过程是顺序执行的,而实例化的硬件电路在设计中是独立于其他功能块,并行运行的。
这种**在模块中实例化其他功能模块**的描述方式被称之为**结构化描述**。
## 2.2. 3 种描述方法
从以上的描述可以看出 Verilog 语言的 3 种基本的描述方法(基本上所有的 Verilog 功能模块都是由这 3 种方式来描述):
- **数据流描述**:采用 `assign` 语句,该语句被称为连续赋值语句;
- **行为描述**:使用 `always` 或 `initial` 语句块,其中出现的语句被称为过程赋值语句;
- **结构化描述**:实例化已有的功能模块。结构化描述主要有以下3种:
- Module实例化:实例化已有的 module;
- 门实例化:实例化基本的门电路原语;
- 用户定义原语(UDP)实例化:实例化用户定义的原语。
在[《Part 3——描述方式和设计层次》](https://josh-gao.blog.csdn.net/article/details/105262549)中会将详细介绍 Verilog 语言中的这 3 种描述方式。
# 3. Verilog 的基本词法
Verilog HDL 是一种**大小写敏感**的语言,这一点与 VHDL 不同,因此在书写的时候要格外注意。在 Verilog 语言中,**所有的关键字(又叫保留字)都为小写**。Verilog 的内部信号名(或称为标识符)使用大写和小写都可以。标识符可以是字母、数字、`$`(美元符号)和 `_`(下划线)任意组合,只要**第一个字符是字母或者下划线**即可。
> 因为 Verilog HDL 对大小写敏感,因此养成良好的信号定义习惯非常重要,否则容易因为大小写不同造成信号的歧义。推荐的信号定义习惯为:**所有信号和网线名均小写,用下划线分割单词,而宏变量全部用大写字母。**
在上述[代码](#JoshVerilog代码)中,用双反斜线 `//` 表示注释。另外,还有一种注释方式,用 `/* ...... */` 来表示。所不同的是前者为单行注释,而后者将 `/*` 和 `*/` 之间的内容全部看作注释内容。
> 通常,注释的内容只是作者为了增强代码的可读性而增加的内容,对整个代码的功能没有任何影响。不过,在一些工具中,尤其是逻辑综合工具,定义了一些特殊的指令,用于控制工具编译过程。这些指令也是以注释的方式出现的。例如:
>
> ```verilog
> moduleblbox(out, data, clk) /* synthesis syn_black_box */;
> ```
>
> 在 `modulebl_box` 的声明处有一行注释,用 `/* ...... */` 表示。它看起来是一个注释,实际上,是综合工具Synplify中的一个指令,指示 Synplify 将该模块看作一个黑盒(black_box),不处理模块内部的描述。
在 Verilog 中,通常使用空格符、跳格符和换行符作为间隔。在书写代码的时候,适当运用间隔符可以提高代码的可读性。比如在声明 4 个 `reg` 型数据 `eq0~eq3` 时,可以采用上述[例子](#JoshVerilog代码)中的方法:
```verilog Josh.v
reg eq0, eq1, eq2, eq3;
```
也可以用换行符将其分开:
```verilog
reg eq0;
reg eq1;
reg eq2;
reg eq3;
```
在verilog中,还有一些转义字符。比如 `\n` 表示换行符;`\t` 表示 Tab 键;防止引起歧义,就用 `\` 表示 `\` 符号本身等等。这里不再对 Verilog 的词法做过多的描述,更多可以参考 Verilog IEEE 国际标准([IEEE Std. 1364-2005](https://standards.ieee.org/standard/1364-2005.html))。
# 4. 模块和端口
大型设计往往是由一个个模块构成的。实际上,模块可大可小,大到一个复杂的微处理器系统,小到一个基本的晶体管,都可以作为一个模块来设计。例如,在上述代码中描述的 [JoshVerilog](#JoshVerilog代码) 就是一个模块。
在 Verilog 中,模块(module)是基本的组成单位。
> 通常,建议在一个 Verilog 文件中,只放一个 `module` 定义,而且使文件名称和 `module` 名称一致。这是一个良好的设计习惯。
以下是 Verilog 中 `module` 的基本语法:
```verilog
module 模块名称( 端口列表 );
// 声明:
reg, parameter,
input, output,
function, task, ...
// 语句:
initial 语句
always 语句
module 实例化
门实例化
用户定义原语 (UDP) 实例化
连续赋值 (Continous assignment)
endmodule
```
首先,需要有一个名称来标识这个 `module`。
通常 `module` 具有输入和输出端口,在 `module` 名称后面的括号中列出所有的输入、输出和双向的端口名称。
有些 `module` 也不包含端口。例如,在仿真平台的顶层模块中,其内部已经实例化了所有的设计模块和激励模块,是一个封闭的系统,没有输入和输出。一般这种没有端口的模块都是用于仿真的,不用作实际电路。
在 `module` 内部的声明部分,需要声明端口的方向,(`input`, `output` 和 `inout`)和位宽。按照 Verilog 的习惯,**高位写在左边,低位写在右边**。比如
```verilog
input [1:0] A_in;
```
就表示两位的总线。
模块内部使用的 `reg`(寄存器类型的一种)、`wire`(线网类型的一种)、参数、函数以及任务等,都将在 `module` 中声明。
一般来说,`module` 的
- `input` 默认定义为 `wire` 类型;
- `output` 信号可以是 `wire`,也可以是 `reg` 类型(如果在 `always` 或 `initial` 语句块中被赋值);
- `inout` 是双向信号,一般将其设为 `tri` 类型,表示其有多个驱动源,如无驱动时为三态。
虽然变量声明只要出现在使用的相应语句之间即可,但还是建议将所有的声明放在所有的语句之前,这样具有较好的可读性。在声明之后,就应该是语句了。语句有如下几种:
- `initial` 语句;
- `always` 语句;
- 其他子 `module` 实例化;
- 门实例化;
- 用户定义原语(UDP)实例化;
- 连续赋值(Continous assignment)。
Verilog 中所有的功能描述都是通过以上几种描述方式进行的。
> 需要格外注意的是,以上几种语句如果出现在同一个 `module` 内,其**相互之间是没有任何顺序关系的**,它们在 `module` 中出现顺序的改变不会改变 `module` 的功能,这正是硬件的一大特点。有硬件电路原理图设计经验的读者们可以想象一下画原理图的过程,先画哪个,后画哪个器件根本没有任何关系。在 Verilog 中也是类似的道理。
# 5. 编译指令
在 Verilog 语言中,提供了一些编译指令,用于指导编译器的工作。例如,定义宏、文件包含、条件编译、时间单位和精度定义等。
Verilog 中的编译指令是从 C 语言中的“预处理指令”演变得来的。这里列出了一些常用的编译指令如下:
- `` `timescale``;
- `` `define, `undef ``;
- `` `ifdef, `else, `endif``;
- `` `include``;
- `` `resetall``。
与 C 语言中使用的 `#` 不同,Verilog 中使用反引号一来标识编译指令。编译器一旦遇到某个编译指令,则其在整个编译过程中有效,可以包含多个文件,直到编译器遇到另一个相同的编译指令。
## 5.1. `` `timescale``
在每一个 `module` 文件前面加上`` ` ``的编译指令,就可以保证该文件中的延时信息受其自身文件中的 `` `timescale`` 编译指令指导。**否则在编译过程中,该模块将沿用上一个** `` `timescale`` **的值,或者使用缺省值**。
在上述实例代码中描述的 [JoshVerilog](#JoshVerilog代码) 模块中使用了一个`` `timescale 1ns/100ps`` 编译指令。其中 `1ns` 表示延时单位,`100ps` 表示时间精度,也就是编译器所能接收的最小仿真时间粒度。`` `timescale`` 编译指令在模块外部出现,并且影响后面模块中所有的时延值,直到遇到下一个 `` `timescale`` 或 `` `resetall``指令。
比如语句:
```verilog
assign #1.16 A_xor_wire = eq0 ^ eq1;
```
如果采用 `` `timescale 1ns/100ps`` 编译指令由于延时单位是 `1ns`,同时最小时间粒度是 `100ps`,即 `0.1ns` ,那么根据四舍五入的规则,`1.16ns` 则实际上对应 `1.2ns` 延时。如果采用 `` `timescale 1ns/10ps`` 编译指令,由于延时单位是 `1ns`,同时最小时间粒度是 `10ps`,即 `0.01ns`,那么 `1.16ns` 则实际上对应 `1.16ns` 延时。
## 5.2. `` `define`` 和 `` `undef``
`` `define`` 用于定义宏。例如,首先定义一个总线宽度的宏为 16,然后利用这个宏定义一个宽度为 16 的 `reg`类型数据 `Data`,方法如下:
```verilog
`define BUS_WIDTH 16
// ...
reg [`BUS_WIDTH - 1 : 0] Data
```
在一个文件中出现的 `` `define``,可以被多个文件使用。也就是说 `` `define`` 是一种**全局的定义**。这是 `` `define`` 与 `parameter` 定义的最大区别,在后面也会提到。
`` `define`` 指令被编译以后,则在整个编译过程中都有效,直到遇到 `` `undef`` 指令,该宏就不再有效。如下:
```verilog
`undef BUS_WIDTH
```
遇到该编译指令后,先前的 `` `define`` 指令失效。
## 5.3. `` `ifdef``、`` `else`` 和`` `endif``
再来看看如下的条件编译指令:
```verilog
`ifdef NARROW
parameter BUS_WIDTH = 16;
`else
paramete rBUS_WIDTH = 32;
`endif
```
在这个条件编译指令中,如果先前已经定义了 `NARROW` 宏,那么参数 `BUS_WIDTH` 被设置为 16,否则其被设置为 32。`` `else`` 指令对于 `` `ifdef`` 来说是可选的,也就是说可以单独使用。
## 5.4. `` `include``
在 Verilog 中,可以使用 `` `include`` 指令来嵌入某个文件的内容。例如:
```verilog
`include "HEADFILE.h"
```
那么,在编译的时候,就将使用 `HEADFILE.h` 文件中的内容完全替换这一行语句。而双引号中的文件可以使用相对路径,或绝对路径,或者默认在当前路径以下。
## 5.5. `` `resetall``
`` `resetall`` 编译指令会将所有其他编译指令重新设置为缺省值,要谨慎使用。
> Verilog 语言中的编译指令不止这几条,其他不常用的指令这里不一一介绍,有兴趣可以参考其他文献。
# 6. 逻辑值与常量
## 6.1. 逻辑值
在二进制计数中,单位逻辑值只有 `1` 和 `0` 两种状态。而在 Verilog 语言中,为了对电路进行精确建模,于是增加了两种逻辑状态 `X` 和 `Z`。
- `X` 表示未知值(unknown),或者不关心(don't care),`X` 用作信号状态时表示未知,用在条件判断时(在 `casex` 或 `casez`中)表示不关心;
- `Z` 表示高阻状态,也就是**没有任何驱动**,通常用来对**三态总线**进行建模。
在后面将提到 Verilog 语言中的变量类型。通常 `net` 型变量如果没有初始化,其值为 `Z`,`register` 型变量如果没有初始化,其值为 `X` 。这一点在仿真时显得比较有意义。
> 但是,对综合工具而言(或者说在实际电路中),并没有什么 `X` 值,只存在 `0`、`1` 和 `Z` 这 3 种状态。在实际电路中还可能出现亚稳态,它既不是 `0`,也不是 `1`,是一种暂时的不稳定状态。
Verilog 语言中所有数据都是由以上描述的 4 种基本的逻辑值 `0`、`1`、`X` 和 `Z` 构成。同时,`X` 和 `Z` 是不区分大小写的。例如:`0z1x` 和 `0Z1X` 表示同一个数据。
## 6.2. 常量
常量是 Verilog 中不变的数值。在上述[实例代码](#JoshVerilog代码)中,`4'b0001` 就表示一个 4 位的二进制整型常量:0001。
Verilog中的常量有3种:
- 整数型;
- 实数型;
- 字符串型。
### 6.2.1. 整型常量
可以使用简单的十进制表示一个整型常量,例如:
- `16` 表示十进制的 16;
- `-15` 表示十进制的 -15,用二进制补码表示,至少需要 5 位,即 10001,最高一位为符号位;如果用 6 位表示,则是 110001,同样最高一位为符号位。
整数型常量也可以采用基数表示法,例如:
- `8'haa`:表示 8 位的**十六进制数**,换算成二进制是 1010_1010。
- `6'o33`:表示 6 位的**八进制数**,换算成二进制是 011_011。
- `4'b1011`:表示 4 位的**二进制数** 1011。
- `3'd7`:表示 3 位**十进制**的 7。
在基数表示法中,都是以如下格式写的:
```verilog
[长度]'数值符号 数字
```
其中长度可有可无,数值符号中,`h` 表示十六进制,`o` 表示八进制,`b` 表示二进制,`d` 表示十进制数据。如果长度比后面数字的实际位数多,则**自动在数字的左边补足 0**;如果位数少,则**自动截断数字左边超出的位数**。
如果将数字写成 `'haa`,那么这个十六进制数的长度就决定于数字本身的长度。
在基数表示法中,如果遇到 `X`,十六进制数中表示 4 个 `X`,八进制数中表示 3 个 `X`。
另外,数字中的下划线没有任何意义,只是增强可读性。例如:`4'b1011` 和 `4'b10_11` 一样。
### 6.2.2. 实数型常量
Verilog 语言中的实数型变量可以采用十进制,也可以采用科学计数法,例如:
```verilog
5.512
13_2.18e2 // 表示13218
```
### 6.2.3. 字符串型常量
字符串是双引号中的字符序列,例如:`"HeIIo World"`。字符串是 8 位 ASCII 码值的序列,`"HeIIo World"` 就需要 11 字节存储,方法如下:
```verilog
reg[1:8 * 11] Message;
Message = "HeIIo World";
```
这样就将字符串常量存入到 Message 变量中。
# 7. 变量类型
在 Verilog 语言中,有两大变量类型:
- 线网型:表示电路间的物理连线。
- 寄存器型:Verilog 中的一个抽象的存储数据单元。
对于初学者而言,则需要首先遵守如下的简单规则:
- **凡是在** `always` **或** `initial` **语句中赋值的变量,一定是寄存器变量**;
- **在** `assign` **中赋值的一定是线网变量**。
## 7.1. 线网类型
在线网类型下,分为几种子类,它们具有线网的共性:
- `wire`、`tri`:表示电路间连线,`tri` 主要用于多驱动源建模;
- `wor`、`trior`:表示该连线具有“线或”功能;
- `wand`、`triand`:表示该连线具有“线与”功能;
- `trireg`:表示该连线具有总线保持功能;
- `tri1`、`tri0`:表示当无驱动时,连线状态为1(`tri1`)和0(`tri0`);
- `supply1`、`supply0`:分别表示电源和地信号。
在以上描述的线网类型中,除了 `trireg` 未初始化时为 `X` 以外,其余的未初始化时的值为 `Z`。
线网类型主要用在连续赋值语句中,以及作为模块之间的互连信号。
在后面的内容中会详细阐述常用线网类型的使用方法。
## 7.2. 寄存器类型
寄存器类型变量在 Verilog 语言中通常表示一个存储数据的空间。尤其是在 Verilog 仿真器中,寄存器类型变量通常占据一个仿真内存空间。
- `reg`:是最常用的寄存器类型数,可以是 1 位或者多位,或者是二维数组(存储器);
- `integer`:整型数据,存储一个至少 32 位
- `time`:时间类型,存储一个至少 64 位的时间值;
- `real`,`realtime`:实数和实数时间寄存器。
### 7.2.1 `reg` 类型
1. 寄存器类型数
`reg` 类型可以定位为一个寄存器,可以定义一位或者多位,例如:
```verilog
reg AB; // 定义一个名为 AB 的 1 位寄存器
reg [3:0] ABC; // 定义一个名为 ABC 的 4 位寄存器
```
在多位寄存器中,可以作“位选择”或“部分选择”,例如:
```verilog
ABC [3] = 1; // 将 ABC 的第 3 位赋值为 1
ABC [0] = 0; // 将 ABC 的第 0 位赋为 0
ABC [2:1] = 2'b01; // 将 ABC 的第 1、2 位赋值为 1 和 0
```
这样,整个 `ABC` 变量的值为 `4'b1010`。
2. 寄存器类型数组
`reg` 类型可以作为二维数组,也就是存储器,例如:
```verilog
reg [3:0] MEMABC [0:7]; // 定义一个存储器,地址为 0~7,每个存储单元是 4 位
```
与一维的 `reg` 变量不同的是,存储器中的存储单元不能再做位选择或部分选择,而每个单元可以单独赋值。比如:
```verilog
MEMABC[1] = 4'b0101; // 为 MEMABC 中的第 1 个存储单元赋值 4'b0101
```
同时,在 Verilog 中,不存可以对整个存储器赋值的语句,必须对每个单元独立赋值。除非使用 `$readmemb` 或 `$readmemh` 系统任务从文件中读入整个或者部分存储器的数据。
[comment]: <> (在第7章将讨论如何从文件中读入数据给存储器赋值。)
### 7.2.2. `integer` 类型
`integer` 变量通常用于高层次建模,也常用在 `for` 语句的索引中,例如:
```verilog
initial
begin: ACCESS
integer i;
for ( i = 0; i <= 7; i = i + 1 ) // 定义一个整数变量 i
MEMABC[i] = i // 遍历 0~7 地址
end
```
### 7.2.3. 其他寄存器类型
另外,`time` 变量用于存储和处理系统时间,`real` 和 `realtime` 用来存储实数和实数时间。
## 7.3. 变量的物理含义
这里需要引起重视,**“线网"变量可以理解为电路模块中的连线,但“寄存器"并不严格对应于电路上的存储单元**,包括触发器(flip-flop)或锁存器(latch)。从纯粹语言表达的语义角度来说,寄存器类型变量的值,从一个赋值到下一个赋值被保存下来,并且在仿真过程中会保持而不会丢失。
实际上,从语义上来讲,在 Verilog 仿真工具对语言进行仿真的时候,**寄存器类型的变量是占用仿真环境的物理内存的**,这与 C 语言中的变量类似。寄存器在被赋值后,便一直保存在内存中,保持该值不变,直到再次对该寄存器变量进行赋值。而**线网类型是不占用仿内存的**,它的值是由当前所有驱动该线网的其他变量(可以是寄存器或线网)决定的。这是寄存器和线网最大的区别,也是当初 Verilog 的发明者定义“线网”和“寄存器”变量的根本动机。
在下一小节中,将引入“驱动”和“赋值”两个概念,深入探讨两种变量的含义。
## 7.4. 驱动和赋值
为了更清楚地描述寄存器和线网变量的概念,将以上述[实例代码](#JoshVerilog代码)中的语句来说明。首先,引入Verilog 语言中两个重要的概念:驱动(Driving)和赋值(Assigning)。
- **线网是被驱动的,该值不被保持,在任意一个仿真步进上都需要重新计算**;
- **寄存器是被赋值的,且该值在仿真过程中被保持,直到下一个赋值的出现**。
在上述[实例代码](#JoshVerilog代码)中,定义了一个 `A_xor_wire` 的 `wire`,它是 `eq0` 和 `eq1` 相异或的结果。采用如下描述方式:
```verilog
assign #1 A_xor_wire = eq0 ^ eq1;
```
实际上,也可以采用如下的另一种描述方式:
```verilog
always @(eq0 or eq1)
A_xor_wire = #1 eq0 ^ eq1;
```
当然需要在 `module` 的声明处,将 `A_xor_wire` 首先定义成 `reg` 变量,而不是 `wire` 变量,即需要做如下定义:
```verilog
reg A_xor_wire
```
这两者描述的目的一样,都是一个异或门,如下图所示。
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-28-josh-verilog-part-2/2020-11-28-josh-verilog-part-2-020-XORGate.png!700px"/>
</div>
下面从语义上的角度探讨两种描述方式的不同。
第一种描述方式使用 `assign` 语句,Verilog 中将其称为连续赋值语句(Continously Assignment)实际上是**连续驱动**的过程。也就是说,在任意一个仿真时刻,当前时刻 `eq0` 和 `eq1` 相异或的结果决定了 `1ns` 以后(语句 `#1` 的延时控制)的线网变量 `A_xor_wire` 的值,**不管 `eq0` 和 `eq1` 变化与否,这个驱动过程一直存在**,因此称为连续驱动。(在仿真器中,线网变量是不占用仿真内存空间的。)如上[异或门图](#异或门)中的时序所示,这个驱动过程在任意时刻都存在。
在第二种描述方式中使用了 `always` 语句,后面紧跟着一个敏感列表:`@(eq0 or eq1)` 因此,这个语句只有在 `eq0` 或 `eq1` 发生变化时才会执行。如上[异或门图](#异或门)中,在时刻 2、3 和 6,该语句都将执行,将 `eq0` 和 `eq1` 赋值的结果延时 1ns 以后赋值给 `A_xor_wire` 变量。**在其他时刻,`A_xor_wire` 变量必须保持**。因此,**从仿真语义上讲,需要一个存储单元,也可以说是寄存器,来保存 `A_xor_wire` 变量的中间值**。这就是Verilog 语言的“寄存器类型”变量的来历,而这个 `A_xor_wire` 变量首先需要定义为 `reg` 类型。
不管采用哪种方式,所描述的是一样的组合逻辑电路。尤其是第二种描述,虽然其在语言中被定义为 reg 型,但并不是对应硬件上的触发器(flip-flop),而是 Verilog 语言仿真语义上的寄存器概念。
但是,在对实际电路中D触发器建模的时候,必须采用 `reg` 型的变量。下图是 D 触发器的模型。
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-28-josh-verilog-part-2/2020-11-28-josh-verilog-part-2-030-DFlipFlop.png!300px"/>
</div>
在上述[实例代码](#JoshVerilog代码)中相应的描述如下:
```verilog Josh.v
always @(posedge clk or negedge rst_n)
if (~rst_n)
A_xor_out <= 0;
else
A_xor_out <= A_xor_wire;
```
D 触发器只对时钟和复位(置位)敏感,因此在敏感列表中,列出了 `clk` 的上升沿和 `rst_n` 的下降沿。如果 `rst_n` 为 0,就对触发器的输出复位,否则在 `clk` 的时钟上升沿发生的时候,将输入的 `A_xor_wire` 寄存到触发器的输出端 `A_xor_out`。
这样的代码精确地描述了一个 D 触发器的行为。这里的 `reg` 变量就对应了硬件中的 D 触发器。
在叙述时,为了简单起见,常常将“驱动”和“赋值"都统一说成是赋值,但是一定要清楚其中的本质。
# 8. 参数
参数是一种常量,通常出现在 `module` 内部。它常常被用作定义状态机的状态、数据位宽和延时大小等等。例如:
```verilog
parameter and_delay = 2;
parameter xor_delay = 4;
```
**参数的值可以在编译时被改变**,因此它又**经常被用于一些参数可调的模块中**,让用户在实例化模块时,根据需要配置参数。
前面介绍的 `` `define`` 是一种全局的定义,而 `parameter` 是出现在模块内部的**局部定义**,而且可以被**灵活改变**,这是 `parameter` 的一个重要特征。
在[《Part 3——描述方式和设计层次》的 4.2 小节](https://josh-gao.blog.csdn.net/article/details/105262549#42__865)中会详细探讨改变模块参数的方法。
# 9. Verilog 中的并发与顺序
并行概念是硬件中的一个非常重要的概念,特别是初学者或软件工程师们需要重点理解。
与在处理器上运行的软件不同的是,**硬件电路之间的工作是并行的**。
为了描述硬件的并行性,Verilog 语言本身就具有并发的特性。在 Verilog 语言的 `module` 中,所有的描述语句(包括连续赋值语句,行为语句块:`always` 和 `initial`,模块实例化等)之间都是并行发生的。任何功能描述语句,在 Verilog 的 module 中的顺序都不重要。
但是,在语句块(`always` 和 `initial`)内部,则可以存在两种语句组:
- `begin ... end`:顺序语句组;
- `fork ... join`:并行语句组。
在 `begin ... end` 中存在的语句,按照 Veilog 的语义,应该是顺序执行的。而在 `fork ... join` 中的语句,则是并行执行的。
相比较顺序运行的事物,并行的事物比较难以理解和建模。同时,用于仿真的计算机是串行执行的,而 Verilog 语言本身的语义是用计算机进行模拟的语义,是用一种串行的语义来模拟并行的硬件。
Verilog 仿真器用来模拟硬件的并行行为的方式类似于软件中的多任务操作系统,在某个时刻只能执行一个任务,这样,不同的任务之间看起来是并行执行的。
后续将会重点介绍 Verilog 语言中的这一并行特性,同时阐述 Verilog 的高级仿真原理,希望能帮助大家领会 Verilog 的语义精髓。
# 10. 操作数、操作符和表达式
## 10.1. 操作符
操作符是操作数之间的运算符号。在介绍操作数之前,先来看看 Verilog 中的各种操作符。
| 操作符 | 含义 | 操作符 | 含义 |
| :-- | :-- | :-- | :-- |
| `+` | 一元加 | `>>` | 右移 |
| `-` | 一元减 | `<` | 小于 |
| `!` | 一元逻辑非 | `<=` | 小于等于 |
| `~` | 一元按位求反 | `>` | 大于 |
| `&` | 归约与 | `>=` | 大于等于 |
| `~&` | 归约与非 | `==` | 逻辑相等 |
| `^` | 归约异或 | `!=` | 逻辑不等 |
| `^~` 或 `~^`| 归约异或非 | `===` | 全等 |
| <code>&#124;</code> | 归约或 | `!==` | 非全等 |
| <code>~&#124;</code> | 归约或非 | `&` | 按位与 |
| `*` | 乘 | `^` | 按位异或 |
| `/` | 除以 | `^~` 或 `~^` | 按位异或非 |
| `%` | 取模 | <code>&#124;</code> | 按位或 |
| `+` | 二元加 | `&&` | 逻辑与 |
| `-` | 二元减 | <code>&#124;>&#124;</code> | 逻辑或 |
| `<<` | 左移 | `? :` | 条件操作符 |
其中,一元操作表示仅有一个操作数,二元操作表示有两个操作数。归约操作也是只有一个操作数,它是该操作数中的所有位之间的计算。
### 10.1.1. 算术操作符
| 操作符 | 表达式 | 说明
| :--: | :--: | :--: |
| `+` | `m + n` | 将 `n` 与 `m` 相加 |
| `-` | `m - n` | 将 `m` 减去 `n` |
| `-` | `-m` | 将 `m` 取反(二进制补码)|
| `*` | `m * n` | 将 `m` 与 `n` 相乘 |
| `/` | `m / n` | 将 `m` 除以 `n` |
| `%` | `m % n` | 对 `m / n` 求模 |
### 10.1.2. 按位操作符
| 操作符 | 表达式 | 说明
| :--: | :--: | :--: |
| `~` | `~m` | 将 `m` 的每个位取反 |
| `&` | `m & n` | 将 `m` 的每个位与 `n` 的相应位相与
| <code>&#124;</code> | <code>m &#124; n</code> | 将 `m` 的每个位与 `n` 的相应位相或
| `^` | `m ^ n` | 将 `m` 的每个位与 `n` 的相应位相异或
| `~^`<br>`^~` | `m ~^ n`<br>`m ^~ n` | 将 `m` 的每个位与 `n` 的相应位相异或非
### 10.1.3. 归约操作符
| 操作符 | 表达式 | 说明
| :--: | :--: | :--: |
| `&` | `&m` | 将 `m` 中的所有位相与(1位结果) |
| `~&` | `~&m` | 将 `m` 中的所有位相与非(1位结果) |
| <code>&#124;</code> | <code>&#124;m</code> | 将 `m` 中的所有位相或(1位结果) |
| <code>~&#124;</code> | <code>~&#124;m</code> | 将 `m` 中的所有位或非(1位结果) |
| `^` | `^m` | 将 `m` 中的所有位异或(1位结果) |
| `~^`<br>`^~` | `~^m`<br>`^~m` | 将 `m` 中的所有位相异或非(1位结果) |
### 10.1.4. 逻辑操作符
| 操作符 | 表达式 | 说明
| :--: | :--: | :--: |
| `!` | `!m` | `m` 是否不为真?(1 位 真/假结果) |
| `&&` | `m && n` | `m` 和 `n` 是否都为真?(1位 真/假结果) |
| <code>&#124;&#124;</code> | <code>m &#124;&#124; n</code> | `m` 或 `n` 是否为真?(1位 真/假结果) |
### 10.1.5. 相等操作符
| 操作符 | 表达式 | 说明
| :--: | :--: | :--: |
| `==` | `m == n` | `m` 和 `n` 相等吗?(1 位 正确/错误结果) |
| `!=` | `m != n` | `m` 和 `n` 不等吗?(1 位 正确/错误结果) |
> 相等操作符仅比较逻辑 1 和 0。
### 10.1.6. 全等操作符
| 操作符 | 表达式 | 说明
| :--: | :--: | :--: |
| `===` | `m === n` | `m` 和 `n` 全等吗?(1 位 正确/错误结果) |
| `!==` | `m !== n` | `m` 和 `n` 不全等吗?(1 位 正确/错误结果) |
### 10.1.7. 关系操作符
| 操作符 | 表达式 | 说明
| :--: | :--: | :--: |
| `<` | `m < n` | `m` 小于 `n` ?(1 位 正确/错误结果) |
| `>` | `m > n` | `m` 大于 `n` ?(1 位 正确/错误结果) |
| `<=` | `m <= n` | `m` 小于等于 `n` ?(1 位 正确/错误结果) |
| `>=` | `m >= n` | `m` 大于等于 `n` ?(1 位 正确/错误结果) |
### 10.1.8. 逻辑移位操作符
| 操作符 | 表达式 | 说明
| :--: | :--: | :--: |
| `<<` | `m << n` | 将 `m` 左移 `n` 位 |
| `>>` | `m >> n` | 将 `m` 右移 `n` 位 |
### 10.1.9. 条件操作符
| 操作符 | 表达式 | 说明
| :--: | :--: | :--: |
| `? :` | `sel ? m : n` | 如果 `sel` 为真,选择 `m`,否则选择 `n` |
### 10.1.10. 连接复制操作符
| 操作符 | 表达式 | 说明
| :--: | :--: | :--: |
| `{ }` | `{m,n}` | 将 `m` 和 `n` 连接起来,产生更大的向量 |
| `{{ }}` | `{n{m}}` | 将 `m` 重复 `n` 次 |
在以上描述的操作符之间有优先级之分,下表体现了不同的操作数优先级由高到低排列。
| 操作符 | 优先级 |
| :--: | :--: |
| `!`、`~`、`+`、`-`(一元)| 最高优先级
| `*`、`/`、`%` | $\vdots$
| `+`、`-`(二元)| $\vdots$
| `<<`、`>>`| $\vdots$
| `<`、`<=`、`>`、`>=` | $\vdots$
| `==`、`!=`、`===`、`!==` | $\vdots$
| `&`、`~&` | $\vdots$
| `^`、`~^`| $\vdots$
| <code>&#124;</code>、<code>~&#124;</code>| $\vdots$
| `&&` | $\vdots$
| <code>&#124;&#124;</code>| $\vdots$
| `? :` | 最低优先级
> 例如:`A + B & C + D` 就表示 `(A + B) & (C + D)`,而不是 `A + (B & C) + D`。
## 10.2. 二进制数值
在讨论操作数之前,先来看看二进制数中如何表示有符号数和无符号数。
例如,在一个 6 位二进制整形变量中,
- 无符号数能表示的范围是:`0~63`;
- 有符号数采用二进制补码(Two's complement)方式,能表示的范围是:`-32~31`。其中二进制的最高位表示符号,最高位为 1 表示该数是负数,为 0 表示该数是正数。
这里对具体的编码方式不过多介绍,但学过数字电路的同学必须掌握二进制中无符号数和有符号数的表示方法,以及计算的机制。
## 10.3. 操作数
在 Verilog 语言中,操作数可以是如下几种:
- 常数;
- 参数;
- 线网;
- 寄存器;
- 向量的位选择;
- 向量的部分选择;
- 存储器单元;
- 系统函数或用户自定义函数调用的返回值。
在选择操作数时,需要用户尤其注意的是操作数的极性。通常在 Verilog 中,无符号数用以下3种形式存在:
- 线网变量;
- 一般寄存器变量;
- 基数格式表示形式的整数常数。
而有符号数有:
- 整型寄存器变量;
- 十进制形式的整型常量。
首先讨论常量,如果采用基数格式表示一个数,例如:`-4'd12`,其二进制表示方式是:`1111_1111_1111_1111_1111_1111_1111_0100`(`1100` 的补码),由于基数格式的整数为无符号数,因此`-4'd12` 的值就是十进制的 `429496728`。
当采用普通十进制数来表示 `-12` 的时候,虽然它的二进制表示方式与上面的数相同,但 `-12` 是一个有符号数,它在运算时就表示十进制的 `-12`。
这里定义两个变量,一个是无符号的 `reg` 型,另一个是有符号的整型:
```verilog
reg [4:0] Opreg; // 一个 5 位的 reg 型,存储无符号数
integer Opint; // 一个 32 位的 integer 型,存储有符号数
```
做如下运算:
```verilog
Opreg = -4d'12/4; // Opreg 被赋值 29,(-4d'12/4)的最低5位
Opint = -4d'12/4; // Opint 被赋值为 1073741821,共 32 位
Opreg = -12/4; // Opreg 被赋值29,(-12/4)的最低5位
Opint = -12/4; // Opint 被赋值为 -3,采用 32 位的二进制补码表示方式
```
通过以上的计算结果可以看出,无符号数和有符号数的算术运算非常不同,用户在设计常量和变量并用它们计算的时候,一定要搞清楚它们中哪些表示有符号数,哪些表示无符号数,这很重要。
# 11. 系统任务和系统函数
在 Verilog 语中,预先定义了一些任务和函数,用于完成一些特殊的功能,它们被称为系统任务和系统函数。Verilog 能提供的系统任务和系统函数类型如下:
- 显示任务(display task);
- 文件输入/输出任务(file I/O task);
- 时间标度任务(timescale task);
- 拟控制任务(simulation control task);
- 时序验证任务(timing check task);
- PLA建模任务(PLA modeling task);
- 机建模任务(stochastic modeling task);
- 实数变换函数(conversion functions for real);
- 概率分布数(probabilistic distribution function)。
由于 Verilog 的系统任务和函数种类很多,在这里,只重点介绍一些常用的内容,希望通过介绍可以能让大家迅速掌握,灵活使用。相信通过以下的介绍,大家可以举一反三,通过参考 Verilog 的语法文献,迅速查找到需要的系统任务和函数,完成需要的功能。
## 11.1. 显示任务
`$display` 是显示任务,通常用来显示变量值、字符串,以及仿真时间等信息。
在 [JoshVerilog 模块](#JoshVerilog代码)中使用了这样的系统任务。
```verilog Josh.v
$display ("At time %t-", $time, "eq0 = 1"); // 显示时间
```
其中,双引号中的是字符串,`%t` 是时间格式。`$time` 是产生模拟时间的系统函数,它的返回值显示在字符串中的 `%t` 位置。
再如:
```verilog
$display("The value of ABC is %d", ABC); // 显示当前 ABC 变量的值
```
其中,`%d` 表示十进制数。`ABC` 的值显示在字符串中的 `%d` 位置。
## 11.2. 文件输入出任务
系统函数 `$fopen` 用于打开一个文件,并返回一个整数的文件指针。然后,`$fdisplay` 就可以使用这个文件指针向文件中写入信息。写完后,则可以使用 `$fclose` 这个系统关闭这个文件。例如:
```verilog
integer Write_Out_File; // 定义一个文件指针
Write_Out_File = $fopen("Write_Out_File.txt");
$fdisplay(Write_Out_File, "@ %h\n%h", Mpi_addr, Data_in);
$fclose(Write_Out_File);
```
以上的语法,将 `Mpi_addr` 和 `Data_in` 分别显示在 `@ %h\n%h` 中两个 `%h` 的位置,写入 `Write_Out_File` 指针所指的文件 `Write_Out_File.txt` 中。
用户可以通过 `$readmemb` 或者 `$readmemh` 来从文件中读入数据,但是这个文件中的数据格式是一定的。例如:
```verilog
reg [7:0] DataSource [0:47];
$readmemh ("Read_In_File.txt, DataSource);
```
就是将 `Read_In_FiIe` 文件中数据读入到 `DataSource` 数组中,然后就可以直接使用。
`Read_In_File` 数据文件的格式,可以参考如下写法:
```verilog
@2f
24
@2e
81
// ...
```
其中,`@2f` 表示地址,是十六进制;`24` 表示该地址的数据,以此类推。
## 11.3. 其他系统任务和数
1. 仿真控制任务
Verilog 中有一些仿真控制任务,例如:
`$finish` 表示使仿真器退出。
`$stop` 使仿真挂起。
2. 时序验证任务和仿真时间函数
Verilog 仿真器也可以检查设计时序,以及返回当前仿真时间,例如:
`$setup` 系统任务用来检查建立时间。
`$hold` 系统任务用来检查保持时间。
`$time` 系统函数用来返回一个64位的模拟时间。
3. 概率分布函数
`$random` 系统函数可以用来返回一个32位的有符号整型随机数。
需要注意的是,**系统任务/函数只可以在 Verilog 仿真器中运行,仅仅对代码仿真有意义**,综合和布线工具将忽略所有的系统任务和函数。
除了系统任务和系统函数之外,VeriIog还允许用户自己定义任务和函数。关于自定义的任务和函数的特点及使用方法,请参考后续的相关内容。
---
在本篇笔记中,以一个实例为出发点,系统介绍了 Verilog 的基本语法,相信能为大家深入学习 Verilog 语言打下坚实的基础。
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,164 @@
---
title: Lost - Cher Lloyd
mathjax: true
comments: true
copyright: true
sticky: false
toc:
enable: true
number: true
wrap: true
expand_all: true
max_depth: 4
tags:
- Cher Lloyd
- Music
- 2020
- Pop
categories:
- [Music, Cher Lloyd]
abbrlink: 8cb867fe
date: 2020-12-15 11:35:17
---
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=420 height=86 src="//music.163.com/outchain/player?type=2&id=1443007197&auto=0&height=66"></iframe>
| | "Lost" |
|:--:|:------------:|
| Cover | <img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/Album%20Cover/Cher%20Lloyd/Cher%20Lloyd-Lost-Cover.jpg" width=300px/> |
| Singer | Cher Lloyd |
| Album Type | Single
| Released | 24 April 2020 |
| Length | 2:55 |
| Label | Universal, Polydor |
| Songwriter(s) | Raphaella, Casey Smith, Patrick Jordan-Patrikios, Boy Matthews, Youthonix, Cher Lloyd |
| Producer(s) | Hitimpulse |
<!-- more -->
"Lost" is a song by English singer Cher Lloyd from her upcoming third studio album. Released on April 24, 2020,[^1] under Universal Music Group, the song is the second single released off of Lloyd's upcoming album, following "M.I.A" in 2019.[^2] An accompanying video directed by Raja Virdi was released on April 24.[^3] Writing for The Guardian, Leonie Cooper said: "There is something heartening about this largely harmless return."[^4]
# Background and production
After releasing her album Sorry I'm Late in 2014, Lloyd went on a musical hiatus before releasing several songs between 2016 and 2019. After signing a new record deal with Polydor Records & Universal Music Germany, she released "None of My Business" in 2018 and "M.I.A" in 2019. 2020 brought "Lost" which was teased for a week before being released in April.[^5]
The song was written by Raphaella, Casey Smith, Patrick Jordan-Patrikios, Boy Matthews, Youthonix & Cher Lloyd while it was mixed and mastered by Lex Barkey. Hitimpulse produced the song and have been consistent collaborators with Cher doing production on 2018's "None Of My Business" and additional production on 2019's "M.I.A".[^6]
# Critical Reception
Mike Wass of Idolator called the song a "cute bop" stating "Cher Lloyd returns with a fiery kiss-off anthem called 'Lost', which is the musical equivalent of posturing on social media so your ex can see how amazing your life is."[^7] While Pip Williams writing for The Line Of Best Fit stated "Lost" is far and away the strongest release of Lloyd's career to date, blowing those who still reference "Swagger Jagger" as a career high out of the water. The new cut sees Lloyd embrace languid balladry as a vehicle for a surprisingly hard-hitting lyric. It's still slickly produced and radio-friendly, but there's a heart and soul to it that many mainstream stars would struggle to match."[^8]
# Music video
The official video to the single premiered on YouTube the day of release. The video was shot in a single take with no cuts or edits made, depicting Lloyd on a bed with neon and pastel lights changing behind her as she sings. Lloyd commented in an Instagram Livestream that the lighting was the most difficult aspect of filming the video. The video was produced by Phase Films and directed by frequent collaborator Raja Virdi who worked on her previous single "M.I.A".[^9]
<div align="center">
<iframe width="560" height="315" src="https://www.youtube.com/embed/DDw1aCfaUxI" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
# Lyrics
<font size="3" face="Comic Sans MS, Comic Sans, cursive">
[Verse 1]<br>
I heard from a friend of a friend<br>
That you've been checking back in, Mhm-mhm<br>
'Cause I said goodbye, moved overnight<br>
And you haven't heard much since then<br>
Wondering how I'm doing now<br>
<br>
[Pre-Chorus]<br>
It's none of your business, first of all<br>
Wondering how I'm doing now<br>
But if you've got to know, well sure<br>
Well sure<br>
<br>
[Chorus]<br>
You think I'd be lost<br>
Think I'd be lost without you, lost<br>
Is it hard knowing you're wrong?<br>
See I got lots without you, lots without you<br>
<br>
[Post-Chorus]<br>
Great sex in the morning, sex in the morning, someone to hold me<br>
I got lo-oh-oh-oh-oh, lots<br>
Stay out in the nighttime, out in the nighttime, have me a wild time<br>
I got lo-oh-oh-oh-oh, lots<br>
<br>
[Verse 2]<br>
You heard from a friend of a friend<br>
That I've been doing just fine, I-I<br>
You don't want me, you just want me<br>
To keep wanting you all of the time<br>
But if you were wondering<br>
<br>
<br>
[Pre-Chorus]<br>
It's none of your business first of all<br>
Wondering how I'm doing now<br>
But if you've got to know, well sure<br>
Well sure<br>
<br>
[Chorus]<br>
You think I'd be lost<br>
Think I'd be lost without you, lost<br>
Is it hard knowing you're wrong?<br>
See I got lots without you, lots without you<br>
<br>
[Post-Chorus]<br>
Great sex in the morning, sex in the morning, someone to hold me<br>
I got lo-oh-oh-oh-oh, lots (Yeah)<br>
Stay out in the nighttime, out in the nighttime, have me a wild time<br>
I got lo-oh-oh-oh-oh, lots<br>
<br>
[Bridge]<br>
To be honest, I think I dodged a bullet with you<br>
And I don't know how I didn't see it coming, but ooh<br>
<br>
[Verse 3]<br>
Yeah, you got a God complex<br>
Now I'm thanking God you're my ex<br>
I hope you don't trip up on yourself<br>
If you think you're so hot, go back to hell (Go back to hell)<br>
'Cause you think that I'd...<br>
<br>
<br>
[Chorus]<br>
You think I'd be lost (Be lost, be lost)<br>
Think I'd be lost without you, lost<br>
Is it hard knowing you're wrong? (Knowing you're wrong)<br>
See I got lots without you, lots without you<br>
<br>
[Post-Chorus]<br>
Great sex in the morning, sex in the morning, someone to hold me<br>
I got lo-oh-oh-oh-oh, lots (Yeah)<br>
Stay out in the nighttime, out in the nighttime, have me a wild time<br>
I got lo-oh-oh-oh-oh, lots<br>
<br>
[Outro]<br>
La-la-la-la-la-la-la-la-la<br>
La-la-la-la-la-la-la-la-la
</font>
# Reference
- ["Lost (Cher Lloyd song)"](https://en.wikipedia.org/wiki/Lost_(Cher_Lloyd_song)). Retrieved November 15, 2020.
- [Cher Lloyd Lost Lyrics](https://genius.com/Cher-lloyd-lost-lyrics). Retrieved November 15, 2020.
[^1]: ["Cher Lloyd on Instagram: "My new single LOST is OUT NOW!!!! Head to the link in my bio to listen / download / share!! The official video will be premiered at 5pm uk…""](https://www.instagram.com/p/B_WvduVnFKg/). Instagram. Retrieved August 27, 2020.
[^2]: ["Cher Lloyd Returns With 'M.I.A.,' an Anthem For Your Post-Party Plans - Billboard"](https://www.billboard.com/articles/columns/pop/8532778/cher-lloyd-mia). Retrieved September 25, 2020.
[^3]: ["Cher Lloyd - Lost (Official Music Video) - YouTube"](https://www.youtube.com/watch?v=DDw1aCfaUxI). *www.youtube.com*. Retrieved September 24, 2020.
[^4]: ["Tracks of the week reviewed: Katy J Pearson, Cher Lloyd, the 1975 - The Guardian"](https://www.theguardian.com/music/2020/may/08/katy-j-pearson-track-of-week). Retrieved September 25, 2020.
[^5]: ["Cher Lloyd teases 'Lost'"](https://www.instagram.com/p/B-95yOQnXXR/?utm_source=ig_web_copy_link). Retrieved September 25, 2020.
[^6]: ["Hitimpulse Official Spotify Playlist of songs produced/written by them"](https://open.spotify.com/playlist/5lhDKO2VX6QzjO1RFoHKZT?si=LfBWWAIWTUm5Vc2igV5yWg). Retrieved September 25, 2020.
[^7]: ["Cher Lloyd Sizzles in one take 'Lost' video"](https://www.idolator.com/7909784/cher-lloyd-sizzles-in-one-take-lost-video?view-all). Retrieved September 25, 2020.
[^8]: ["Cher Lloyd is bigger than the bullshit - The Line Of Best Fit"](https://www.thelineofbestfit.com/features/interviews/cher-lloyd-is-bigger-than-the-bullshit). Retrieved September 25, 2020.
[^9]: ["Raja Virdi Music Videos"](https://rajavirdi.com/promos). Retrieved September 25, 2020.
@@ -0,0 +1,91 @@
---
title: Latex Miscellanea
mathjax: true
comments: true
copyright: true
sticky: false
toc:
enable: true
number: true
wrap: true
expand_all: true
max_depth: 4
tags:
- Latex
- 排版
categories:
- - Latex
- 版式
abbrlink: 5da41bb3
date: 2021-02-27 15:58:53
---
本文主要记录一些使用 LaTex 过程中碰到的问题与解决办法。
<!-- more -->
# 文档类及基本设置
# 文本格式
# 版式
## 分栏
### 全文单栏
在文档类声明时使用 `onecolumn`。
```latex
\documentclass[onecolumn]{ctexart}
```
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2021-02-27-latex-multicolum/2021-02-27-latex-multicolum-010-AllOneColumn.png" width=600px alt="全文单栏效果图"/>
</div>
### 全文双栏
在文档类声明时使用 `twocolumn`。
```latex
\documentclass[twocolumn]{ctexart}
```
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2021-02-27-latex-multicolum/2021-02-27-latex-multicolum-020-AllTwoColumn.png" width=600px alt="全文双栏效果图"/>
</div>
### 部分双栏
使用宏包 `multicol`,创建双栏环境。
```latex
\documentclass[twocolumn]{ctexart}
\usepackage{multicol}
\begin{document}
复杂的室内环境造成定位信号的衰减,如何提高对弱信号成功捕获能力成为定位接收机研究的关键技术。
本文讨论的是基于地面移动广播网络的时分码分正交频分复用(Time \& Code Division-Orthogonal Frequency Division Multiplexing,TC-OFDM)信号体制接收机面临的弱信号捕获问题。
\begin{multicols}{2}
通过对TC-OFDM信号系统仿真分析和传统弱信号捕获算法对比,提出了一种新 型的差分相干累加弱信号捕获算法;该算法采用一种差分相干累加损耗的补偿方法,能够有效提高捕获相对峰值,从而实现对弱信号的有效捕获。
实验结果表明,在低信噪比的条件下,该算法能够提高TC-OFDM定位接收机捕获弱信号能力 1-2dB,从而提高弱信号的捕获概率。
\end{multicols}
\end{document}
```
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2021-02-27-latex-multicolum/2021-02-27-latex-multicolum-030-PartTwoColumn.png" width=600px alt="部分双栏效果图"/>
</div>
### 参考
[如何用 latex 分双栏(分两列)](https://segmentfault.com/a/1190000019462299?utm_source=tag-newest)
# 数学公式
# 浮动环境
+195
View File
@@ -0,0 +1,195 @@
---
title: Josh 的学习笔记之多抽样率信号处理 (Part 1 —— 抽样率转换)
mathjax: true
comments: true
copyright: true
sticky: false
toc:
enable: true
number: true
wrap: true
expand_all: true
max_depth: 4
tags:
- 抽样率转换
- 抽取
- 内插
- 分数被抽样
categories:
- - Josh 的学习笔记
- 多抽样率信号处理
abbrlink: e1b609bc
date: 2021-12-08 15:28:38
---
# 本文要点
- 什么是抽取?什么是内插?两者的作用分别是什么?
- 抽取、内插前后信号在时域和频域如何变化?
- 抗混叠滤波器和除镜像滤波器的原理和作用是什么?
- 如何实现分数倍抽样率转换?
- 如何利用 MATLAB 实现抽样率转换?
&emsp;&emsp;多抽样率信号处理的研究对象是不同抽样率[^ChineseofSampling]下的信号,其中抽样率转换 (Sampling Rate Conversion, SRC) 是核心问题之一。早期的抽样率转换通常采用模拟方法,即将给定的抽样信号通过数模转换器 (Digital-to-Analog Converter, DAC) 转换成模拟信号 (连续时间信号),再对该模拟信号进行新的抽样,经模数转换器 (Analog-to-Digital Converter, DAC) 得到所需的抽样信号。而随着数字电路的普及和数字信号处理技术的发展,采用数字方法,即直接在离散时间域上完成抽样率转换已成为当前的主要方式。相比于模拟方法,数字方法不需要进行D/A和A/D转换,降低了系统的复杂度,同时避免了由量化、编码等过程产生的失真问题。
&emsp;&emsp;本文首先回顾采样的概念;随后介绍抽样率转换的两个基本运算单元,即抽取和内插;进而讨论如何利用抽取和内插实现分数倍抽样率转换;最后介绍抽样率转换在 MATLAB 上的实现。
[^ChineseofSampling]: 又称采样率,在本文中,“采样”与“抽样”涵义相同,两者经常交换使用。
<!-- more -->
# 采样
&emsp;&emsp;采样 (sampling) 是将连续时间信号转换成离散时间信号的过程。设连续时间信号 $x_c(t)$, 现对其进行均匀采样 (uniform sampling),即每隔时间 $T$ 取一个点,于是得到一组离散点列, 记作
$$\begin{equation}
x\left[ n \right] =\left. x_c\left( t \right) \right|_{t=nT}=x_c\left( nT \right)
\end{equation}
$$
称 $x_c\left( nT \right)$ 为 $x_c\left( t \right)$ 的采样信号,其中 $T$ 为采样间隔,$F_s = 1/T$ 称为采样率或抽样率 (sampling rate) ,单位为 Hz。
&emsp;&emsp;傅里叶变换是信号分析与处理的重要工具。定义连续时间信号的傅里叶变换为
$$\begin{equation}
X_c\left( j\Omega \right) =\int_{-\infty}^{\infty}{x_c\left( t \right) e^{-j\Omega t}\mathrm{d}t}
\end{equation}$$
其中 $\Omega$ 为模拟角频率 (analog radian frequency) ,单位为 $\text{rad/s}$,即 $\Omega = 2\pi F$,其中 $F$ 为信号的实际频率,单位为 Hz。
&emsp;&emsp;下面分析采样信号与原始连续时间信号 (下简称原始信号) 的频谱关系。注意到采样信
号可表示为原始信号与脉冲序列的乘积,即
$$\begin{equation}
X_c\left( nT \right) =x_c\left( t \right) \sum_{n=-\infty}^{\infty}{\delta \left( t-nT \right)}
\end{equation}$$
对上式作傅里叶变换,记采样信号的频谱为 $X_s\left( j\Omega \right)$,原始信号的频谱为 $X_c\left( j\Omega \right)$,同时注意到脉冲序列的傅里叶变换依然是脉冲序列,根据卷积定理可知,采样信号与原始信号的频谱具有如下关系:
$$\begin{equation} \label{1}
X_s\left( j\Omega \right) =\frac{1}{2\pi}X_c\left( j\Omega \right) \ast \frac{2\pi}{T}\sum_{n=-\infty}^{\infty}{\delta \left( \Omega -n\Omega _s \right)}=\frac{1}{T}\sum_{n=-\infty}^{\infty}{X_c\left( j\left( \Omega -\Omega _s \right) \right)}
\end{equation}$$
其中 $\Omega_s = \displaystyle\frac{2\pi}{T}=2\pi F_s$ 为采样角频率 (亦简称为采样率) 。
&emsp;&emsp;式 $\eqref{1}$ 说明,采样信号的频谱是将原始信号频谱以 $\Omega_s$ 进行周期延拓,且幅度变为原来的 $1/T$,[图 1.1](#图1.1) 给出了该过程的示意图。显然,若采样率过低则会造成相邻周期的频谱交叠在一起产生失真,这种现象称为混叠 (aliasing)。为避免混叠,采样率应大于信号最高频率的 2 倍。在此条件下,通过适当选取一个低通滤波器,可以从采样信号的频谱恢复出原始信号的频谱。这就是著名的 Nyquist-Shannon 采样定理。
<span id="图1.1"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2021-12-08-josh-msp-part-1/2021-12-08-josh-msp-part-1-010-RelationshipBetweenSampledSignalandAnalogSignal.png" width=500px alt="图1.1 采样信号与模拟信号的关系"/>
</div>
**定理 1.1 (Nyquist-Shannon 采样定理)** 设 $x\left(t\right)$ 是带限信号,频带范围为 $\left(-\Omega_M,\Omega_M\right)$。如果采样率满足
$$
\Omega_s > 2\Omega_M
$$
则 $x\left( t \right)$ 可以从其采样信号 $x\left( nT \right)$ 重建:
$$\begin{equation}
x\left( t \right) =\sum_{n=-\infty}^{\infty}{x\left( nT \right) \frac{T\sin \left( \Omega _c\left( t-nT \right) \right)}{\pi \left( t-nT \right)}}
\end{equation}$$
其中 $\Omega_c$ 为理想低通滤波器的截止频率,$\Omega _M\leqslant \Omega _c\leqslant \Omega _s-\Omega _M$。特别地,若取 $\Omega_c = \displaystyle\frac{\Omega_s}{2} = \frac{\pi}{T}$,则重建公式为
$$\begin{equation}
x\left( t \right) =\sum_{n=-\infty}^{\infty}{x\left( nT \right) \mathrm{sinc}\left( \frac{t-nT}{T} \right)}
\end{equation}$$
&emsp;&emsp;上述分析过程只涉及连续时间信号的傅里叶变换,而注意到采样信号本质上是离散时间信号,通常采用离散时间傅里叶变换 (DTFT) 分析更为方便。定义 $x\left[ n \right]$ 的离散时间傅里叶变换
$$\begin{equation} \label{Definition of DTFT}
X\left( e^{j\omega} \right) =\sum_{n=-\infty}^{\infty}{x\left[ n \right] e^{-j\omega n}}
\end{equation}$$
其中 $\omega$ 为归一化角频率 (normalized radian frequency) 或数字角频率,单位为 $\mathrm{rad}$,其与模拟角频率的关系为 $\omega = \displaystyle\frac{\Omega}{F_s} = \frac{\Omega}{T}$。
&emsp;&emsp;对比式 $\eqref{Definition of DTFT}$ 与 $\eqref{Relationship between the spectrum of the sampled signal and the original signal}$,易知
$$\begin{equation}
X\left( e^{j\omega} \right) =\left. X_s\left( j\Omega \right) \right|_{\Omega =\frac{w}{T}}
\end{equation}$$
上式表明,$X\left( e^{j\omega} \right)$ 的频率坐标轴进行了归一化,两者本质上描述的都是采样信号的频谱。注意到 $X\left( e^{j\omega} \right)$ 是以 $2\pi$ 为周期的,通常选取一个完整周期 (例如 $\left[-\pi,\pi\right]$) 进行分析即可。
&emsp;&emsp;对于离散时间信号,经常还会使用z变换进行分析。定义 $x\left[ n \right]$ 的 $z$ 变换为
$$\begin{equation}
X\left( z \right) =\sum_{n=-\infty}^{\infty}{x\left[ n \right] z^{-n}}
\end{equation}$$
当 $z = e^{j\omega}$ 时,$z$ 变换即为离散时间傅里叶变换。
&emsp;&emsp;本文假定读者对以上提及的变换及相关的变换域分析方法十分熟悉,因此不再过多阐述,相关内容可参阅数字信号处理教材。
# 整数倍抽取
&emsp;&emsp;当信号的数据量较大时,为了减少数据量,便于计算和存储,我们希望降低采样率。这可以通过抽取(decimation)来实现,即从原采样信号中均匀地抽出一些点,形成新的采样信号。具体而言,设抽取前的信号为 $x\left( nT_1 \right) $,现每隔 $D − 1$ 个点抽取一个点,其中 $D$ 为整数,称为抽取因子,于是得到抽取后的信号 $y_D\left( nT_2 \right) $。易知两者的关系为
$$\begin{equation}\label{1.2.1}
y_D\left( nT_2 \right) =x\left( nDT_1 \right)
\end{equation}$$
其中 $T_1$、$T_2$ 分别为抽取前后的采样间隔,且 $T_2 = DT_1$。[图 1.2(a)](#图1.2) 给出了 $D=3$ 时抽取过程的示意图。
<span id="图1.2"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2021-12-08-josh-msp-part-1/2021-12-08-josh-msp-part-1-020-DecimationDemostration.png" width=500px alt="图1.2 抽取"/>
</div>
&emsp;&emsp;上述关系也可以简记为
$$\begin{equation}\label{1.2.2}
y_D\left[ n \right] =x\left[ Dn \right]
\end{equation}$$
事实上,式 $\eqref{1.2.1}$ 与 $\eqref{1.2.2}$ 是等价的。第一种记法明确了信号所处的采样率 (即采样间隔的倒数),这种记法有利于分析一些复杂的多抽样率网络。而第二种记法符合离散时间信号的表示习惯,也更为简便。在本文中,两种记法经常交替使用。值得注意的是,在使用第一种记法时应遵照信号实际的采样率,避免产生歧义。例如,如果将 $y_D\left( nT_2 \right)$ 写成 $y_D\left( nDT_1 \right)$,尽管从数学形式上来看似乎没什么问题 (因为 $T_2 = DT_1$),但由于 $y_D$ 实际所处的采样率为 $F_2 = 1/T_2$,而 $y_D\left( nDT_1 \right)$ 意味着采样率为 $F_1 = 1/T_1$,违背了实际的物理意义。同理,$x\left( nDT_1 \right) $ 也不能写成 $x\left( nT_2 \right)$。
&emsp;&emsp;抽取只是降低信号的采样率,不会改变信号的幅值,故也称为下采样(downsampling)。实现抽取过程的单元称为抽取器(decimator),记为 $\boxed{\downarrow D}$ ,如[图 1.2(b)](#图1.2) 所示。
&emsp;&emsp;下面分析信号抽取前后的频域关系。不妨假设 $x\left[ n \right]$、$y_D\left[ n \right]$ 均是由某个连续时间信号 $x_c\left( t \right)$ 采样得到的,即 $x\left[ n \right] =x_c\left( nT_1 \right)$,$y_D\left[ n \right] =x_c\left( nT_2 \right) $,其中 $T_2 = DT_1$。故根据式 $\eqref{Relationship between the spectrum of the sampled signal and the original signal}$,
$$\begin{aligned}
x\left[ n \right] =x_c\left( nT_1 \right) \overset{\mathrm{FT}}{\longleftrightarrow}X\left( e^{j\omega _1} \right) =\frac{1}{T_1}\sum_{n=-\infty}^{\infty}{X_c\left[ j\left( \frac{\omega _1-2n\pi}{T_1} \right) \right]}
\end{aligned}$$
$$\begin{equation}\label{1.2.4}
y_D\left[ n \right] =x_c\left( nT_2 \right) \overset{\mathrm{FT}}{\longleftrightarrow}XY_D\left( e^{j\omega _2} \right) =\frac{1}{T_2}\sum_{n=-\infty}^{\infty}{X_c\left[ j\left( \frac{\omega _2-2n\pi}{T_2} \right) \right]}
\end{equation}$$
其中 $\omega_1, \omega_2$ 分别为 $F_1, F_2$ 对应的归一化角频率,且 $\omega_2 = \Omega T_2 = \Omega DT_1 = D \omega_1$。
&emsp;&emsp;将 $T_2 = DT_1$ 代入 $\eqref{1.2.4}$,并令 $n=Dm+k$,
$$\begin{equation}\begin{aligned}
Y_D\left( e^{j\omega _2} \right) &=\frac{1}{DT_1}\sum_{n=-\infty}^{\infty}{\begin{array}{c}
X_c\left[ j\left( \frac{D\omega _1-2n\pi}{DT_1} \right) \right]\\
\end{array}}
\\
&=\frac{1}{DT_1}\sum_{k=0}^{D-1}{\sum_{m=-\infty}^{\infty}{\begin{array}{c}
X_c\left[ j\left( \frac{D\omega _1-2\pi \left( Dm+k \right)}{DT_1} \right) \right]\\
\end{array}}}
\\
&=\frac{1}{D}\sum_{k=0}^{D-1}{\frac{1}{T_1}\sum_{m=-\infty}^{\infty}{\begin{array}{c}
X_c\left[ j\left( \frac{\left( \omega _1-2\pi k/D \right) -2m\pi}{T_1} \right) \right]\\
\end{array}}}
\\
&=\frac{1}{D}\sum_{k=0}^{D-1}{X\left( e^{j\left( \omega _1-2\pi k/D \right)} \right)}
\end{aligned}\end{equation}$$
注意到 $\omega_2 = D\omega_1$,上式等式两端可统一用变量 $\omega_2$ 表示,此时下标也可省略,于是得到信号抽取前后在频域的关系为
$$\begin{equation}
Y_D\left( e^{j\omega} \right) =\frac{1}{D}\sum_{k=0}^{D-1}{X\left( e^{j\frac{\omega -2\pi k}{D}} \right)}
\end{equation}$$
<!-- # 整数倍内插
# 分数倍抽样率转换
# 以时变滤波的角度分析抽样率转换
# 抽样率转换的 MATALAB 实现
# 小结 -->
@@ -0,0 +1,466 @@
---
title: 'Josh''s Notes: SystemVerilog 验证 (Part 1 — 验证导论)'
mathjax: true
comments: true
copyright: false
sticky: false
toc:
enable: true
number: false
wrap: true
expand_all: true
max_depth: 4
abbrlink: 8e17a993
date: 2022-05-30 11:40:49
tags:
- SystemVerilog
- Testbench
- 验证
categories:
- [Josh 的学习笔记, SystemVerilog]
---
在开始学习有关 System Verilog 语言的细节之前,需要理解如何制订计划来验证手中的设计,以及整个验证计划对 testbench 结构的影响。就像所有房子都有厨房、卧室和浴室一样,所有 testbench 也都需要共享一些用于产生激励、检验响应的结构。本文对 testbench 的构建和设计给出一些引导性的建议和编码风格方面的参考,以满足不同的需要。
验证工程师能学到的最重要的原则是“Bugs are good”,不要因为害怕 bug 而不敢 debug,每次找到 bug 都应该及时告警并记录下来。任何一个项目中都不可能没有 bug,所以在流片之前每发现一个 bug 都意味着用户手中的产品少一个 bug。我们应该尽可能细致深入地去检验设计,找出所有可能存在的 bug,尽管有时候这些 bug 可能很容易修复。
本文需要 Verilog 语言基础,面向对 SystemVerilog HVL (Hard­ware Verification Language, 硬件验证语言) 感兴趣的读者。与 HDL (Hardware Desription Language, 硬件描述语言) 相比,HVL 具有一些特别的性质:
1. **约束下的随机激励生成** (*Constrained-random stimulus generation*)。
2. **功能覆盖率** (*Functional coverage*)。
3. **更高层次的结构**,尤其是面向对象的编程 (*Higher-level structures*, especially object-oriented programming)。
4. **多线程**及线程间的通信 (*Multithreading* and interprocess communication)。
5. **支持 HDL 数据类型** (*Support for HDL types* such as Verilog’s 4-state values)。
6. **集成了事件仿真器**,便于对设计施加控制 (*Tight integration with event-simulator* for control of the design)。
上述特性使得 HVL 可以创建高度抽象的 testbench,其抽象层次比使用 HDL 或计算机编程语言如 C 所能达到的还要高。
<!-- more -->
# 1. 验证流程
验证的目的是什么?如果说是为了“寻找 bug”,那也只答对了一部分。硬件设计的目的是设计一个**基于设计规范并能完成特定任务的设计**,例如 DVD 播放器、路由器或者雷达信号处理器。验证工程师需要**确保这些设计能够成功地完成预定的任务**——也就是说,确保**设计能够准别表达这些规范**;而设计在超出预定目标之外的行为可以不用关心。
验证和设计是并行的流程。对于每个设计模块,设计者需要首先了解硬件设计规范/设计输入,理解其中设计需求,然后使用 RTL 代码之类的机器语言创建相应的逻辑。为了完成这个过程,设计者需要知道输入格式、传输函数以及输出格式。在理解设计需求的过程中总是会有模糊的地方,可能因为是设计输入文档本身的表述不清楚,遗漏了细节或者前后不一致。验证工程师必须阅读硬件规范并拟定验证计划,然后按照计划,创建测试来检查 RTL 代码是否准确地实现了满足了所有的规范。
如果有多人按照同一规范进行解读,那么设计流程可能会出现冗余。验证工程师的工作是阅读同样的硬件设计规范并对其含义做出独立的判断,然后利用测试来检查对应的 RTL 代码是否与理解相一致。
## 1.1. 不同层次上的测试
设计中会潜藏着哪些类型的 bug 呢?最容易检测的是在**代码块 (*block*) 层次**上,代码块由每个设计者在模块 (module) 内创建。ALU (Arithmetic-Logic Unit, 运算逻辑单元) 是否正确地执行了两个数的加法?是否每个总线传输都能够成功完成?是否所有的数据包都经过了网络交换机?为了找出这些 bug 而去编写定向测试是一件十分繁琐的事情,原因是这些 bug 都被包含在设计的代码块里。
除了代码块以外,代码块的**输入输出接口**也是 bug 丛生的地方,通常是因为多个设计者对同一规范产生了不同理解。对于一个给定的协议,什么信号发生了变化?在什么时候变化?第一个设计者按照自己对规范的理解建立了一个总线驱动器,第二个设计者也按照自己的理解建立了一个总线接收器,但两者对规范的理解略有不同。我们的工作就是找到两者在硬件逻辑上有冲突的地方,然后将两者进行统一。
为了对一个代码块进行仿真,我们需要创建测试集来模拟周围代码块产生激励,这是一件困难而繁琐的事情。好消息是低层次的仿真运行起来会很快。但是,随着代码块数量的增加,可能会在设计和 testbench 中同时找到 bug,因为 testbench 为了提供足够的激励,代码也会很长。当开始对所有的代码块进行合并测试时,它们也会相互激励,测试负担就会相对减少。多个代码块同时仿真可能会发现更多的 bug,但是运行起来也会慢一些。
在 DUT (Design under Test, DUT) 的最高层次中,整个系统都会被测试,但是仿真过程会简单很多。我们的测试应该尽可能让所有的代码块并发活动。所有的输入输出端口都被激活,处理器正在处理数据,而高速缓存也正在载入数据。有了这些行为以后,数据分配和时序上的 bug 肯定会出现。
在这个层次上,能够运行更加精细的测试,可以**让 DUT 并发执行多种操作以激活尽可能多的代码块**。如果一个 MP3 播放器正在播放音乐时,用户希望从计算机上下载新的音乐会发生什么?在下载的过程中,用户在播放器上按键又会发生什么?显然,一个实际的设备在被使用时,有些用户会去做这些事情,那为什么不在设备制造之初去做同样的测试呢?这种测试可以把易于使用的产品和经常发生故障的产品区分开来。
一旦验证了 DUT 能够执行所有预期的功能以后,还需要看一下当出现错误时 DUT 会怎样操作。设计是否能应对只进行了一半的事件,已经受损的数据或控制字段?想要列举出所有可能的问题就很困难,更不用说去判断设计会如何从这些错误中恢复了。所以**错误注入和处理 (Error Injection and Handling) 是验证中最具挑战性的部分**。
随着设计抽象层次的提高,验证的挑战性也会加大。我们可以确定单个信元是否正确通过 ATM (Asynchronous Transfer Mode, 异步传输模式) 路由器,但如果是一系列有着不同优先权的数据流呢?在最高的抽象层次中,下一个操作应该选择哪个信元并不是显而易见的,可能不得不统计成千上万的信元,以便确定这种集总的操作是否正确。
最后,**我们永远也无法证明没有任何遗留的 bug**,所以需要不停地尝试新的验证策略。
## 1.2. 验证计划
验证计划和硬件规范是紧密联系在一起的,它描述了需要验证什么样的特性,以及采用哪些技术。这些步骤可能包含有定向测试 (directed test) 或随机测试 (random test) 、断言 (assertion)、软硬件协同验证 (HW/SW co-verification)、硬件仿真 (emulation)、形式验证 (formal proof),以及对验证 IP 的使用等等。有关验证更全面的讨论,可参见 Bergeron 的 *Verification Methodology Manual for
SystemVerilog* (2006)。
# 2. Testbench 的基本功能
Testbench 的用途在于**确定 DUT 的正确性**。包含下列步骤:
1. 产生激励。
2. 把激励施加到 DUT 上。
3. 捕捉响应。
4. 检验正确性。
5. 对照整个验证目标测算进展情况。
有些步骤是 testbench 自动完成的,有些则需要手动操作,所选择的验证方法学决定了上述步骤如何展开。
# 3. 定向测试
当需要验证一个设计的正确性时,传统的做法可能是使用定向测试。使用这种方式,首先需要阅读硬件规范,然后写下验证计划,计划上列有各种测试,每个测试针对一系列相关的特性。按照这个计划,接着**编写针对 DUT 具体特性的激励向量,然后使用这些向量对 DUT 进行仿真**。仿真结束后,手动查看一下结果文件和波形,确保设计的行为与预期的一致。一旦测试结果正确,就可以开始下一个测试。
这种渐进的方法比较容易取得稳步的进展,因而很受那些喜欢看到项目持续向前推进管理者的欢迎。由于创建每个激励向量时并不需要什么基础,所以定向测试的结果也会很快得到。只要给予足够的时间和人力,定向测试对于大部分设计验证来讲都是可以胜任的。
[图 1.1](#图1.1) 显示了定向测试如何逐步覆盖验证计划中的每个特性。每个测试都针对一个特别的设计元素集合。**如果有足够的时间**,可以写出 100% 覆盖整个验证计划所需要的全部测试。
<span id="图1.1"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-010-DirectedTestProgressOverTime.png" width=500px alt="图 1.1 定向测试随时间的进展"/>
</div>
如果没有足够的时间和资源来完成定向测试该怎么办?如[图 1.1](#图1.1),当在时间往前推进时,覆盖率 (coverage) 可能维持不变。如果设计复杂度翻倍,那么测试就需要增加一倍的时间或者人力,而这种情况是我们所不愿意看到的。因此为了达到 100% 覆盖率的目标,需要一种可以更快找出 bug 的方法。
[图 1.2](#图1.2) 所示为整个设计空间和各种特性被定向测试案例覆盖的情形。在设计空间里有很多特性 (feature),其中有些存在 bug,需要编写各种测试 (test) 去覆盖所有的特性并找出 bug。
<span id="图1.2"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-020-DirectedTestCoverage.png" width=800px alt="图 1.2 定向测试的覆盖率"/>
</div>
# 4. 方法学基础
本文使用如下原则:
1. 约束下的随机激励。
2. 功能覆盖率。
3. 使用事件处理器的分层 testbench。
4. 对所有测试通用的 testbench。
5. 独立于 testbench 之外的个性化测试代码。
这些原则是相关联的。随机激励对于测试复杂设计十分关键。**定向测试可以找出设计中预期的 bug,而随机测试则能够找出预料不到的 bug**。当使用随机激励时,需要用功能覆盖率来评估验证的进展情况。一旦开始使用自动生成的激励,就需要一种能够**自动预测结果**的方式——通常是记分板或者参考模型。建立包括自预测在内的 testbench 基础设施,是一件工作量很大的事情。分层 testbench (layered testbench) 能够把问题分解为容易处理的小块,这样有助于控制复杂度。事件处理器 (transactors) 能够为构建这些小块提供有用的模式。在适当的规划下,可以建立一个 testbench 所需的基础设施,它们能在所有测试中通用并且不需要经常修改,只需要在某些地方放置“hook”,以便测试能够在这些地方执行调整激励或注入错误等特定操作。相反,针对单一测试的个性化代码必须与 testbench 分开,这样可以避免增加基础设施的复杂度。
建立这种风格的 testbench 所需的时间要比传统的定向 testbench 多得多——尤其是自检的部分。其结果是,可能需要很长的准备时间才能进行第一次可运行的测试。这会给项目管理带来阵痛,所以需要在测试时间表上把这部分考虑进去。从[图 1.3](#图1.3) 中可以看到,第一个随机测试运行前有比较长的初始延迟。
<span id="图1.3"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-030-ConstraineRandomTestProgressOverTimeVSDirectedTesting.png" width=500px alt="图 1.3 约束下的随机测试与定向测试随时间的进度比较"/>
</div>
随机测试的前期准备工作看起来似乎令人不满意,但是其回报却很高。每个随机测试都可以共享这个通用的 testbench,不像每个定向测试都要从零开始编写。每个随机测试都会包含一部分代码,将激励约束到特定的方向上并触发期望的异常,比如创建一个协议违例。其结果是,约束下的随机 testbench 找起 bug 来会比很多定向测试快很多。随着 bug 出现率的下降,应该创建新的随机约束去探索新的区域。最后的几个 bug 可能只能通过定向测试来发现,但是绝大部分的 bug 都应该会在随机测试中出现。
# 5. 约束下的随机激励<a name="05"></a>
虽然我们希望仿真器能产生随机激励,但同时又**不希望这些激励数值完全随机**。使用 SystemVerilog 语言可以描述激励的格式 (例如,地址是 32 位;操作码是 ADD 、 SUB 或 STORE;长度 < 32 字节),然后让仿真器产生满足约束的数值。这些数值会被发送到设计中去,同时也会被发送到一个负责预测仿真结果的高层模块中去。设计的实际输出最终需要和预测输出做对比。
[图 1.4](#图1.4) 所示为约束下的随机测试在整个设计空间中的覆盖率。
- 值得注意的是,**一个随机测试的覆盖范围往往比一个定向测试大**。多出来的覆盖部分可能会与其他测试发生交叠,或者探测到事先没有预料到的新区域 (new area)。
- 在这些新区域中发现 bug 是一件幸运的事情。如果这些对新区域的测试不合法,则需要编写更多的约束去阻止随机测试产生非法的功能。
- 对于那些约束下的随机测试覆盖不到的地方,可能还需要编写一些定向测试。
<span id="图1.4"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-040-ConstrainedRandomTestCoverage.png" width=800px alt="图 1.4 约束下的随机测试覆盖率"/>
</div>
[图 1.5](#图1.5) 所示为达到完全覆盖的技术路线:
1. 从左上角的基本的约束下的随机测试 (constrained random test) 开始,使用不同的种子 (seed) 运行。
2. 当我们查看功能覆盖率 (functional covrage) 报告时,注意找出覆盖率中的间隙 (hole),即覆盖盲区。
3. 针对这些盲区进行最小程度代码修改 (mininal code midification),可能是使用新的约束 (constraint),也可能是把错误或延迟加入到 DUT 中。这个外部循环会花掉我们大部分的时间,只有对少数使用随机测试达不到的特性才编写定向测试。
<span id="图1.5"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-050-CoverageConvergence.png" width=500px alt="图 1.5 覆盖率收敛"/>
</div>
# 6. 我们的随机化对象是什么<a name="06"></a>
当考虑对一个设计的激励进行随机化时,首先想到的可能是数据字段。这种激励最容易创建——只需调用 `$random()` 即可。问题是这种随机数据在找 bug 方面的回报很小。能够使用随机数据找到的 bug 类型基本上都是在数据路径上的,很可能还都是比特级的错误,还需要找出**控制逻辑上的 bug**。
此外,需要广泛地考虑所有的设计输入,如下所列:
1. 设备配置。
2. 环境配置。
3. 输入数据。
4. 协议异常。
5. 错误和违例。
6. 时延。
## 6.1. 设备和环境配置
在对 RTL 设计进行测试的过程中,察觉不到 bug 的最常见的原因是什么?是因为**没有尝试足够多的不同配置**。很多测试只使用了仅仅经过复位的设计,或者施加固定的初始化向量集把设计引向一个已知的状态。这就好比是在个人电脑上刚刚安装完操作系统,还没有安装任何应用程序的时候,就对操作系统进行测试。测试结果当然会很好,但是并没有挖掘出实际的问题。
在一个实际的应用环境中,随着 DUT 使用时间的增加,其配置会变得越来越随机。例如,验证一个分时复用的多路开关,它有 2000 个输入通道和 12 个输出通道。这些通道在另外一边可以映射成各种不同的配置。每个输入可能作为单个通道使用,也可能会被进一步分割成多个通道。棘手的是,虽然大部分时间里使用的是几种标准的通道分割方式,但由于其他分割方式的组合也是合法的,所以存在着大量可能的用户配置。
为了测试这个设备,对于每个通道的配置,工程师都必须写出好几十行的定向测试代码。显然,验证工程师无力应对如此多的通道配置。后来编写了一个 testbench,对每个通道的参数都采用随机化策略,然后把这部分代码放到一个循环里去完成所有开关通道的配置。现在,找出与配置相关的 bug 变得更加容易,而这些 bug 在以前常常不被察觉。
在实际的应用中,我们的设计所在的环境里会包含其他的部件。当对 DUT 进行验证时,实际上就是把 testbench 连接起来模仿这个环境,应该对整个环境的配置进行随机化,包括仿真的时长、设备的数量,以及它们的配置方式。当然,需要创建约束以确保配置的合法性。
在另外一个 Synopsys 公司的客户案例中,一家公司设计了一个 I/O 交换芯片,用于把多套 PCI 总线连接到一套内部总线上。在仿真一开始,他们就随机地选择了 PCI 总线的数目 (1~4) 以及总线上设备的数目 (1~8),而且对每个设备上的参数也进行了随机化(如主从模式、 CSR 地址等等)。他们使用功能覆盖率对测试过的组合进行跟踪,以确保所有可能的组合都被覆盖。
其他环境参数还包括测试长度、错误注入比率,以及时延模式等。Bergeron (2006) 在这方面有更多的例子。
## 6.2. 输入数据
当看到随机激励时,我们可能会想到**选取一个总线写入的事件或 ATM 信元,然后把随机数值填充到其中的数据字段里**。实际上,这种方式相当直接,需要事先估计好所有的分层协议和错误注入,以及记分板的内容和功能覆盖率。
## 6.3. 协议异常、错误和违例
最令人沮丧的事情莫过于个人电脑或移动电话之类的设备死机。大多数情况下,唯一的办法就是关机然后重新启动。死机最有可能的原因是,产品内部的一部分逻辑遇到了错误以后无法恢复过来,因此使得设备不能正常工作。
如何才能阻止这些问题出现在我们创建的硬件上呢?应该尽量尝试去仿真在实际的硬件中可能出现的错误,而且应该针对所有可能出现的错误。如果一个总线事件没有完成会怎么样?如果遇到一个非法的操作呢?设计规范中有没有指出哪两个信号互斥?要对这些情况一一尝试,然后确保设备还能继续正常运作。
**在尝试使用不当的命令去激励硬件的同时,也应该注意捕捉出现的问题**。例如,重新调用那些互斥的信号。可以增加用于检验的代码来帮忙找出问题所在。这些代码应该至少能够在出错的地方打印一个警告信息,如果能够报告出错误并且使测试停下来则更好。花费大最时间在代码中追溯故障的根源,是一件令人非常不愉快的事情,尤其是在本来如果使用一个简单的断言就可以定位这个错误的情况下。(关于如何在 testbench 和设计代码中编写断言,可以参考 Vijayaraghavan 和 Ramanathan 在 2005 出版的著作。) 只要确保能够使代码在出错的地方停止仿真,那么就很容易应对测试中的错误。
## 6.4. 时延和同步
Testbench 应该以多快的速度发送激励呢?使用**约束下的随机时延**有助于捕捉协议上的 bug。时延最短的测试运行速度最快,但它产生不了所有可能的激励。可以创建一个 testbench 以最快的速度与另一个代码块通信,但那些隐蔽的 bug 往往是在引入间歇性时延之后才被发现的。
一个代码块对于来自同一接口的所有可能激励也许都能正常工作,但如果同时面对多个输入,隐蔽的 bug 可能就会出现。尝试协调各个驱动器使它们能够在不同的速率下进行通信。如果输入以可能的最快速率到达,而输出却被卡在一个较低的速率上,该怎么办?如何处理来自多个输人的激励同时到达的情况?如果这此激励带有不同的时延又该怎么办?使用功能覆盖率,可以测量随机生成的各种组合。
## 6.5. 并行的随机测试
如何运行测试?每个定向测试都带有一个 testbench,能够产生一组特定的激励和响应向量。如果想改变激励,就需要改变测试。随机测试则包含了 testbench 代码和随机种子。如果对同一个测试运行 50 次,每次都采用不同的种子,那么将会得到 50 个不同的激励集合。使用多个种子运行同一个测试可以加大覆盖率,同时也能减少工作量。
我们需要**为每次仿真选定一个独特的种子**。有些人使用自然时间作为种子,但这依然会引起重复。如果半夜里在一个计算机集群系统上开始 10 项任务会怎么样?多项任务可能会于同一时间在不同的计算机上启动,这样还是会得到相同的随机种子并运行相同的激励。因此,应该把处理器的名称加入到种子里去。如果集群系统里面有多核计算机,那还是可能会出现两个相同的种子,所以在这种情况下应该把处理器核的编号也加到种子里去,这样就能得到独一无二的种子了。
> 我们还需要对并行仿真的文件组织进行规划。每次仿真都会有一系列的输出文件,例如日志文件和功能覆盖率文件,可以让每个仿真在不同的目录里运行,或者也可以尝试给每个文件取不同的名字。最简单的办法是在目录名后面加上随机种子的值。
# 7. 功能覆盖率
本文[第 5 节](#05)和[第 6 节](#06)讲述了如何创建激励并使这些激励遍历整个可能的输入空间。使用这种方法,Testbench 会频繁访问部分区域,但需要花费很长的时间来达到所有可能的状态。即使对仿真时间不加限制,无法达到的状态还是永远也不会被访问到,因此需要知道哪些部分已经被验证过,这样才能对验证计划中的项目进行核对。
对功能覆盖率的测量和使用包含了几个步骤。首先,需要在 testbench 中加入代码,用于监控进入设备中的激励,以及设备对激励的反应,并据此确定哪些功能已经被验证过。运行几次仿真,每次使用不同的种子。接下来,把这些仿真的结果合并到一个报告中。然后需要对结果进行分析,最后决定如何采用新的激励来达到那些尚未被测试到的条件和逻辑。
## 7.1. 从功能覆盖率到激励的反馈
随机测试需要使用反馈 (feedback)。最初的测试会被运行很多次,使用不同的种子,创建很多互异的输入序列。但是到了最后,即使使用新的种子,所产生的激励也很可能无法在设计空间中探测到新区域。**随着功能覆盖率逐渐接近极限,需要改变测试,以期能找出新的方法去达到那些尚未被覆盖的区域**。这被称为“覆盖率驱动的验证”,如[图 1.6](#图1.6) 所示。
<span id="图1.6"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-060-TestProgressWithAndWithoutFeedback.png" width=500px alt="图 1.6 带反馈和不带反馈的测试进展"/>
</div>
Testbench 有没有可能为我们做到这一点呢?假设现在需要使用 testbench 在每个周期为处理器产生一个总线事件,并为总线事件做出终止判断(成功、校验错误、重试)。在没有使用 HVL 的时候,通常会编写一个很长的定向测试集,然后花费了很多天的工夫编排终止判断代码,并让它们在合适的周期里给出判断。经过了大量的手动分析以后才得出成功的结论达到 100 %的覆盖率。但之后可能由于处理器的时序有了一点微小的改变,不得不重新分析测试并改变激励。
更加有效的测试策略是**使用随机总线事件和终止判断**。运行的时间越长,覆盖率就会越高。另外的一个好处是,这种测试在创建激励时灵活性很高,足以应对设计时序有改变的情形。为了做到这一点,可以在测试代码中加入一个反馈循环,用于监测己生成的激励 (是否已经产生所有写周期?) 并根据情况调整约束的权重 (把写的权重降到零)。这种改进能大大缩减达到完全覆盖的时间,而且只需要很少量的人工干预。
其实,这并不是一种典型的情况,因为从功能覆盖率到激励的反馈往往是微不足道的。在实际的设计中,应该如何改变激励以使它达到一个期望的设计状态呢?这不仅要求对设计有深入的了解,而且还需要高超的形式验证技术。总之答案并不简单,所以**在约束下的随机激励中很少采用动态反馈**。相反地,**需要手动分析覆盖率报告,然后调整随机约束**。
有些形式分析工具如 Magellan (Synopsys, 2003) 用到了反馈。它首先对设计进行分析并找出所有可以达到的互异状态。然后运行一小段仿真看有多少状态被访问到。最后,在状态机和设计输入之间进行搜索并计算出达到所有遗留状态所需要的激励,然后 Ma­gellan 再把这些激励施加到 DUT 上。
# 8. Testbench 的构建
在仿真时,**testbench 会把整个 DUT 包围起来**,就像一个硬件测试器连接到一个物理芯片上一样,如[图 1.7](#图1.7) 所示。testbench 和测试仪器都会产生激励并捕捉响应。不同的是,testbench 需要工作在一个很宽的抽象层次范围内,同时创建事件和激励序列并最终转换成比特向量。而测试仪器则只工作在比特级上。
<span id="图1.7"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-070-TheTestbenchDesignEnvironment.png" width=450px alt="图 1.7 Testbench 与设计环境"/>
</div>
Testbench 模块里都包含了什么呢?有很多的 BFM (Bus Functional Models, 总线功能模型),可以把它们看成是 testbench 构件 (components) ——从 DUT 的角度看,它们和真实的构件没什么两样,但它们其实只是 testbench 的组成部分,并非 RTL 设计。如果实际应用中设备被连接到 AMBA、USB、PCI 和 SPI 总线上,那么就必须**在 testbench 中建立能够产生激励并校验响应的等效构件**,如[图 1.8](#图1.8) 所示。这些构件并不是带有细节的可综合模型,而是遵循协议并且执行速度更快的高层次事件处理器。如果把设计原型在 FPGA 上实现或者是进行硬件仿真,那么这些 BFM 就需要是可综合的。
<span id="图1.8"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-080-TestbenchComponents.png" width=450px alt="图 1.8 Testbench 构件"/>
</div>
# 9. 分层 testbench
对于任何一种新型的验证方法学来讲,分层的 testbench 是一个关键的概念。虽然分层似乎会使 testbench 变得更复杂,但它能够把代码分而治之,**有助于减轻工作负担**。不要试图去编写一个包含所有功能 (随机产生所有合法和非法的激励,并使用多层协议进行错误注入) 的子程序,因为这样的子程序很快就会变得很复杂,并且难以维护。
## 9.1. 不分层的 testbench
在刚开始学习 Verilog 并尝试写测试程序的时候,这些程序看起来可能会和[例 1.1](#例1.1) 所示的用于执行一个简单 APB (AMBA Peripheral Bus, AMBA 外设总线)写入的低层次代码很相似。
<span id="例1.1"></span>
``` verilog 例 1.1 驱动 APB 引脚
module test(PAddr,PWrite,PSel,PWData,PEnable,Rst,clk);
// 此处省略端口声明
initial begin
// 驱动复位
Rst <= 0;
# 100 Rst <= 1;
// 驱动控制总线
@(posedge clk)
PAddr <= 16'h50;
PWData <= 32'h50;
PWrite <= 1'b1;
PSel <= 1'b1;
// 使 PEnable 翻转
@(posedge clk)
PEnable <= 1'b1;
@(posedge clk)
PEnable< = 1'b0;
// 校验结果
if (top.mem.memory[16'h50] == 32'h50)
$display("Success");
else
$display("Error, wrong value in memory");
$finish;
end
endmodule
```
经过几天连续编写这种代码以后,我们可能会意识到这是一种重复性的劳动,所以会尝试创建可用于总线写入这种普通操作的任务,如[例 1.2](#例1.2) 所示。
<span id="例1.2"></span>
``` verilog 例 1.2 一个用于驱动 APB 引脚的任务
task write(reg [15:0] addr, reg [31:0] data);
// 驱动控制总线
@(posedge clk)
PAddr <= addr;
PWData <= data;
PWrite <= 1'b1;
PSel <= 1'b1;
// 使 PEnable 翻转
@(posedge clk)
PEnable <= 1'b1;
@(posedge clk)
PEnable <= 1'b0;
endtask
```
这样,testbench 就会变得简单一些,如[例 1.3](#例1.3)。
<span id="例1.3"></span>
``` verilog 例 1.3 低层次的 Verilog 测试
module test(PAddr,PWrite,PSel,PWData,PEnable,Rst,clk);
// 此处省略端口声明
// 此处省略如例 1.2 给出的任务函数
initial begin
reset(); // 设备复位
write(16'h50, 32'h50); // 把数据写入到存储器中
// 校验结果
if (top.mem.memory[16'h50] == 32'h50)
$display("Success");
else
$display("Error, wrong value in memory");
$finish;
end
endmodule
```
通过把一些通用的操作 (如复位、总线读出和总线写入) 放到一个子程序中,可以提高工作效率并减少错误。这里,物理和命令层的建立只是通往分层 testbench 的第一步。
## 9.2. 信号和命令层
[图 1.9](#图1.9) 所示为一个 testbench 中最低的几个层次。
<span id="图1.9"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-090-SignalAndCommandLlayers.png" width=500px alt="图 1.9 信号和命令层"/>
</div>
在底部的**信号层** (*signal*),包含 DUT 和把 DUT 连接到 testbench 的信号。
再往上一层是**命令层** (*command*)。执行总线读写命令的驱动器驱动 DUT 的输入。DUT 的输出与监视器 (monitor) 相连,监视器负责检测信号的变化,并把这些变化按照命令分组。断言 (assertion) 也穿过命令层和信号层,它们负责监视独立的信号以寻找穿越整个命令的信号变化。
## 9.3. 功能层
[图 1.10](#图1.10) 给出了为加上**功能层** (*functional*) 的 testbench,功能层向下面对的是命令层。代理 (agent, 在 VMM 中称为事件处理器) 接收到来自上层的事件,例如,DMA 读或写,把它们分解成独立的命令。这些命令也被送往用于预测事件结果的记分板 (scoreboard)。检验器 (checker) 则负责比较来自监视器和记分板的命令。
<span id="图1.10"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-100-TestbenchWithFunctionalLlayerAdded.png" width=500px alt="图 1.10 加上功能层的 testbench"/>
</div>
## 9.4. 场景层
[图 1.11](#图1.11) 所示,功能层被位于**场景层** (*scenario*) 中的发生器 (generator) 所驱动。什么是场景呢?记住一点,验证工程师的工作是确保 DUT 能够完成预期的任务。比如 MP3 播放器,它能一边播放事先存储好的音乐,一边从一台主机上下载新的音乐,并且同时对用户输入如音量调整或音轨控制等操作保持响应。这中间的每一个操作都能称为一个场景。下载一个音乐文件需要若于步骤,例如前期准备时的控制寄存器的读写操作,歌曲传送过程中多次 DMA 写操作,以及之后的很多读写操作。场景层就是负责组织协调这些步骤的,操作的参数如音轨大小和寄存器位置等都采用约束下的随机值。
<span id="图1.11"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-110-TestbenchWithScenarioLayerAdded.png" width=500px alt="图 1.11 加上场景层的 testbench"/>
</div>
在 testbench **环境** (*environment*) 中的这些块 ([图 1.11](#图1.11) 虚线框内) 是在刚开始开发的时候画出来的。随着项目的进展,它们可能会有一些变化,也可能会加入一些功能,但是这些块对于每个独立的测试都是不应改变的。可以通过在代码中留下“hook”来做到这一点,这样即使这些块的行为需要在测试时改变,也不必重新编写代码。“hook”可以使用工厂模式 (factory patterns) 和回调函数 (callbacks) 来创建。
## 9.5. 测试的层次和功能覆盖率
现在到了 testbench 的最顶层——测试层,如[图 1.12](#图1.12)。DUT 模块间的 bug 是比较难以发现的,因为这些模块可能是不同的人按照不同的规范设计出来的。
<span id="图1.12"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-120-FullTestbenchWithAllLayers.png" width=500px alt="图 1.12 带着所有层次的完整 testbench"/>
</div>
这个顶层的测试 (test) 就像一个指挥官:他不演奏任何乐器,但引领着其他人的表演。测试包含了用于创建激励的约束。
功能覆盖率 (fonctional coverage) 可以衡量所有测试在满足验证计划要求方面的进展。随着各项测量标准的完成,功能覆盖率代码在整个项目过程中会经常变化。由于代码经常被修改,所以它不作为测试环境的组成部分。
我们可以在约束下的随机环境中创建“定向测试”。只需在随机序列中间插入定向测试的代码,或者把两部分代码并列。定向代码执行期望的任务,而随机的“背景噪声”可能会使 bug 暴露出来,而且 bug 还有可能来自从未被关注过的模块。
Testbench 中是否需要所有的层次呢?答案要视 DUT 而定。设计越复杂,所需的 testbench 就要越完备。测试层则是必须的。对于一个简单的设计来说,场景层可能过于简单以至于可以把它合并到代理中。
当然,可能还需要更多的层次。如果 DUT 有多个协议层,那么每个层都应该在 testbench 环境中有对应的层。例如使用 IP 封装了 TCP 流量,然后通过以太网数据包的形式发送,对这种情况的测试应该考虑使用三个独立的层来产生和校验数据,如
果能够使用已有的验证构件则更好。
[图 1.12](#图1.12) 中需要注意的最后一点是,它只给出了各块之间一些可能的连接方式,testbench 模块间的连接可能会与之不同。比如测试层可能需要连接到驱动器层以迫使物理 bug 出现。这里给出的只是一些引导——实际当中应该是,需要什么就创建什么。
# 10. 建立一个分层的 testbench
现在是学习如何把前面图示的那些构件映射成 SystemVerilog 结构时候了。
## 10.1. 创建一个简单的驱动器
首先,来仔细看看其中的一个模块——驱动器。[图 1.13](#图1.13) 所示的驱动器接收来自代理的命令。驱动器可能会注入错误或者增加时延,然后再把命令分解成一些信号的变化,例如总线请求或握手。这样一个 testbench 模块通常被称为“事件处理器 (transactor)”,它的核心部分是一个循环:有关事件处理器的示范代码如[例 1.4](#例1.4) 所示。
<span id="图1.13"></span>
<div align="center">
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2022-05-30-josh-systemverilog-1/2022-05-30-josh-systemverilog-1-130-ConnectionsForTheDriver.png" width=120px alt="图 1.13 带着所有层次的完整 testbench"/>
</div>
<span id="例1.4"></span>
``` verilog 例 1.4 基本的事件处理器代码
task run();
done = 0;
while (!done) begin
// 获取下一个事件
// 进行变换
// 发送事件
end
endtask
```
后序的文章给出了:
- 基本的 OOP 以及如何创建一个对象并使对象里面包含事件处理器所需要的子程序和数据,事件处理器的另一个例子是代理,它可能会把一个复杂的事件如 DMA 读分解成多个总线命令;
- 如何创建一个对象并使对象里面包含构成一个命令所需要的数据和子程序。使用 SystemVerilog 信箱可以实现这些对象在不同的事件处理器之间传递;
- 还将介绍很多方法,用于在不同层之间交换数据并使事件处理器实现同步。
# 11. 仿真环境的阶段
到目前为止,已经学习了环境的构成部分。这些部分在什么时候执行呢?我们希望把各个阶段清楚地定义好,以便协调 testbench,使项目中的所有代码能在一起工作。三个基本的阶段是建立 (build)、运行 (run) 和收尾 (wrap-up)。每个阶段都可以再细分为更小的步骤。
**建立阶段**可以分为如下步骤。
1. **生成配置** (*Generate configuration*):把 DUT 的配置和周围的环境随机化。
2. **建立环境** (*Build environment*):基于配置来分配和连接 testbench 构件。Testbench 构件指的是存在于 testbench 中的部分,注意与设计中的物理构件区分开,后者是采用 RTL 代码描述的。例如,如果配置选择了三个总线驱动器,那么 testbench 应该在这个阶段对它们进行分配和初始化。
3. **对 DUT 进行复位** (*Reset the DUT.*)。
4. **配置 DUT** (*Configure the DUT*):基于第一步中生成的配置,载入 DUT 的命令寄存器。
**运行阶段**是指测试实际运行的阶段,可分为以下步骤。
1. **启动环境** (*Start environment*):运行 testbench 构件,例如各种 BFM 和激励发生器。
2. **运行测试** (*Run the test*):启动测试然后等待测试完成。定向测试的完成很容易判断,但随机测试却比较困难。可以使用 testbench 的层作为引导。从顶层启动,等待一个层接收完来自上一层 (如果有的话) 的所有输入,接着等待当前层空闲下来,然后再等待下一层。应该同时使用超时检测以确保 DUT 或 testbench 不出现死锁 (lock up)。
收尾阶段包含如下两个步骤。
1. **清空** (*Sweep*):在最下层完成以后,需要等待 DUT 清空最后的事务。
2. **报告** (*Report*):一旦 DUT 空闲下来,就可以清空遗留在 testbench 中的数据了。有时候保存在记分板里面的数据从来就没有送出来过,这些数据可能是被 DUT 丢弃掉的。可以根据这些信息创建最终报告,说明测试通过或者失败。如果测试失败,务必把相应的功能覆盖率结果删除,因为它们可能是不正确的。
如[图 1.12](#图1.12) 所示,测试启动环境以后,环境就会按上述步骤运行。
# 12. 最大限度的代码重用
为了验证一个带有数百个特性的复杂设备,必须编写数百个定向测试。如果使用约束下的随机激励,需要编写的测试就会少很多。与定向测试相比,随机测试的主要工作是构建 testbench,使它包含所有较低的层:场景、功能、命令以及信号。这个 testbench 代码要能够被所有的测试使用,所以它需要有很好的**通用性**。
这些建议似乎是在推荐一个极度复杂的 testbench,但需要记住的是,在 testbench 中每输入一行,就等于给每个单独的测试都减少了一行,相当于在同时创建很多个测试,而这也正是建立一个复杂 testbench 所能获得的巨额回报。
# 13. Testbench 的性能
如果你是第一次接触这种方法学的话,可能还是会怀疑它工作起来是否会优于定向测试?一个普遍的质疑便是 testbench 的性能。一个定向测试通常可以在一秒之内运行完,但**约束下的随机测试却要花费数分钟甚至数小时去搜索整个状态空间**。这种论点的问题在于,它忽略了一个在验证上真实存在的瓶颈:创建一个测试所需要的时间。你可以在一天之内手动编写完一个定向测试,然后再花一两天的时间调试并手动验证结果。测试的实际运行时间比起你在其他方面花费的时间其实要少得多。
创建约束下的随机测试需要几个步骤。
1. 最重要的一步是建立分层的 testbench,包括自检的部分。这项工作能给所有的测试带来好处,所以是非常值得的。
2. 按照验证计划中列举的目标创建激励。可以使用随机约束,也可以采用注入错误或协议违例等迂回的方式。以这其中的任何一种方式创建激励所花费的时间可能可以用于创建好儿个定向测试,但是它的回报也要高很多。一个约束下的随机测试能够尝试成千上万种不同的协议违例,而在同样的时间里创建的几个定向测试却只能尝试几种情形,显然前者要比后者好得多。
3. 功能覆盖率 (约束下的随机测试)。这项任务的开始是创建一个强有力的验证计划,这个计划必须带有清晰而且便于测植的目标。接下来你需要创建 System­Verilog 代码,在环境中添加工具用于收集数据。最后很重要的一点,你需要
4. 对结果进行分析,并据此判断是否满足目标要求,如果不满足,应如何修改测试。
# 14. 结束语
电子设计复杂度的持续增长要求以一种新颖的、系统的且自动化的方法来创建 testbench。从硬件规范到 RTL 编码、门级综合、芯片制造,以及最后到用户手里,项目每向前推进一步,修复单个 bug 所需要的代价就会增加数倍甚至数十倍。定向测试每次只能测试一个特性,而无法模拟设备在实际应用环境中所面对的复杂的激励和配置。为了得到稳健的设计,**必须使用约束下的随机激励加上功能覆盖率**,才能在可能的限度内创建出最广泛的激励。
# 参考文献
1. 克里斯·斯皮尔, 斯皮尔, 张春,等. SystemVerilog验证:测试平台编写指南[M]. 科学出版社, 2009.
2. Spear C. SystemVerilog for verification: a guide to learning the testbench language features[M]. Springer Science & Business Media, 2008.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,539 @@
---
title: 'Josh''s Notes: SystemVerilog 验证 (Part 3 — 过程语句和子程序)'
mathjax: true
comments: true
copyright: false
sticky: false
toc:
enable: true
number: false
wrap: true
expand_all: false
max_depth: 4
categories:
- - Josh 的学习笔记
- SystemVerilog
abbrlink: '43879201'
date: 2022-06-02 13:24:54
tags:
---
在做设计验证时,需要写很多代码,其中大部分在任务和函数里面。SystemVerilog 在这方面增加了许多改进使得它更接近 C 语言,从而使代码的编写变得更加容易,尤其是在处理参数传递上。
<!-- more -->
# 1. 过程语句
SystemVerilog 从 C 和 C++ 中引入了很多操作符和语句:
- 可以在 `for` 循环中定义循环变量,它的作用范围仅限于循环内部,从而有助于避免一些 bug。
- 自动递增符 `++` 和自动递减符 `--` 既可以作为前缀,也可以作为后缀。
- 如果在 `begin` 或 `fork` 语句中使用标识符,那么在相对应的 `end` 或 `join` 语句中可以放置相同的标号,这使得程序块的首尾匹配更加容易。
- 也可以把标识符放在 SystemVerilog 的其他结束语句里,例如 `endmodule`、`endtask`、`endfunction` 以及本文将介绍的其他语句。
[例 3.1](#例3.1) 展示了一些新的语法结构。
<span id="例3.1"></span>
``` verilog 例 3.1 新的过程语句和操作符
initial
begin : example
integer array[10], sum, j;
// 在 for 语句中声明 i
for (int i=0; i<10; i++) // i 递增
array[i] = i;
// Add up values in the array
sum = array[9];
j=8;
do // do...while 循环
sum += array[j]; // 累加
while (j--); // 判断 j=0 是否成立
$display("Sum=%4d", sum); // %4d,指定宽度
end : example // 结束标识符
```
SystemVerilog 为循环功能增加了两个新语句:
- 第一个是 `continue`,用于在循环中跳过本轮循环剩下的语句而直接进入下一轮循环。
- 第二个是 `break`,用于终止并跳出循环。
[例 3.2](#例3.2) 中的循环使用 Verilog-2001 中的文件输入输出系统任务从一个文件中读取命令。如果读到的命令只是一个空行,则执行 `continue` 语句,跳过对这个命令的任何进一步处理。如果读到的命令是 “done”,代码将会执行 `break` 终止循环。
<span id="例3.2"></span>
``` verilog 例 3.2 在读取文件时使用 <code>break</code> 和 <code>continue</code>
initial begin
bit [127:0] cmd;
int file, c;
file = $fopen("commands.txt", "r");
while (!$feof(file)) begin
c = $fscanf(file, "%s", cmd);
case (cmd)
"": continue; // 空行——跳到本轮循环的末尾
"done": break; // Done——终止并跳出循环
... // 处理其他命令
endcase // case(cmd)
end
$fclose(file);
end
```
# 2. 任务、函数以及 `void` 函数
在 Verilog 中,任务 (task) 和函数 (function) 之间有很明显的区别,其中最重要的一点是,**任务可以消耗时间而函数不能**。函数里面不能带有诸如 `#100` 的时延语句或诸如 `@(posedge clock)`、`wait(ready)` 的阻塞语句,也不能调用任务。另外,Verilog 中的函数必须有返回值,并且返回值必须被使用,例如用到赋值语句中。
SystemVerilog 对这条限制稍有放宽,允许函数调用任务,但只能在由 `fork... join_none` 语句生成的线程中调用。
> 不消耗时间的 SystemVerilog 任务应该被定义成 `void` 函数,这种函数没有返回值,这样它就能被任何任务或函数所调用了。从最大灵活性的角度考虑,所有用于调试的子程序都应该定义成 `void` 函数而非任务,以便于被任何其他任务或函数所调用。[例 3.3](#例3.3) 可以输出状态机的当前状态值。
<span id="例3.3"></span>
``` verilog 例 3.3 用于调试的 <code>void</code> 函数
function void print_state(...);
$display("@%0t: state = %s", $time, cur_state.name());
endfunction
```
在 SystemVerilog 中,如果想调用函数并且忽略它的返回值,可以使用 `void` 进行结果转换,如[例 3.4](#例3.4) 所示。有些仿真器,如 VCS,允许在不使用上述 void 语法的情况下忽略返回值。
<span id="例3.4"></span>
``` verilog 例 3.4 忽略函数的返回值
void'($fscanf(file, "%d", i));
```
# 3. 任务和函数概述
SystemVerilog 在任务和函数上做了一些小改进,使得它们看起来更像 C 或 C++ 的程序。一般情况下,不带参数的子程序在定义或调用时并不需要带空括号 `()`。为清楚起见,本文对此种情形的子程序将全部带括号。
## 3.1. 在子程序中移除 `begin...end`
在 SystemVerilog 中,你可能会注意到的第一个改进就是,`begin...end` 块变成可选了,而在 Verilog-1995 中则对单行以外的子程序都是必须的。如[例 3.5](#例3.5) 所示,`task/end­task` 和 `function/endfunction` 的关键词已经足以定义这些子程序的边界了。
<span id="例3.5"></span>
``` verilog 例 3.5 不带 <code>begin...end</code> 的简单任务
task multiple_lines;
$display("First line");
$display("Second line");
endtask : multiple_lines
```
# 4. 子程序参数
SystemVerilog 对子程序的很多改进使参数的声明变得更加方便,同时也扩展了参数的传递方式。
## 4.1. C 语言风格的子程序参数
System Verilog 和 Verilog-2001 在任务和函数参数的声明上更加简洁,更少重复。[例 3.6](#例3.6) 中的 Verilog 任务要求对一些参数进行两次声明,一次是方向声明,另一次是类型声明。
<span id="例3.6"></span>
``` verilog 例 3.6 Verilog-1995 的子程序参数
task mytask2;
output [31:0] x;
reg [31:0] x;
input y;
...
endtask
```
而在 System Verilog 中,可以采用简明的 C 语言风格,如[例 3.7](#例3.7) 所示。但注意**必须使用通用的输入类型 `logic`**。
<span id="例3.7"></span>
``` verilog 例 3.7 C 语言风格的子程序参数
task mytask1 (output logic [31:0] x,
input logic y);
...
endtask
```
## 4.2. 参数的方向
在声明子程序参数方面还可以有更多的便捷。因为默认的类型和方向是 “logic 输入”,所以在声明类似参数时可不必重复。[例 3.8](#例3.8) 所示为采用 SystemVerilog 的数据类型,但以 Verilog-1995 的风格编写的一个子程序头。
<span id="例3.8"></span>
``` verilog 例 3.8 带 Verilog 风格的繁冗的子程序参数
task T3;
input a, b;
logic a, b;
output [15:0] u, v;
bit [15:0] u, v;
...
endtask
```
可以把它重写成[例 3.9](#例3.9) 的形式。
<span id="例3.9"></span>
``` verilog 例 3.9 使用默认类型的子程序参数
task T3(a, b, output bit [15:0] u, v);
```
参数 `a` 和 `b` 是 1 比特宽度的 logic 输入。参数 `u` 和 `v` 是 16 比特宽度的 bit 类型输出。尽管有这种简洁的编程方式,但不建议使用这种方式,因为这种方式将容易引入一些细小而难以发现的 bug。所以**建议对所有子程序参数的声明都带上类型和方向**。
## 4.3. 高级的参数类型
Verilog 对参数的处理方式很简单:在子程序的开头把 `input` 和 `inout` 的值复制给本地变量,在子程序退出时则复制 `output` 和 `inout` 的值。除了标量以外,没有任何把存储器传递给 Verilog 子程序的办法。
在 SystemVerilog 中,参数的传递方式可以指定为引用而不是复制。这种 `ref` 参数类型比 `input`、`output` 或 `inout` 更好用。首先,把数组传递给子程序。
<span id="例3.10"></span>
``` verilog 例 3.10 使用 <code>ref</code> 和 <code>const</code> 传递数组
function void print_checksum (const ref bit [31:0] a[]);
bit [31:0] checksum = 0;
for (int i=0; i<a.size(); i++)
checksum ^= a[i];
$display("The array checksum is %0d", checksum);
endfunction
```
SystemVerilog 允许不带 `ref` 进行数组参数的传递,这时数组会被复制到堆栈区里。这种操作的代价很高,除非是对特别小的数组。
SystemVerilog 的语言参考手册 (LRM) 规定了 `ref` 参数只能被用于带自动存储的子程序中。如果对程序或模块指明了 `automatic` 属性,则整个子程序内部都是自动存储的。
[例 3.10](#例3.10) 也用到了 `const` 修饰符,其结果是,**虽然数组变量 `a` 指向了调用程序中的数组,但子程序不能修改数组的值**。如果试图改变数组的值,编译器将报错。
> 向子程序传递数组时应尽量使用 `ref` 以获取最佳性能。如果不希望子程序改变数组的值,可以使用 `const ref` 类型。这种情况下,编译器会进行检查以确保数组不被子程序修改。
`ref` 参数的第二个好处是**可以在任务里修改变量,并且修改结果对调用它的函数随时可见**。当有若干并发执行的线程时,这样操作可以提供一种简单的信息传递方式。
在[例 3.11](#例3.11) 中,一旦 `bus.enable` 有效,初始化块中的 `thread2` 块马上就可以获取来自存储器的数据,而不用等到 `bus_read` 任务完成总线上的数据处理后返回,这可能需要若干个时钟周期。由于参数 `data` 是以 `ref` 方式传递的,所以只要任务里的 `data` 一有变化,`@data` 语句就会触发。如果你把 `data` 声明为 `output`,则 `@data` 语句就要等到总线处理完成后才能触发。
<span id="例3.11"></span>
``` verilog 例 3.11 在多线程间使用 <code>ref</code>
task bus_read(input logic [31:0] addr,
ref logic [31:0] data);
// 请求总线并驱动地址
bus.request = 1'b1;
@(posedge bus.grant) bus.addr = addr;
// 等待来自存储器的数据
@(posedge bus.enable) data = bus.data;
// 释放总线并等待许可
bus.request = 1'b0;
@(negedge bus.grant);
endtask
logic [31:0] addr, data;
initial
fork
bus_read(addr, data);
thread2: begin
@data; // 在数据变化时触发
$display("Read %h from bus", data);
end
join
```
## 4.4. 参数的默认值
当测试程序越来越复杂时,会希望在不破坏已有代码的情况下增加额外的控制。在[例 3.10](#例3.10) 的函数里,可能想把数组中间部分元素的校验和打印出来,但是又不希望改写代码,为每次函数调用增加额外的参数。在 SystemVerilog 中,可以为参数指定一个默认值,如果在调用时不指明参数,则使用默认值。[例 3.12](#例3.12) 为 `print_checksum` 函数增加了 `low` 和 `high` 两个参数,这样就能够打印出指定范围内的数组内容的校验和。
<span id="例3.12"></span>
``` verilog 例 3.12 带默认参数值的函数
function void print_checksum(ref bit [31:0] a[],
input bit [31:0] low = 0,
input int high = -1);
bit [31:0] checksum = 0;
if (high == -1 || high >= a.size())
high = a.size()-1;
for (int i=low; i<=high; i++)
checksum += a[i];
$display("The array checksum is %0d", sum);
endfunction
```
可以使用如[例 3.13](#例3.13) 所示的方式调用这个函数。注意,第一个调用对两种形式的 `print_checksum` 子程序都是可行的。
<span id="例3.13"></span>
``` verilog 例 3.13 使用参数的默认值
print_checksum(a); // a[0:size()-1]中所有元素的校验和——默认情况
print_checksum(a, 2, 4); // a[2:4]中所有元素的校验和
print_checksum(a, 1); // 从 1 开始
print_checksum(a,, 2); // a[0:2]中所有元素的校验和
print_checksum(); // 编译错误:a 没有默认值
```
使用 -1 (或其他任何越界值) 作为默认值,对于获知调用时是否有指定值,不失为一个好方法。
Verilog 中的 `for` 循环总是在执行初始化 (`int i=low`) 和条件测试 (`i<=high`) 之后再开始循环。所以,如果不小心把一个大于 `high` 或数组宽度的数值传递给 `low`,那么 `for` 循环的循环体将不会被执行。
## 4.5. 采用名字进行参数传递
在 SystemVerilog 的语言参考手册 (LRM) 中,任务或函数的参数有时被称为端口 (port),就跟模块的接口一样。如果有一个带着许多参数的任务或函数,其中一些参数有缺省值,而又只想对它们中的部分参数进行设置,那么可以通过采用类似 `port` 的语法指定子程序参数名字的方式来指定一个子集,如[例 3.14](#例3.14) 所示。
<span id="例3.14"></span>
``` verilog 例 3.14 采用名字进行参数传递
task many (input int a=1, b=2, c=3, d=4);
$display("%0d %0d %0d %0d", a, b, c, d);
endtask
initial begin // a b c d
many(6, 7, 8, 9); // 6 7 8 9 指定所有值
many(); // 1 2 3 4 使用默认值
many(.c(5)); // 1 2 5 4 只指定 c
many(, 6, .d(8)); // 1 6 3 8 混合方式
end
```
## 4.6. 常见的代码错误
> 在编写子程序代码时最容易犯的错误就是,往往会忘记,在默认情况下,参数的类型是与其前一个参数相同的,而第一个参数的默认类型是单比特输入。先看看[例 3.15](#例3.15) 所示的简单的任务头。
<span id="例3.15"></span>
``` verilog 例 3.15 原始的任务头
task sticky(int a, b);
```
这两个参数都是整型输入。在编写这个任务时,由于需要访问一个数组,因此又加入了一个新的数组参数,并且使用 `ref` 类型以便让数组值不被复制。修改后的子程序头如[例 3.16](#例3.16) 所示。
<span id="例3.16"></span>
``` verilog 例 3.16 加入额外数组参数的任务头
task sticky(ref int array[50],
int a, b); // 这些变量的方向是什么?
```
`a` 和 `b` 的参数类型是什么呢?它们在方向上实际采用的是与前一个参数一致的 `ref` 类型。对简单的 `int` 变量使用 `ref` 通常并无必要,但编译器不会对此做出任何反应,连警告都没有,所以你不会意识到正在使用一个错误的方向类型。
如果在子程序中使用了非默认输入类型的参数,应该明确指明所有参数的方向,如[例 3.17](#例3.17) 所示。
<span id="例3.17"></span>
``` verilog 例 3.17 加入额外数组参数的任务头
task sticky(ref int array[50],
input int a, b); // 明确指定方向
```
# 5. 子程序的返回
Verilog 中子程序的结束方式比较简单;当执行完子程序的最后一条语句,程序就会返回到调用子程序的代码上。此外,函数还会返回一个值,该值被赋给与函数同名的变量。
## 5.1. 返回 (`return`) 语句
SystemVerilog 增加了 `return` 语句,使子程序中的流程控制变得更方便。[例 3.18](#例3.18) 中的任务由于发现错误而需要提前返回。如果不这样做,那么任务中剩下的部分就必须被放到一个 `else` 条件语句中,从而使得代码变得不规整,可读性也降低了。
<span id="例3.18"></span>
``` verilog 例 3.18 在任务中用 <code>return</code> 返回
task load_array(int len, ref int array[]);
if (len <= 0) begin
$display("Bad len");
return;
end
// 任务中其余的代码
...
endtask
```
`return` 语句也可以简化函数,如[例 3.19](#例3.19) 所示。
<span id="例3.19"></span>
``` verilog 例 3.19 在函数中用 <code>return</code> 返回
function bit transmit(...);
// Send transaction
...
return ~ifc.cb.error; // 返回状态:0=error
endfunction
```
## 5.2. 从函数中返回一个数组
Verilog 的子程序只能返回一个简单值,如比特、整数或是向量。如果想计算并返回一个数组,那就不是一件容易的事情了。在 SystemVerilog 中,函数可以采用多种方式返回一个数组。
**第一种方式是定义一个数组类型,然后在函数的声明中使用该类型**。[例 3.20](#例3.20) 使用了[例 2.35](https://josh-gao.top/posts/2a5db13d.html#%E4%BE%8B2.35) 的数组类型,并创建了一个函数来初始化数组。
<span id="例3.20"></span>
``` verilog 例 3.20 使用 <code>typedef</code> 从函数中返回一个数组
typedef int fixed_array5[5];
fixed_array5 f5;
function fixed_array5 init(int start);
foreach (init[i])
init[i] = i + start;
endfunction
initial begin
f5 = init(5);
foreach (f5[i])
$display("f5[%0d] = %0d", i, f5[i]);
end
```
使用上述代码的一个问题是,函数 `init` 创建了一个数组,该数组的值被拷贝到数组 `f5` 中。如果数组很大,那么可能会引起性能上的问题。
**另一种方式是通过引用来进行数组参数的传递**。最简单的办法是以 ref 参数的形式将数组传递到函数里,如[例 3.21](#例3.21) 所示。
<span id="例3.21"></span>
``` verilog 例 3.21 把数组作为 <code>ref</code> 参数传递给函数
function void init(ref int f[5], input int start);
foreach (f[i])
f[i] = i + start;
endfunction
int fa[5];
initial begin
init(fa, 5);
foreach (fa[i])
$display("fa[%0d] = %0d", i, fa[i]);
end
```
从函数中返回数组的最后一种方式是将数组包装到一个类中,然后返回对象的句柄。
# 6. 局部数据存储
Verilog 在 20 世纪 80 年代被创建时,最初的目的是用来描述硬件。因此,语言中的所有对象都是静态分配的。特别是,子程序参数和局部变量是被存放在固定位置的,而不像其他编程语言那样存放在堆栈区里。诸如递归子程序一类的动态代码没有对应的芯片实现方式,那还有什么必要为它们建模呢?对于那些做验证的软件工程师来说,使用 Verilog
可能会有些困难,他们已经习惯了像 C 一类的基于堆栈区 (stack-based) 的语言,因而在使用子程序库创建复杂 testbench 方面可能会显得力不从心。
## 6.1. 自动存储
在 Verilog-1995 里,如果试图在测试程序里的多个地方调用同一个任务,由于任务里的局部变量会使用共享的静态存储区,所以不同的线程之间会窜用这些局部变量。在Verilog-2001 里,可以指定任务、函数和模块使用自动存储,从而迫使仿真器使用堆栈区存储局部变量。
> 在 SystemVerilog 中,模块 (`module`) 和 `program` 块中的子程序默认情况下仍然使用静态存储。如果要使用自动存储,则必须在程序语句中加入 `automatic` 关键词。后续会详细讲解用于编写 testbench 代码的 `program` 块,以及如何在创建多线程时使用动态存储。
[例 3.22](#例3.22) 所示的是一个用于监测数据何时被写人存储器的任务。
<span id="例3.22"></span>
``` verilog 例 3.22 在 <code>program</code> 块中指定自动存储方式
program automatic test;
task wait_for_mem(input [31:0] addr, expect_data,
output success);
while (bus.addr !== addr)
@(bus.addr);
success = (bus.data == expect_data);
endtask
...
endprogram
```
因为参数 `addr` 和 `expect_data` 在每次调用时都使用不同的存储空间,所以对这个任务同时进行多次调用是没有问题的。但如果没有修饰符 `automatic`,由于第一次调用的任务处于等待状态,所以对 `wait_for_mem` 的第二次调用会覆盖它的两个参数。
## 6.2. 变量的初始化
> 当试图在声明中初始化局部变量时,类似的问题也会出现,因为局部变量实际上在仿真开始前就被赋了初值。常规的解决方法是**避免在变量声明中赋予除常数以外的任何值**。对局部变量使用单独的赋值语句也会使控制变得更方便。
[例 3.23](#例3.23) 中的任务在检测总线五个周期以后,创建了一个局部变量并试图把当前地址总线的值作为初值赋给它。
<span id="例3.23"></span>
``` verilog 例 3.23 静态初始化的 bug
program initialization; // 有 bug 的版本
task check_bus;
repeat (5) @(posedge clock);
if (bus_cmd == 'READ) begin
// 何时对 local_addr 赋初值?
logic [7:0] local_addr = addr<<2; // Bug
$display("Local Addr = %h", local_addr);
end
endtask
endprogram
```
存在的 bug 是,变量 `local_addr` 是静态分配的,所以实际上在仿真的一开始它就有了初值,而不是等到进入 `begin ... end` 块中才进行初始化。同样,解决的办法是把程序块声明为 `automatic`,如同[例 3.24](#例3.24) 所示。
<span id="例3.24"></span>
``` verilog 例 3.24 修复静态初始化的 bug:使用 <code>automatic</code>
program automatic initialization; // Bug 被修复
...
endprogram
```
此外,如果不在声明中初始化变量,那这个 bug 也可以避免,只是这种方式不太好记住,尤其是对习惯了 C 语言的程序员。[例 3.25](#例3.25) 给出了一种较为可取的编码风格,用于分离声明和初始化。
<span id="例3.25"></span>
``` verilog 例 3.25 修复静态初始化的 bug:把声明和初始化拆开
logic [7:0] local_addr
local_addr = addr << 2; // Bug
```
# 7. 时间值
SystemVerilog 有几种新结构使你可以非常明确地在系统中指明时间值。
## 7.1. 时间单位和精度
当使用编译指示语句 `'timescale` 时,在编译文件时就必须按照适当的顺序以确保所有的时延都采用适宜的量程和精度。`timeunit` 和 `timeprecision` 声明语句可以明确地为每个模块指明时间值,从而避免歧义。[例 3.26](#例3.26) 展示了这些声明语句。注意,如果使用这些语句替代 `` `timescale``,则必须把它们放到每个带有时延的模块里。
## 7.2. 时间参数
SystemVerilog 允许使用数值和单位来明确指定一个时间值。代码里可以使用类似 `0.1ns` 和 `20ps` 的时延。只要记得使用 `timeunit` 和 `timeprecision`、或者 `` `timescale`` 即可。还可以通过使用经典的 Verilog 时间函数 `$timeformat`,`$time` 和 `$realtime` 来使代码在时间标度上更清楚。`$timeformat` 的四个参数分别是时间标度 (-9 代表纳秒,-12 代表皮秒),小数点后的数据精度,时间值之后的后缀字符串,以及显示数值的最小宽度。
例 3.26 所示的是使用 `$tmeformat()` 和 `%t` 指定符进行格式化后的多种时延以及打印结果。
<span id="例3.26"></span>
``` verilog 例 3.26 时间参数和 <code>$timeformat</code>
module timing;
timeunit 1ns;
timeprecision 1ps;
initial begin
$timeformat(-9, 3, "ns", 8);
#1 $display("%t", $realtime); // 1.000ns
#2ns $display("%t", $realtime); // 3.000ns
#0.1ns $display("%t", $realtime); // 3.100ns
#41ps $display("%t", $realtime); // 3.141ns
end
endmodule
```
## 7.3. 时间和变量
可以把时间值存放到变量里,并在计算和延时中使用它们。根据当前的时间量程和精度,时间值会被缩放或舍入。`time` 类型的变量不能保存小数时延,因为它们是 64 比特的整数,所以时延的小数部分会被舍入。如果不希望这样,那应该采用 `real` 变量。
[例 3.27](#例3.27) 使用实 (real) 变量保存精确的数值,它们只在用作时延量的时候才被舍入。
<span id="例3.27"></span>
``` verilog 例 3.27 时间变量及舍入
`timescale 1ps/1ps
module ps;
initial begin
real rdelay = 800fs; // 以 0.800 存储
time tdelay = 800fs; // 舍入后得到 1
$timeformat(-15, 0, "fs", 5);
#rdelay; // 时延舍入后得到 1ps
$display("%t", rdelay); // "800fs"
#tdelay; // 再次延时 1ps
$display("%t", tdelay); // "1000fs"
end
endmodule
```
## 7.4. `$time` 与 `$realtime` 的对比
系统任务 `$time` 的返回值是一个根据所在模块的时间精度要求进行舍入的整数,不带小数部分,而 `$realtime` 的返回值则是一个带小数部分的完整实数。本文为简洁起见,所举例子中全部使用 `$time`,但请不要忘记,testbench 可能需要使用 `$realtime`。
# 8. 结束语
SystemVerilog 的程序化结构和任务、函数中的新特点使得它与诸如 C/C++ 一类的编程语言更加接近,从而也更便于编写 testbench。和 C/C++ 相比,SystemVerilog 还拥有额外的 HDL 结构,例如,时序控制、简单的线程控制和四态逻辑等。
# 参考文献
1. 克里斯·斯皮尔, 斯皮尔, 张春,等. SystemVerilog验证:测试平台编写指南[M]. 科学出版社, 2009.
2. Spear C. SystemVerilog for verification: a guide to learning the testbench language features[M]. Springer Science & Business Media, 2008.
+6
View File
@@ -0,0 +1,6 @@
---
title: about
date: 2020-11-25 16:12:56
type: about
comments: false
---
+6
View File
@@ -0,0 +1,6 @@
---
title: categories
date: 2020-11-24 21:28:48
type: categories
comments: false
---
+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1366 362">
<linearGradient id="a" x1="428.258" x2="434.145" y1="404.15" y2="409.85" gradientUnits="userSpaceOnUse" gradientTransform="matrix(94.045 0 0 -94.072 -40381.527 38479.52)">
<stop offset="0" stop-color="#00aeff"/>
<stop offset="1" stop-color="#3369e7"/>
</linearGradient>
<path fill="url(#a)" d="M61.8 15.4h242.8c23.9 0 43.4 19.4 43.4 43.4v242.9c0 23.9-19.4 43.4-43.4 43.4H61.8c-23.9 0-43.4-19.4-43.4-43.4v-243c0-23.9 19.4-43.3 43.4-43.3z"/>
<path fill="#FFF" d="M187 98.7c-51.4 0-93.1 41.7-93.1 93.2S135.6 285 187 285s93.1-41.7 93.1-93.2-41.6-93.1-93.1-93.1zm0 158.8c-36.2 0-65.6-29.4-65.6-65.6s29.4-65.6 65.6-65.6 65.6 29.4 65.6 65.6-29.3 65.6-65.6 65.6zm0-117.8v48.9c0 1.4 1.5 2.4 2.8 1.7l43.4-22.5c1-.5 1.3-1.7.8-2.7-9-15.8-25.7-26.6-45-27.3-1 0-2 .8-2 1.9zm-60.8-35.9l-5.7-5.7c-5.6-5.6-14.6-5.6-20.2 0l-6.8 6.8c-5.6 5.6-5.6 14.6 0 20.2l5.6 5.6c.9.9 2.2.7 3-.2 3.3-4.5 6.9-8.8 10.9-12.8 4.1-4.1 8.3-7.7 12.9-11 1-.6 1.1-2 .3-2.9zM217.5 89V77.7c0-7.9-6.4-14.3-14.3-14.3h-33.3c-7.9 0-14.3 6.4-14.3 14.3v11.6c0 1.3 1.2 2.2 2.5 1.9 9.3-2.7 19.1-4.1 29-4.1 9.5 0 18.9 1.3 28 3.8 1.2.3 2.4-.6 2.4-1.9z"/>
<path fill="#182359" d="M842.5 267.6c0 26.7-6.8 46.2-20.5 58.6-13.7 12.4-34.6 18.6-62.8 18.6-10.3 0-31.7-2-48.8-5.8l6.3-31c14.3 3 33.2 3.8 43.1 3.8 15.7 0 26.9-3.2 33.6-9.6s10-15.9 10-28.5v-6.4c-3.9 1.9-9 3.8-15.3 5.8-6.3 1.9-13.6 2.9-21.8 2.9-10.8 0-20.6-1.7-29.5-5.1-8.9-3.4-16.6-8.4-22.9-15-6.3-6.6-11.3-14.9-14.8-24.8s-5.3-27.6-5.3-40.6c0-12.2 1.9-27.5 5.6-37.7 3.8-10.2 9.2-19 16.5-26.3 7.2-7.3 16-12.9 26.3-17s22.4-6.7 35.5-6.7c12.7 0 24.4 1.6 35.8 3.5 11.4 1.9 21.1 3.9 29 6.1v155.2zm-108.7-77.2c0 16.4 3.6 34.6 10.8 42.2 7.2 7.6 16.5 11.4 27.9 11.4 6.2 0 12.1-.9 17.6-2.6 5.5-1.7 9.9-3.7 13.4-6.1v-97.1c-2.8-.6-14.5-3-25.8-3.3-14.2-.4-25 5.4-32.6 14.7-7.5 9.3-11.3 25.6-11.3 40.8zm294.3 0c0 13.2-1.9 23.2-5.8 34.1s-9.4 20.2-16.5 27.9c-7.1 7.7-15.6 13.7-25.6 17.9s-25.4 6.6-33.1 6.6c-7.7-.1-23-2.3-32.9-6.6-9.9-4.3-18.4-10.2-25.5-17.9-7.1-7.7-12.6-17-16.6-27.9s-6-20.9-6-34.1c0-13.2 1.8-25.9 5.8-36.7 4-10.8 9.6-20 16.8-27.7s15.8-13.6 25.6-17.8c9.9-4.2 20.8-6.2 32.6-6.2s22.7 2.1 32.7 6.2c10 4.2 18.6 10.1 25.6 17.8 7.1 7.7 12.6 16.9 16.6 27.7 4.2 10.8 6.3 23.5 6.3 36.7zm-40 .1c0-16.9-3.7-31-10.9-40.8-7.2-9.9-17.3-14.8-30.2-14.8-12.9 0-23 4.9-30.2 14.8-7.2 9.9-10.7 23.9-10.7 40.8 0 17.1 3.6 28.6 10.8 38.5 7.2 10 17.3 14.9 30.2 14.9 12.9 0 23-5 30.2-14.9 7.2-10 10.8-21.4 10.8-38.5zm127.1 86.4c-64.1.3-64.1-51.8-64.1-60.1L1051 32l39.1-6.2v183.6c0 4.7 0 34.5 25.1 34.6v32.9zm68.9 0h-39.3V108.1l39.3-6.2v175zm-19.7-193.5c13.1 0 23.8-10.6 23.8-23.7S1177.6 36 1164.4 36s-23.8 10.6-23.8 23.7 10.7 23.7 23.8 23.7zm117.4 18.6c12.9 0 23.8 1.6 32.6 4.8 8.8 3.2 15.9 7.7 21.1 13.4s8.9 13.5 11.1 21.7c2.3 8.2 3.4 17.2 3.4 27.1v100.6c-6 1.3-15.1 2.8-27.3 4.6s-25.9 2.7-41.1 2.7c-10.1 0-19.4-1-27.7-2.9-8.4-1.9-15.5-5-21.5-9.3-5.9-4.3-10.5-9.8-13.9-16.6-3.3-6.8-5-16.4-5-26.4 0-9.6 1.9-15.7 5.6-22.3 3.8-6.6 8.9-12 15.3-16.2 6.5-4.2 13.9-7.2 22.4-9s17.4-2.7 26.6-2.7c4.3 0 8.8.3 13.6.8s9.8 1.4 15.2 2.7v-6.4c0-4.5-.5-8.8-1.6-12.8-1.1-4.1-3-7.6-5.6-10.7-2.7-3.1-6.2-5.5-10.6-7.2s-10-3-16.7-3c-9 0-17.2 1.1-24.7 2.4-7.5 1.3-13.7 2.8-18.4 4.5l-4.7-32.1c4.9-1.7 12.2-3.4 21.6-5.1s19.5-2.6 30.3-2.6zm3.3 141.9c12 0 20.9-.7 27.1-1.9v-39.8c-2.2-.6-5.3-1.3-9.4-1.9-4.1-.6-8.6-1-13.6-1-4.3 0-8.7.3-13.1 1-4.4.6-8.4 1.8-11.9 3.5s-6.4 4.1-8.5 7.2c-2.2 3.1-3.2 4.9-3.2 9.6 0 9.2 3.2 14.5 9 18 5.9 3.6 13.7 5.3 23.6 5.3zM512.9 103c12.9 0 23.8 1.6 32.6 4.8 8.8 3.2 15.9 7.7 21.1 13.4 5.3 5.8 8.9 13.5 11.1 21.7 2.3 8.2 3.4 17.2 3.4 27.1v100.6c-6 1.3-15.1 2.8-27.3 4.6-12.2 1.8-25.9 2.7-41.1 2.7-10.1 0-19.4-1-27.7-2.9-8.4-1.9-15.5-5-21.5-9.3-5.9-4.3-10.5-9.8-13.9-16.6-3.3-6.8-5-16.4-5-26.4 0-9.6 1.9-15.7 5.6-22.3 3.8-6.6 8.9-12 15.3-16.2 6.5-4.2 13.9-7.2 22.4-9s17.4-2.7 26.6-2.7c4.3 0 8.8.3 13.6.8 4.7.5 9.8 1.4 15.2 2.7v-6.4c0-4.5-.5-8.8-1.6-12.8-1.1-4.1-3-7.6-5.6-10.7-2.7-3.1-6.2-5.5-10.6-7.2-4.4-1.7-10-3-16.7-3-9 0-17.2 1.1-24.7 2.4-7.5 1.3-13.7 2.8-18.4 4.5l-4.7-32.1c4.9-1.7 12.2-3.4 21.6-5.1 9.4-1.8 19.5-2.6 30.3-2.6zm3.4 142c12 0 20.9-.7 27.1-1.9v-39.8c-2.2-.6-5.3-1.3-9.4-1.9-4.1-.6-8.6-1-13.6-1-4.3 0-8.7.3-13.1 1-4.4.6-8.4 1.8-11.9 3.5s-6.4 4.1-8.5 7.2c-2.2 3.1-3.2 4.9-3.2 9.6 0 9.2 3.2 14.5 9 18s13.7 5.3 23.6 5.3zm158.5 31.9c-64.1.3-64.1-51.8-64.1-60.1L610.6 32l39.1-6.2v183.6c0 4.7 0 34.5 25.1 34.6v32.9z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

+380
View File
@@ -0,0 +1,380 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 247 247" style="enable-background:new 0 0 247 247;" xml:space="preserve">
<style type="text/css">
.st0{fill:#EDEDED;}
.st1{fill:none;stroke:#EDEDED;stroke-width:0.109;stroke-linecap:square;stroke-miterlimit:2;}
.st2{fill-rule:evenodd;clip-rule:evenodd;fill:#707070;}
</style>
<rect x="0.05" y="0.05" class="st0" width="247.08" height="247.08"/>
<rect x="0.05" y="0.05" class="st1" width="247.08" height="247.08"/>
<path class="st1" d="M247.13,247.13"/>
<path class="st2" d="M9.95,217.79l7.44-7.38l-0.84-0.84l-7.38,7.44L9.95,217.79 M18.89,210.41l-8.94,8.94l-2.34-2.34l8.94-8.94
L18.89,210.41z M27.29,235.13l7.44-7.38l-15.3-15.3l-7.38,7.38L27.29,235.13z M36.23,227.75l-8.94,8.94l-16.8-16.86l8.94-8.94
L36.23,227.75z"/>
<path class="st2" d="M29.39,235.49l5.7-5.7l-0.48-0.42l-5.64,5.7L29.39,235.49 M36.59,229.79l-7.2,7.26l-1.98-1.98l7.2-7.26
L36.59,229.79z M12.05,218.15l5.7-5.64l-0.48-0.48l-5.64,5.7L12.05,218.15z M19.31,212.51l-7.26,7.2l-1.98-1.98l7.2-7.2
L19.31,212.51z M33.71,205.31l0.78-0.78l7.86,7.86l-0.78,0.78L33.71,205.31z M29.45,209.39l0.78-0.78l7.86,7.92l-0.78,0.78
L29.45,209.39z M19.97,216.17l0.78-0.78l10.68,10.74l-0.72,0.78L19.97,216.17z"/>
<path class="st2" d="M10.31,211.49l0.78-0.78l1.56,1.62l-0.78,0.72L10.31,211.49 M31.19,236.09l4.44-4.5l-0.42-0.42l-4.5,4.44
L31.19,236.09z M37.19,231.59l-6,6l-1.98-1.98l6-6L37.19,231.59z"/>
<path class="st2" d="M9.35,210.53c0,0.18,0.12,0.36,0.24,0.54c0.12,0.12,0.3,0.18,0.54,0.18c0.18,0,0.36-0.06,0.48-0.18
c0.18-0.18,0.24-0.36,0.24-0.54c0-0.18-0.06-0.36-0.24-0.54c-0.12-0.12-0.3-0.18-0.48-0.18c-0.24,0-0.42,0.06-0.54,0.18
C9.47,210.17,9.35,210.35,9.35,210.53 M11.39,210.53c0,0.36-0.12,0.66-0.36,0.9c-0.24,0.24-0.6,0.36-0.9,0.36
c-0.36,0-0.66-0.12-0.9-0.36c-0.3-0.24-0.42-0.54-0.42-0.9c0-0.36,0.12-0.66,0.42-0.9c0.24-0.24,0.54-0.36,0.9-0.36
c0.3,0,0.66,0.12,0.9,0.36C11.27,209.87,11.39,210.17,11.39,210.53z M37.43,238.67l0.78-0.78l0.78,0.72l-0.78,0.78L37.43,238.67z
M33.41,234.59l0.78-0.78l1.56,1.62l-0.78,0.78L33.41,234.59z"/>
<path class="st2" d="M15.89,230.09l2.52-2.58l0.78,0.78l-2.58,2.58L15.89,230.09 M26.69,218.99l2.58-2.58l0.78,0.78l-2.58,2.58
L26.69,218.99z M35.27,240.47l4.74-4.8c-0.6-0.54-1.38-0.84-2.22-0.84c-0.9,0-1.74,0.36-2.4,0.96c-0.66,0.66-1.02,1.5-1.02,2.4
C34.37,239.03,34.73,239.87,35.27,240.47z M40.79,235.67l-5.52,5.58l-0.24-0.24c-0.78-0.78-1.2-1.74-1.2-2.82
c0-1.02,0.42-2.04,1.2-2.76c0.72-0.72,1.68-1.14,2.76-1.14c1.02,0,2.04,0.42,2.76,1.14c0.06,0,0.06,0,0.06,0.06L40.79,235.67z"/>
<path class="st2" d="M33.77,220.13l11.22-11.28l-7.08-7.14l-11.28,11.28L33.77,220.13 M46.55,208.85l-12.78,12.78l-8.7-8.64
l12.84-12.78L46.55,208.85z"/>
<path class="st2" d="M8.39,230.51l0.78-0.78l7.86,7.86l-0.72,0.78L8.39,230.51 M4.43,234.89l0.78-0.78l7.86,7.92l-0.78,0.72
L4.43,234.89z M30.95,217.55l12.06-12.06l0.78,0.78l-12.06,12.06L30.95,217.55z M27.95,215.09l12-12.06l0.78,0.78l-12,12.06
L27.95,215.09z"/>
<path class="st2" d="M8.75,245.57l11.22-11.28l-7.08-7.08L1.61,238.49L8.75,245.57 M21.53,234.29L8.75,247.13l-8.7-8.64l12.84-12.84
L21.53,234.29z"/>
<path class="st2" d="M5.93,242.99l12.06-12l0.78,0.78l-12.06,12L5.93,242.99 M2.93,240.53l12-12l0.78,0.78l-12,12L2.93,240.53z"/>
<path class="st2" d="M79.25,175.19l-7.44-7.38l-0.78,0.84l7.38,7.38L79.25,175.19 M71.81,166.25l8.94,8.94l-2.34,2.4l-8.94-8.94
L71.81,166.25z M96.59,157.91l-7.44-7.44l-15.24,15.3l7.38,7.38L96.59,157.91z M89.15,148.97l8.94,8.94l-16.8,16.8l-8.94-8.94
L89.15,148.97z"/>
<path class="st2" d="M96.89,155.81l-5.64-5.7l-0.42,0.48l5.64,5.64L96.89,155.81 M91.25,148.61l7.2,7.2l-1.98,1.98l-7.2-7.2
L91.25,148.61z M79.61,173.15l-5.7-5.7l-0.42,0.42l5.64,5.7L79.61,173.15z M73.91,165.89l7.2,7.26l-1.98,1.98l-7.2-7.26
L73.91,165.89z M66.71,151.49l-0.78-0.78l7.92-7.86l0.78,0.78L66.71,151.49z M70.85,155.75l-0.78-0.78l7.92-7.86l0.72,0.78
L70.85,155.75z M77.63,165.23l-0.78-0.78l10.74-10.74l0.72,0.78L77.63,165.23z"/>
<path class="st2" d="M72.95,174.89l-0.78-0.78l1.56-1.56l0.78,0.78L72.95,174.89 M97.49,154.01l-4.44-4.44l-0.48,0.42l4.5,4.5
L97.49,154.01z M93.05,148.01l6,6l-1.98,1.98l-6.06-6L93.05,148.01z"/>
<path class="st2" d="M71.99,175.79c0.18,0.06,0.36-0.06,0.48-0.18c0.18-0.12,0.24-0.3,0.24-0.54c0-0.18-0.06-0.36-0.24-0.48
c-0.12-0.18-0.3-0.24-0.48-0.24c-0.24,0-0.42,0.06-0.54,0.24c-0.12,0.12-0.24,0.3-0.24,0.48c0,0.24,0.12,0.42,0.24,0.54
S71.75,175.85,71.99,175.79 M71.99,173.81c0.3,0,0.66,0.12,0.9,0.36c0.24,0.24,0.36,0.6,0.36,0.9c0,0.36-0.12,0.66-0.36,0.9
c-0.24,0.24-0.6,0.42-0.9,0.42c-0.36,0-0.66-0.18-0.9-0.42c-0.3-0.24-0.42-0.54-0.42-0.9c0-0.3,0.12-0.66,0.42-0.9
C71.33,173.93,71.63,173.81,71.99,173.81z M100.07,147.71l-0.78-0.72l0.78-0.78l0.78,0.78L100.07,147.71z M96.05,151.79l-0.78-0.78
l1.56-1.56l0.78,0.78L96.05,151.79z"/>
<path class="st2" d="M91.55,169.31l-2.58-2.52l0.78-0.78l2.58,2.52L91.55,169.31 M80.39,158.45l-2.52-2.52l0.72-0.78l2.58,2.58
L80.39,158.45z M101.87,149.93l-4.74-4.8c-0.54,0.66-0.9,1.44-0.9,2.28c0,0.9,0.36,1.74,1.02,2.4s1.5,0.96,2.4,0.96
C100.49,150.77,101.27,150.47,101.87,149.93z M97.13,144.41l5.52,5.52l-0.18,0.24h-0.06c-0.72,0.78-1.74,1.14-2.76,1.14
c-1.08,0-2.04-0.36-2.76-1.14c-0.78-0.72-1.2-1.74-1.2-2.76c0-1.08,0.42-2.04,1.2-2.76c0-0.06,0-0.06,0-0.06L97.13,144.41z"/>
<path class="st2" d="M81.53,151.43l-11.28-11.28l-7.08,7.14l11.28,11.28L81.53,151.43 M70.25,138.65l12.84,12.78l-8.64,8.7
l-12.84-12.84L70.25,138.65z"/>
<path class="st2" d="M91.91,176.81l-0.78-0.78l7.92-7.92l0.78,0.78L91.91,176.81 M96.35,180.77l-0.78-0.78l7.86-7.86l0.78,0.78
L96.35,180.77z M78.95,154.25l-12-12.06l0.78-0.78l12,12.06L78.95,154.25z M76.49,157.25l-12-12.06l0.72-0.72l12.06,12L76.49,157.25
z"/>
<path class="st2" d="M107.03,176.45l-11.28-11.28l-7.14,7.14l11.28,11.28L107.03,176.45 M95.75,163.67l12.84,12.78l-8.7,8.7
l-12.78-12.84L95.75,163.67z"/>
<path class="st2" d="M104.45,179.27l-12.06-12.06l0.78-0.78l12.06,12.06L104.45,179.27 M101.99,182.27l-12.06-12.06l0.78-0.72
l12.06,12L101.99,182.27z"/>
<path class="st2" d="M135.11,232.25l-2.7-10.08l-1.08,0.3l2.7,10.08L135.11,232.25 M133.19,220.85l3.3,12.18l-3.24,0.9l-3.24-12.24
L133.19,220.85z M158.81,225.95l-2.7-10.14l-20.88,5.64l2.7,10.08L158.81,225.95z M156.89,214.49l3.24,12.24l-22.98,6.12l-3.3-12.18
L156.89,214.49z"/>
<path class="st2" d="M160.13,224.33l-2.04-7.74l-0.6,0.12l2.04,7.74L160.13,224.33 M158.87,215.21l2.64,9.9l-2.76,0.72l-2.64-9.9
L158.87,215.21z M136.49,230.63l-2.1-7.74l-0.6,0.18l2.1,7.74L136.49,230.63z M135.17,221.57l2.64,9.84l-2.7,0.72l-2.64-9.84
L135.17,221.57z M136.13,205.49l-0.24-1.08l10.74-2.88l0.3,1.08L136.13,205.49z M137.57,211.25l-0.24-1.08l10.74-2.88l0.3,1.08
L137.57,211.25z M138.71,222.83l-0.3-1.08l14.64-3.9l0.3,1.02L138.71,222.83z"/>
<path class="st2" d="M129.83,228.83l-0.3-1.02l2.16-0.6l0.3,1.08L129.83,228.83 M161.57,223.07l-1.68-6.12l-0.6,0.18l1.62,6.12
L161.57,223.07z M160.67,215.63l2.22,8.22l-2.7,0.72l-2.22-8.22L160.67,215.63z"/>
<path class="st2" d="M128.51,229.19c0.18,0.06,0.36,0.12,0.6,0.06c0.18-0.06,0.3-0.18,0.42-0.36c0.12-0.18,0.12-0.36,0.06-0.54
c-0.06-0.18-0.18-0.36-0.3-0.48c-0.18-0.06-0.42-0.12-0.6-0.06c-0.18,0.06-0.36,0.18-0.42,0.36c-0.12,0.18-0.12,0.36-0.06,0.54
C128.21,228.89,128.33,229.07,128.51,229.19 M129.53,227.45c0.3,0.12,0.54,0.42,0.6,0.72c0.12,0.36,0.06,0.72-0.12,1.02
c-0.18,0.3-0.48,0.48-0.78,0.6c-0.36,0.06-0.66,0-0.96-0.18c-0.3-0.12-0.54-0.42-0.6-0.72c-0.12-0.36-0.06-0.72,0.12-1.02
c0.18-0.3,0.42-0.48,0.78-0.6C128.87,227.21,129.23,227.27,129.53,227.45z M166.91,218.93l-0.3-1.08l1.02-0.24l0.3,1.02
L166.91,218.93z M161.39,220.37l-0.3-1.02l2.16-0.6l0.3,1.08L161.39,220.37z"/>
<path class="st2" d="M148.73,233.33l-0.96-3.48l1.08-0.3l0.9,3.48L148.73,233.33 M144.53,218.39l-0.96-3.54l1.08-0.24l0.9,3.48
L144.53,218.39z M167.39,221.69l-1.74-6.48c-0.78,0.24-1.44,0.78-1.86,1.5c-0.48,0.78-0.6,1.68-0.36,2.58
c0.24,0.84,0.78,1.56,1.56,2.04C165.77,221.75,166.55,221.87,167.39,221.69z M166.01,214.49l2.04,7.62l-0.3,0.06
c-1.02,0.3-2.1,0.18-3-0.36c-0.9-0.54-1.56-1.38-1.86-2.4c-0.24-1.02-0.12-2.04,0.42-3c0.54-0.9,1.38-1.56,2.4-1.8c0,0,0,0,0.06,0
L166.01,214.49z"/>
<path class="st2" d="M149.03,212.87l-4.14-15.42l-9.72,2.58l4.14,15.42L149.03,212.87 M145.67,196.13l4.68,17.46l-11.82,3.18
l-4.68-17.46L145.67,196.13z"/>
<path class="st2" d="M145.31,239.99l-0.3-1.08l10.8-2.88l0.3,1.08L145.31,239.99 M147.17,245.63l-0.3-1.08l10.74-2.88l0.3,1.08
L147.17,245.63z M145.37,213.95l-4.38-16.44l1.02-0.3l4.44,16.5L145.37,213.95z M141.77,215.39l-4.44-16.5l1.08-0.24l4.38,16.44
L141.77,215.39z"/>
<path class="st2" d="M158.57,247.25l-4.14-15.42l-9.72,2.64l4.14,15.36L158.57,247.25 M155.21,230.51l4.68,17.52l-11.82,3.18
l-4.68-17.52L155.21,230.51z"/>
<path class="st2" d="M154.97,248.39l-4.44-16.44l1.08-0.3l4.38,16.44L154.97,248.39 M151.31,249.77l-4.44-16.44l1.08-0.3l4.38,16.44
L151.31,249.77z"/>
<path class="st2" d="M8.81,101.69l2.76-10.08l-1.14-0.3l-2.7,10.08L8.81,101.69 M12.89,90.83l-3.3,12.18l-3.18-0.84l3.24-12.18
L12.89,90.83z M32.51,108.05l2.7-10.08l-20.88-5.64l-2.7,10.14L32.51,108.05z M36.53,97.19l-3.24,12.18l-22.98-6.12l3.24-12.24
L36.53,97.19z"/>
<path class="st2" d="M34.49,107.33l2.1-7.74l-0.6-0.18l-2.1,7.74L34.49,107.33 M37.91,98.81l-2.64,9.84l-2.7-0.72l2.64-9.84
L37.91,98.81z M10.85,100.97l2.04-7.74l-0.6-0.18l-2.04,7.74L10.85,100.97z M14.21,92.45l-2.64,9.84l-2.7-0.72l2.64-9.84
L14.21,92.45z M23.09,79.01l0.3-1.08l10.8,2.88l-0.3,1.08L23.09,79.01z M21.47,84.71l0.3-1.08l10.8,2.88l-0.3,1.08L21.47,84.71z
M16.67,95.33l0.3-1.08l14.64,3.96l-0.3,1.02L16.67,95.33z"/>
<path class="st2" d="M5.93,96.05l0.3-1.02l2.16,0.6l-0.3,1.02L5.93,96.05 M36.35,106.91l1.62-6.12l-0.6-0.12l-1.68,6.12
L36.35,106.91z M39.29,100.07l-2.22,8.22l-2.7-0.78l2.22-8.22L39.29,100.07z"/>
<path class="st2" d="M4.67,95.69c0.12,0.18,0.24,0.3,0.48,0.36c0.18,0.06,0.36,0,0.54-0.06c0.18-0.12,0.3-0.24,0.36-0.48
c0-0.18,0-0.36-0.12-0.54c-0.06-0.18-0.24-0.3-0.42-0.36c-0.18,0-0.42,0-0.54,0.12c-0.18,0.06-0.3,0.24-0.36,0.42
S4.61,95.57,4.67,95.69 M6.41,94.73c0.18,0.24,0.24,0.6,0.12,0.96c-0.06,0.3-0.3,0.6-0.6,0.78s-0.6,0.18-0.96,0.12
c-0.3-0.12-0.6-0.3-0.78-0.6c-0.18-0.3-0.18-0.66-0.12-0.96c0.12-0.36,0.3-0.6,0.6-0.78c0.3-0.18,0.66-0.24,0.96-0.12
C5.99,94.19,6.23,94.43,6.41,94.73z M43.07,106.01l0.24-1.02l1.02,0.24l-0.24,1.08L43.07,106.01z M37.55,104.51l0.24-1.02l2.16,0.6
l-0.24,1.02L37.55,104.51z"/>
<path class="st2" d="M20.09,109.43l0.96-3.54l1.02,0.3l-0.96,3.48L20.09,109.43 M23.93,94.37l0.9-3.54l1.08,0.3l-0.96,3.48
L23.93,94.37z M42.05,108.71l1.74-6.54c-0.78-0.18-1.62-0.06-2.34,0.36c-0.78,0.48-1.38,1.2-1.62,2.04c-0.24,0.9-0.12,1.8,0.36,2.58
C40.61,107.87,41.27,108.41,42.05,108.71z M44.45,101.75l-1.98,7.62l-0.3-0.06l-0.06-0.06c-1.02-0.24-1.86-0.9-2.4-1.8
s-0.66-1.98-0.36-3c0.24-1.02,0.9-1.86,1.8-2.4c0.9-0.48,1.98-0.66,3-0.36c0,0,0,0,0.06,0L44.45,101.75z"/>
<path class="st2" d="M30.59,91.79l4.08-15.36l-9.72-2.64l-4.08,15.42L30.59,91.79 M36.05,75.65l-4.68,17.52l-11.88-3.18l4.74-17.52
L36.05,75.65z"/>
<path class="st2" d="M13.79,113.45l0.3-1.02l10.8,2.88l-0.3,1.08L13.79,113.45 M12.59,119.27l0.24-1.02l10.8,2.88l-0.3,1.02
L12.59,119.27z M26.87,91.01l4.44-16.5l1.02,0.3l-4.38,16.44L26.87,91.01z M23.03,90.35l4.38-16.44l1.08,0.3l-4.44,16.44
L23.03,90.35z"/>
<path class="st2" d="M21.65,126.41l4.14-15.42l-9.72-2.58l-4.14,15.36L21.65,126.41 M27.11,110.21l-4.68,17.52l-11.82-3.18
l4.68-17.52L27.11,110.21z"/>
<path class="st2" d="M17.93,125.57l4.44-16.44l1.02,0.24l-4.38,16.44L17.93,125.57 M14.09,124.91l4.44-16.44l1.02,0.3l-4.38,16.44
L14.09,124.91z"/>
<path class="st2" d="M71.75,32.45l7.38-7.38l-0.78-0.78l-7.38,7.38L71.75,32.45 M80.69,25.07l-8.94,8.94l-2.34-2.34l8.94-8.94
L80.69,25.07z M89.09,49.79l7.38-7.38l-15.3-15.3l-7.38,7.44L89.09,49.79z M98.03,42.41l-8.94,8.94l-16.86-16.8l8.94-8.94
L98.03,42.41z"/>
<path class="st2" d="M91.19,50.15l5.64-5.64l-0.42-0.48l-5.7,5.7L91.19,50.15 M98.39,44.51l-7.2,7.2l-2.04-1.98l7.26-7.2
L98.39,44.51z M73.85,32.81l5.64-5.64l-0.42-0.42l-5.7,5.64L73.85,32.81z M81.05,27.17l-7.2,7.2l-1.98-1.98l7.2-7.2L81.05,27.17z
M95.45,19.97l0.78-0.78l7.92,7.86l-0.78,0.78L95.45,19.97z M91.19,24.11l0.78-0.78l7.92,7.86l-0.78,0.78L91.19,24.11z M81.71,30.83
l0.78-0.72l10.74,10.68l-0.78,0.78L81.71,30.83z"/>
<path class="st2" d="M72.05,26.15l0.78-0.78l1.62,1.62l-0.78,0.78L72.05,26.15 M92.93,50.75l4.5-4.5l-0.48-0.42l-4.44,4.44
L92.93,50.75z M98.93,46.25l-6,6.06l-1.98-2.04l6-6L98.93,46.25z"/>
<path class="st2" d="M71.15,25.19c0,0.24,0.06,0.42,0.24,0.54c0.12,0.12,0.3,0.24,0.48,0.24c0.18,0,0.42-0.12,0.54-0.24
s0.18-0.3,0.18-0.54c0-0.18-0.06-0.36-0.18-0.48c-0.12-0.18-0.36-0.24-0.54-0.24c-0.18,0-0.36,0.06-0.48,0.24
C71.21,24.83,71.15,25.01,71.15,25.19 M73.19,25.19c0,0.36-0.18,0.66-0.42,0.9c-0.24,0.24-0.54,0.42-0.9,0.42
c-0.3,0-0.66-0.18-0.9-0.42c-0.24-0.24-0.36-0.54-0.36-0.9c0-0.3,0.12-0.66,0.36-0.9c0.24-0.24,0.6-0.36,0.9-0.36
c0.36,0,0.66,0.12,0.9,0.36C73.01,24.53,73.19,24.89,73.19,25.19z M99.23,53.33l0.78-0.78l0.72,0.72l-0.78,0.78L99.23,53.33z
M95.15,49.25l0.78-0.72l1.62,1.56l-0.78,0.78L95.15,49.25z"/>
<path class="st2" d="M77.63,44.75l2.58-2.52l0.78,0.78l-2.58,2.52L77.63,44.75 M88.49,33.65l2.58-2.58l0.72,0.78l-2.52,2.58
L88.49,33.65z M97.01,55.13l4.8-4.8c-0.6-0.54-1.38-0.84-2.22-0.84c-0.96,0-1.8,0.36-2.4,1.02c-0.66,0.6-1.02,1.5-1.02,2.4
C96.17,53.75,96.47,54.53,97.01,55.13z M102.59,50.33l-5.58,5.58l-0.18-0.18c0-0.06-0.06-0.06-0.06-0.06
c-0.72-0.72-1.14-1.74-1.14-2.76c0-1.08,0.42-2.04,1.14-2.82c0.78-0.72,1.74-1.14,2.82-1.14c1.02,0,2.04,0.42,2.76,1.14
c0,0,0,0.06,0.06,0.06L102.59,50.33z"/>
<path class="st2" d="M95.51,34.79l11.28-11.28l-7.14-7.14L88.43,27.65L95.51,34.79 M108.35,23.51L95.51,36.35l-8.64-8.7l12.78-12.78
L108.35,23.51z"/>
<path class="st2" d="M70.19,45.17l0.78-0.78l7.86,7.86l-0.78,0.78L70.19,45.17 M66.17,49.55l0.78-0.78l7.92,7.92l-0.78,0.78
L66.17,49.55z M92.75,32.21l12-12.06l0.78,0.78l-12,12.06L92.75,32.21z M89.69,29.75l12.06-12.06l0.78,0.78L90.47,30.53L89.69,29.75
z"/>
<path class="st2" d="M70.49,60.29l11.28-11.28l-7.14-7.14L63.41,53.15L70.49,60.29 M83.33,49.01L70.49,61.79l-8.64-8.64l12.78-12.84
L83.33,49.01z"/>
<path class="st2" d="M67.73,57.71l12.06-12.06l0.72,0.78l-12,12.06L67.73,57.71 M64.67,55.25l12.06-12.06l0.78,0.78l-12.06,12
L64.67,55.25z"/>
<path class="st2" d="M195.29,156.05l7.44-7.44l-0.84-0.78l-7.38,7.38L195.29,156.05 M204.23,148.61l-8.94,8.94l-2.34-2.34l8.94-8.94
L204.23,148.61z M212.63,173.33l7.38-7.38l-15.24-15.3l-7.44,7.44L212.63,173.33z M221.57,165.95l-8.94,8.94l-16.8-16.8l8.94-8.94
L221.57,165.95z"/>
<path class="st2" d="M214.73,173.69l5.64-5.64l-0.42-0.48l-5.7,5.7L214.73,173.69 M221.93,168.05l-7.2,7.2l-1.98-1.98l7.2-7.2
L221.93,168.05z M197.39,156.41l5.7-5.7l-0.48-0.42l-5.64,5.64L197.39,156.41z M204.59,150.71l-7.2,7.2l-1.98-1.98l7.2-7.2
L204.59,150.71z M218.99,143.51l0.78-0.78l7.92,7.92l-0.78,0.72L218.99,143.51z M214.79,147.65l0.72-0.78l7.92,7.86l-0.78,0.78
L214.79,147.65z M205.31,154.43l0.72-0.78l10.74,10.68l-0.78,0.78L205.31,154.43z"/>
<path class="st2" d="M195.59,149.69l0.78-0.72l1.62,1.56l-0.78,0.78L195.59,149.69 M216.47,174.29l4.5-4.5l-0.42-0.42l-4.5,4.5
L216.47,174.29z M222.53,169.79l-6.06,6.06l-1.98-1.98l6.06-6.06L222.53,169.79z"/>
<path class="st2" d="M194.69,148.73c0,0.24,0.06,0.42,0.24,0.54c0.12,0.12,0.3,0.24,0.48,0.24c0.24,0,0.42-0.12,0.54-0.24
s0.24-0.3,0.24-0.54c0-0.18-0.12-0.36-0.24-0.48c-0.12-0.18-0.3-0.24-0.54-0.24c-0.18,0-0.36,0.06-0.48,0.24
C194.75,148.37,194.69,148.55,194.69,148.73 M196.73,148.73c0,0.36-0.12,0.72-0.42,0.96c-0.24,0.24-0.54,0.36-0.9,0.36
c-0.3,0-0.66-0.12-0.9-0.36c-0.24-0.24-0.36-0.6-0.36-0.96c0-0.3,0.12-0.66,0.36-0.9c0.24-0.24,0.6-0.36,0.9-0.36
c0.36,0,0.66,0.12,0.9,0.36C196.61,148.07,196.73,148.43,196.73,148.73z M222.77,176.87l0.78-0.78l0.72,0.78l-0.72,0.72
L222.77,176.87z M218.75,172.85l0.78-0.78l1.56,1.56l-0.78,0.78L218.75,172.85z"/>
<path class="st2" d="M201.17,168.35l2.58-2.58l0.78,0.78l-2.58,2.52L201.17,168.35 M212.03,157.19l2.58-2.58l0.78,0.78l-2.58,2.58
L212.03,157.19z M220.61,178.67l4.74-4.74c-0.6-0.6-1.38-0.9-2.22-0.9c-0.9,0-1.8,0.36-2.4,1.02c-0.66,0.66-1.02,1.5-1.02,2.4
C219.71,177.29,220.01,178.07,220.61,178.67z M226.13,173.93l-5.52,5.52l-0.24-0.18c0,0,0-0.06-0.06-0.06
c-0.72-0.72-1.14-1.74-1.14-2.76c0-1.08,0.42-2.04,1.14-2.82c0.78-0.72,1.74-1.14,2.82-1.14c1.02,0,2.04,0.42,2.76,1.14
c0,0.06,0.06,0.06,0.06,0.06L226.13,173.93z"/>
<path class="st2" d="M219.05,158.33l11.28-11.28l-7.08-7.08l-11.28,11.22L219.05,158.33 M231.89,147.05l-12.84,12.84l-8.64-8.7
l12.84-12.78L231.89,147.05z"/>
<path class="st2" d="M193.73,168.71l0.78-0.78l7.86,7.92l-0.78,0.72L193.73,168.71 M189.77,173.09l0.72-0.72l7.92,7.86l-0.78,0.78
L189.77,173.09z M216.29,155.75l12.06-12l0.78,0.72l-12.06,12.06L216.29,155.75z M213.29,153.29l12-12.06l0.78,0.78l-12.06,12.06
L213.29,153.29z"/>
<path class="st2" d="M194.03,183.83l11.28-11.28l-7.08-7.14l-11.28,11.28L194.03,183.83 M206.87,172.55l-12.84,12.78l-8.64-8.64
l12.84-12.78L206.87,172.55z"/>
<path class="st2" d="M191.27,181.25l12.06-12.06l0.78,0.78l-12.06,12.06L191.27,181.25 M188.27,178.79l12-12.06l0.78,0.78
l-12.06,12.06L188.27,178.79z"/>
<path class="st2" d="M133.55,94.25l7.38-7.38l-0.78-0.84l-7.44,7.44L133.55,94.25 M142.49,86.87l-8.94,8.94l-2.34-2.34l8.94-8.94
L142.49,86.87z M150.89,111.59l7.38-7.38l-15.3-15.3l-7.38,7.38L150.89,111.59z M159.83,104.21l-8.94,8.94l-16.86-16.86l8.94-8.94
L159.83,104.21z"/>
<path class="st2" d="M152.93,111.95l5.7-5.7l-0.48-0.42l-5.64,5.64L152.93,111.95 M160.13,106.25l-7.2,7.2l-1.98-1.98l7.2-7.2
L160.13,106.25z M135.59,94.61l5.7-5.64l-0.42-0.48l-5.7,5.7L135.59,94.61z M142.85,88.97l-7.26,7.2l-1.98-1.98l7.26-7.26
L142.85,88.97z M157.25,81.71l0.78-0.72l7.86,7.86l-0.78,0.78L157.25,81.71z M152.99,85.85l0.78-0.78l7.86,7.92l-0.78,0.78
L152.99,85.85z M143.51,92.63l0.78-0.78l10.74,10.74l-0.78,0.78L143.51,92.63z"/>
<path class="st2" d="M133.85,87.95l0.78-0.78l1.56,1.56l-0.78,0.78L133.85,87.95 M154.73,112.49l4.44-4.44l-0.42-0.48l-4.5,4.5
L154.73,112.49z M160.73,108.05l-6,6l-1.98-1.98l6-6L160.73,108.05z"/>
<path class="st2" d="M132.95,86.99c0,0.18,0.06,0.36,0.18,0.54c0.12,0.12,0.36,0.18,0.54,0.18c0.18,0,0.36-0.06,0.48-0.18
c0.18-0.18,0.24-0.36,0.24-0.54c0-0.18-0.06-0.36-0.24-0.54c-0.12-0.12-0.3-0.18-0.48-0.18c-0.18,0-0.42,0.06-0.54,0.18
S132.95,86.81,132.95,86.99 M134.93,86.99c0,0.36-0.12,0.66-0.36,0.9c-0.24,0.24-0.6,0.36-0.9,0.36c-0.36,0-0.66-0.12-0.9-0.36
c-0.24-0.24-0.42-0.54-0.42-0.9c0-0.36,0.18-0.66,0.42-0.9c0.24-0.24,0.54-0.36,0.9-0.36c0.3,0,0.66,0.12,0.9,0.36
C134.81,86.33,134.93,86.63,134.93,86.99z M161.03,115.07l0.72-0.72l0.78,0.72l-0.78,0.78L161.03,115.07z M156.95,111.05l0.78-0.78
l1.56,1.62l-0.78,0.72L156.95,111.05z"/>
<path class="st2" d="M139.43,106.55l2.52-2.58l0.78,0.78l-2.52,2.58L139.43,106.55 M150.29,95.39l2.52-2.52l0.78,0.78l-2.58,2.52
L150.29,95.39z M158.81,116.93l4.8-4.8c-0.66-0.54-1.44-0.84-2.28-0.84c-0.9,0-1.74,0.36-2.4,0.96c-0.6,0.66-0.96,1.5-0.96,2.4
C157.97,115.49,158.27,116.27,158.81,116.93z M164.33,112.13l-5.52,5.58l-0.24-0.24c-0.78-0.78-1.14-1.74-1.14-2.82
c0-1.02,0.36-2.04,1.14-2.76c0.72-0.78,1.74-1.14,2.76-1.14c1.08,0,2.04,0.36,2.76,1.14c0.06,0,0.06,0,0.06,0L164.33,112.13z"/>
<path class="st2" d="M157.31,96.53l11.28-11.22l-7.14-7.14l-11.28,11.28L157.31,96.53 M170.09,85.31l-12.78,12.78l-8.7-8.64
l12.84-12.84L170.09,85.31z"/>
<path class="st2" d="M131.93,106.91l0.78-0.78l7.92,7.92l-0.78,0.78L131.93,106.91 M127.97,111.35l0.78-0.78l7.86,7.86l-0.72,0.78
L127.97,111.35z M154.49,94.01l12.06-12.06l0.78,0.78l-12.06,12L154.49,94.01z M151.49,91.55l12.06-12.06l0.72,0.78l-12,12
L151.49,91.55z"/>
<path class="st2" d="M132.29,122.03l11.28-11.28l-7.14-7.08l-11.28,11.22L132.29,122.03 M145.07,110.75l-12.78,12.84l-8.7-8.7
l12.84-12.78L145.07,110.75z"/>
<path class="st2" d="M129.47,119.45l12.06-12l0.78,0.72l-12.06,12.06L129.47,119.45 M126.47,116.99l12.06-12.06l0.78,0.78
l-12.06,12.06L126.47,116.99z"/>
<path class="st2" d="M210.23,52.79l-10.08-2.7l-0.3,1.08l10.08,2.76L210.23,52.79 M199.37,48.77l12.18,3.24l-0.84,3.24l-12.18-3.3
L199.37,48.77z M216.59,29.15l-10.14-2.76l-5.58,20.94l10.14,2.7L216.59,29.15z M205.73,25.07l12.18,3.3l-6.18,22.98l-12.18-3.3
L205.73,25.07z"/>
<path class="st2" d="M215.87,27.17l-7.8-2.1l-0.12,0.6l7.74,2.1L215.87,27.17 M207.35,23.75l9.84,2.64l-0.72,2.7l-9.84-2.64
L207.35,23.75z M209.51,50.81l-7.74-2.1l-0.18,0.66l7.74,2.04L209.51,50.81z M200.99,47.39l9.84,2.64l-0.72,2.7l-9.84-2.64
L200.99,47.39z M187.55,38.51l-1.08-0.24l2.88-10.8l1.08,0.3L187.55,38.51z M193.25,40.13l-1.08-0.24l2.88-10.8l1.08,0.3
L193.25,40.13z M203.87,44.99l-1.08-0.3l3.9-14.64l1.08,0.3L203.87,44.99z"/>
<path class="st2" d="M204.59,55.67l-1.02-0.24l0.6-2.16l1.02,0.24L204.59,55.67 M215.45,25.31l-6.12-1.62l-0.12,0.6l6.06,1.62
L215.45,25.31z M208.55,22.37l8.22,2.16l-0.72,2.76l-8.22-2.22L208.55,22.37z"/>
<path class="st2" d="M204.23,56.99c0.18-0.12,0.3-0.3,0.36-0.48c0.06-0.18,0-0.36-0.06-0.54c-0.12-0.18-0.3-0.3-0.48-0.36
c-0.18-0.06-0.36,0-0.54,0.06c-0.18,0.12-0.3,0.3-0.36,0.48s0,0.36,0.12,0.54c0.06,0.18,0.24,0.3,0.42,0.36
S204.05,57.05,204.23,56.99 M203.21,55.19c0.3-0.12,0.66-0.18,1.02-0.12c0.3,0.12,0.6,0.3,0.78,0.6c0.12,0.3,0.18,0.66,0.12,0.96
c-0.12,0.36-0.3,0.66-0.6,0.78c-0.3,0.18-0.66,0.24-0.96,0.18c-0.36-0.12-0.6-0.3-0.78-0.6c-0.18-0.3-0.24-0.66-0.12-1.02
C202.73,55.67,202.97,55.37,203.21,55.19z M214.55,18.59l-1.02-0.3l0.24-1.02l1.08,0.3L214.55,18.59z M213.05,24.11l-1.02-0.3
l0.54-2.16l1.08,0.3L213.05,24.11z"/>
<path class="st2" d="M217.91,41.57l-3.48-0.96l0.3-1.02l3.48,0.9L217.91,41.57 M202.91,37.73l-3.54-0.96l0.3-1.02l3.48,0.9
L202.91,37.73z M217.25,19.61l-6.54-1.8c-0.18,0.84-0.06,1.68,0.36,2.4c0.48,0.78,1.2,1.32,2.04,1.56c0.9,0.24,1.8,0.12,2.58-0.3
C216.41,21.05,216.95,20.39,217.25,19.61z M210.29,17.15l7.62,2.04l-0.06,0.3c-0.06,0-0.06,0-0.06,0.06c-0.24,1.02-0.9,1.86-1.8,2.4
c-0.9,0.48-1.98,0.66-3,0.36c-1.02-0.24-1.86-0.9-2.4-1.8c-0.54-0.96-0.66-1.98-0.36-3c0-0.06,0-0.06,0-0.06L210.29,17.15z"/>
<path class="st2" d="M200.33,31.07l-15.36-4.14l-2.64,9.72l15.42,4.14L200.33,31.07 M184.19,25.61l17.52,4.68l-3.18,11.82
l-17.52-4.68L184.19,25.61z"/>
<path class="st2" d="M221.99,47.81l-1.02-0.24l2.88-10.8l1.02,0.3L221.99,47.81 M227.81,49.07l-1.08-0.3l2.94-10.74l1.02,0.24
L227.81,49.07z M199.49,34.79l-16.44-4.44l0.3-1.02l16.44,4.38L199.49,34.79z M198.89,38.63l-16.44-4.44l0.3-1.02l16.44,4.38
L198.89,38.63z"/>
<path class="st2" d="M234.95,40.01l-15.42-4.14l-2.58,9.72l15.36,4.14L234.95,40.01 M218.75,34.55l17.52,4.68l-3.18,11.82
l-17.52-4.68L218.75,34.55z"/>
<path class="st2" d="M234.11,43.67l-16.5-4.38l0.3-1.08l16.44,4.44L234.11,43.67 M233.45,47.57l-16.44-4.44l0.3-1.02l16.44,4.38
L233.45,47.57z"/>
<path class="st2" d="M9.95-29.29l7.44-7.38l-0.84-0.84l-7.38,7.38L9.95-29.29 M18.89-36.67l-8.94,8.94l-2.34-2.4l8.94-8.94
L18.89-36.67z M27.29-11.95l7.44-7.44l-15.3-15.24l-7.38,7.38L27.29-11.95z M36.23-19.39l-8.94,8.94l-16.8-16.8l8.94-8.94
L36.23-19.39z"/>
<path class="st2" d="M29.39-11.59l5.7-5.7l-0.48-0.42l-5.64,5.64L29.39-11.59 M36.59-17.29l-7.2,7.2l-1.98-1.98l7.2-7.2L36.59-17.29
z M12.05-28.93l5.7-5.7l-0.48-0.42l-5.64,5.64L12.05-28.93z M19.31-34.63l-7.26,7.26l-1.98-2.04l7.2-7.2L19.31-34.63z M33.71-41.83
l0.78-0.78l7.86,7.92l-0.78,0.78L33.71-41.83z M29.45-37.69l0.78-0.78l7.86,7.92l-0.78,0.72L29.45-37.69z M19.97-30.91l0.78-0.78
l10.68,10.74l-0.72,0.78L19.97-30.91z"/>
<path class="st2" d="M10.31-35.59l0.78-0.78l1.56,1.56l-0.78,0.78L10.31-35.59 M31.19-11.05l4.44-4.44l-0.42-0.48l-4.5,4.5
L31.19-11.05z M37.19-15.49l-6,6l-1.98-1.98l6-6L37.19-15.49z"/>
<path class="st2" d="M9.35-36.55c0,0.18,0.12,0.36,0.24,0.48c0.12,0.18,0.3,0.24,0.54,0.24c0.18,0,0.36-0.06,0.48-0.24
c0.18-0.12,0.24-0.3,0.24-0.48c0-0.24-0.06-0.42-0.24-0.54c-0.12-0.12-0.3-0.24-0.48-0.24c-0.24,0-0.42,0.12-0.54,0.24
C9.47-36.97,9.35-36.79,9.35-36.55 M11.39-36.55c0,0.3-0.12,0.66-0.36,0.9c-0.24,0.24-0.6,0.36-0.9,0.36c-0.36,0-0.66-0.12-0.9-0.36
c-0.3-0.24-0.42-0.6-0.42-0.9c0-0.36,0.12-0.66,0.42-0.9c0.24-0.24,0.54-0.42,0.9-0.42c0.3,0,0.66,0.18,0.9,0.42
C11.27-37.21,11.39-36.91,11.39-36.55z M37.43-8.47l0.78-0.78l0.78,0.78l-0.78,0.78L37.43-8.47z M33.41-12.49l0.78-0.78l1.56,1.56
l-0.78,0.78L33.41-12.49z"/>
<path class="st2" d="M15.89-16.99l2.52-2.58l0.78,0.78l-2.58,2.58L15.89-16.99 M26.69-28.15l2.58-2.52l0.78,0.72l-2.58,2.58
L26.69-28.15z M35.27-6.61l4.74-4.8c-0.6-0.54-1.38-0.84-2.22-0.84c-0.9,0-1.74,0.3-2.4,0.96c-0.66,0.66-1.02,1.5-1.02,2.4
C34.37-8.05,34.73-7.27,35.27-6.61z M40.79-11.41l-5.52,5.52l-0.24-0.18c0,0,0,0,0-0.06c-0.78-0.72-1.2-1.68-1.2-2.76
c0-1.02,0.42-2.04,1.2-2.76c0.72-0.78,1.68-1.2,2.76-1.2c1.02,0,2.04,0.42,2.76,1.2c0.06,0,0.06,0,0.06,0L40.79-11.41z"/>
<path class="st2" d="M33.77-27l11.22-11.28l-7.08-7.08L26.63-34.08L33.77-27 M46.55-38.29L33.77-25.44l-8.7-8.64l12.84-12.84
L46.55-38.29z"/>
<path class="st2" d="M8.39-16.63l0.78-0.78l7.86,7.92l-0.72,0.78L8.39-16.63 M4.43-12.19l0.78-0.78l7.86,7.86l-0.78,0.78L4.43-12.19
z M30.95-29.59l12.06-12l0.78,0.78l-12.06,12L30.95-29.59z M27.95-32.05l12-12l0.78,0.78l-12,12L27.95-32.05z"/>
<path class="st2" d="M8.75-1.51l11.22-11.28l-7.08-7.14L1.61-8.65L8.75-1.51 M21.53-12.79L8.75,0.05l-8.7-8.7l12.84-12.78
L21.53-12.79z"/>
<path class="st2" d="M5.93-4.09l12.06-12.06l0.78,0.78L6.71-3.31L5.93-4.09 M2.93-6.55l12-12.06l0.78,0.78l-12,12.06L2.93-6.55z"/>
<path class="st2" d="M135.11-14.83l-2.7-10.08l-1.08,0.3l2.7,10.08L135.11-14.83 M133.19-26.29l3.3,12.24l-3.24,0.84l-3.24-12.18
L133.19-26.29z M158.81-21.19l-2.7-10.08l-20.88,5.58l2.7,10.14L158.81-21.19z M156.89-32.59l3.24,12.18l-22.98,6.18l-3.3-12.24
L156.89-32.59z"/>
<path class="st2" d="M160.13-22.8l-2.04-7.74l-0.6,0.18l2.04,7.74L160.13-22.8 M158.87-31.86l2.64,9.84l-2.76,0.72l-2.64-9.84
L158.87-31.86z M136.49-16.44l-2.1-7.74l-0.6,0.18l2.1,7.74L136.49-16.44z M135.17-25.5l2.64,9.84l-2.7,0.72l-2.64-9.84L135.17-25.5
z M136.13-41.58l-0.24-1.08l10.74-2.88l0.3,1.02L136.13-41.58z M137.57-35.88l-0.24-1.02l10.74-2.88l0.3,1.02L137.57-35.88z
M138.71-24.24l-0.3-1.08l14.64-3.9l0.3,1.02L138.71-24.24z"/>
<path class="st2" d="M129.83-18.24l-0.3-1.08l2.16-0.54l0.3,1.02L129.83-18.24 M161.57-24.07l-1.68-6.06l-0.6,0.12l1.62,6.12
L161.57-24.07z M160.67-31.51l2.22,8.22l-2.7,0.72l-2.22-8.22L160.67-31.51z"/>
<path class="st2" d="M128.51-17.95c0.18,0.12,0.36,0.12,0.6,0.06c0.18,0,0.3-0.12,0.42-0.3c0.12-0.18,0.12-0.36,0.06-0.6
c-0.06-0.18-0.18-0.3-0.3-0.42c-0.18-0.12-0.42-0.12-0.6-0.06c-0.18,0.06-0.36,0.18-0.42,0.36c-0.12,0.12-0.12,0.36-0.06,0.54
C128.21-18.19,128.33-18.01,128.51-17.95 M129.53-19.69c0.3,0.18,0.54,0.48,0.6,0.78c0.12,0.36,0.06,0.66-0.12,0.96
c-0.18,0.3-0.48,0.54-0.78,0.6c-0.36,0.12-0.66,0.06-0.96-0.12c-0.3-0.18-0.54-0.42-0.6-0.78c-0.12-0.3-0.06-0.66,0.12-0.96
c0.18-0.3,0.42-0.48,0.78-0.6C128.87-19.87,129.23-19.87,129.53-19.69z M166.91-28.21l-0.3-1.02l1.02-0.3l0.3,1.08L166.91-28.21z
M161.39-26.71l-0.3-1.08l2.16-0.54l0.3,1.02L161.39-26.71z"/>
<path class="st2" d="M148.73-13.75l-0.96-3.54l1.08-0.24l0.9,3.48L148.73-13.75 M144.53-28.75l-0.96-3.48l1.08-0.3l0.9,3.54
L144.53-28.75z M167.39-25.39l-1.74-6.54c-0.78,0.3-1.44,0.78-1.86,1.56c-0.48,0.78-0.6,1.68-0.36,2.52c0.24,0.9,0.78,1.62,1.56,2.1
C165.77-25.33,166.55-25.21,167.39-25.39z M166.01-32.59l2.04,7.56l-0.3,0.12c-1.02,0.3-2.1,0.12-3-0.36
c-0.9-0.54-1.56-1.38-1.86-2.4c-0.24-1.02-0.12-2.1,0.42-3c0.54-0.9,1.38-1.56,2.4-1.86c0,0,0,0,0.06,0L166.01-32.59z"/>
<path class="st2" d="M149.03-34.26l-4.14-15.36l-9.72,2.58l4.14,15.42L149.03-34.26 M145.67-51.01l4.68,17.52l-11.82,3.18
l-4.68-17.52L145.67-51.01z"/>
<path class="st2" d="M145.31-7.08l-0.3-1.08l10.8-2.88l0.3,1.02L145.31-7.08 M147.17-1.44l-0.3-1.08l10.74-2.88l0.3,1.08
L147.17-1.44z M145.37-33.12l-4.38-16.44l1.02-0.3l4.44,16.44L145.37-33.12z M141.77-31.74l-4.44-16.44l1.08-0.3l4.38,16.44
L141.77-31.74z"/>
<path class="st2" d="M158.57,0.17l-4.14-15.42l-9.72,2.64l4.14,15.36L158.57,0.17 M155.21-16.57l4.68,17.52l-11.82,3.12l-4.68-17.46
L155.21-16.57z"/>
<path class="st2" d="M154.97,1.25l-4.44-16.44l1.08-0.24l4.38,16.44L154.97,1.25 M151.31,2.69l-4.44-16.5l1.08-0.24l4.38,16.44
L151.31,2.69z"/>
<path class="st2" d="M257.09-29.29l7.38-7.38l-0.78-0.84l-7.44,7.38L257.09-29.29 M266.03-36.67l-8.94,8.94l-2.34-2.4l8.94-8.94
L266.03-36.67z M274.43-11.95l7.38-7.44l-15.3-15.24l-7.38,7.38L274.43-11.95z M283.37-19.39l-8.94,8.94l-16.86-16.8l8.94-8.94
L283.37-19.39z"/>
<path class="st2" d="M276.47-11.59l5.7-5.7l-0.42-0.42l-5.7,5.64L276.47-11.59 M283.73-17.29l-7.26,7.2l-1.98-1.98l7.26-7.2
L283.73-17.29z M259.19-28.93l5.64-5.7l-0.42-0.42l-5.7,5.64L259.19-28.93z M266.39-34.63l-7.2,7.26l-1.98-2.04l7.2-7.2
L266.39-34.63z M280.79-41.83l0.78-0.78l7.86,7.92l-0.72,0.78L280.79-41.83z M276.53-37.69l0.78-0.78l7.86,7.92l-0.72,0.72
L276.53-37.69z M267.05-30.91l0.78-0.78l10.74,10.74l-0.78,0.78L267.05-30.91z"/>
<path class="st2" d="M257.39-35.59l0.78-0.78l1.56,1.56l-0.78,0.78L257.39-35.59 M278.27-11.05l4.5-4.44l-0.48-0.48l-4.44,4.5
L278.27-11.05z M284.27-15.49l-6,6l-1.98-1.98l6-6L284.27-15.49z"/>
<path class="st2" d="M256.49-36.55c0,0.18,0.06,0.36,0.18,0.48c0.18,0.18,0.36,0.24,0.54,0.24c0.18,0,0.36-0.06,0.54-0.24
c0.12-0.12,0.18-0.3,0.18-0.48c0-0.24-0.06-0.42-0.18-0.54c-0.18-0.12-0.36-0.24-0.54-0.24c-0.18,0-0.36,0.12-0.54,0.24
C256.55-36.97,256.49-36.79,256.49-36.55 M258.47-36.55c0,0.3-0.12,0.66-0.36,0.9c-0.24,0.24-0.54,0.36-0.9,0.36
c-0.36,0-0.66-0.12-0.9-0.36c-0.24-0.24-0.36-0.6-0.36-0.9c0-0.36,0.12-0.66,0.36-0.9c0.24-0.24,0.54-0.42,0.9-0.42
c0.36,0,0.66,0.18,0.9,0.42C258.35-37.21,258.47-36.91,258.47-36.55z M284.57-8.47l0.78-0.78l0.72,0.78l-0.78,0.78L284.57-8.47z
M280.49-12.49l0.78-0.78l1.62,1.56l-0.78,0.78L280.49-12.49z"/>
<path class="st2" d="M262.97-16.99l2.58-2.58l0.78,0.78l-2.58,2.58L262.97-16.99 M273.83-28.15l2.52-2.52l0.78,0.72l-2.52,2.58
L273.83-28.15z M282.35-6.61l4.8-4.8c-0.6-0.54-1.44-0.84-2.28-0.84c-0.9,0-1.74,0.3-2.4,0.96c-0.6,0.66-0.96,1.5-0.96,2.4
C281.51-8.05,281.81-7.27,282.35-6.61z M287.93-11.41l-5.58,5.52l-0.18-0.18c-0.06,0-0.06,0-0.06-0.06
c-0.72-0.72-1.14-1.68-1.14-2.76c0-1.02,0.42-2.04,1.14-2.76c0.72-0.78,1.74-1.2,2.76-1.2c1.08,0,2.04,0.42,2.82,1.2L287.93-11.41z"
/>
<path class="st2" d="M280.85-27l11.28-11.28l-7.14-7.08l-11.28,11.28L280.85-27 M293.63-38.29l-12.78,12.84l-8.64-8.64l12.78-12.84
L293.63-38.29z"/>
<path class="st2" d="M255.47-16.63l0.78-0.78l7.92,7.92l-0.78,0.78L255.47-16.63 M251.51-12.19l0.78-0.78l7.92,7.86l-0.78,0.78
L251.51-12.19z M278.09-29.59l12-12l0.78,0.78l-12.06,12L278.09-29.59z M275.03-32.05l12.06-12l0.78,0.78l-12.06,12L275.03-32.05z"
/>
<path class="st2" d="M255.83-1.51l11.28-11.28l-7.14-7.14L248.69-8.65L255.83-1.51 M268.67-12.79L255.83,0.05l-8.64-8.7l12.78-12.78
L268.67-12.79z"/>
<path class="st2" d="M253.07-4.09l12-12.06l0.78,0.78l-12,12.06L253.07-4.09 M250.01-6.55l12.06-12.06l0.78,0.78L250.79-5.77
L250.01-6.55z"/>
<path class="st2" d="M255.95,101.69l2.7-10.08l-1.08-0.3l-2.7,10.08L255.95,101.69 M259.97,90.83l-3.24,12.18l-3.24-0.84l3.3-12.18
L259.97,90.83z M279.59,108.05l2.76-10.08l-20.88-5.64l-2.76,10.14L279.59,108.05z M283.67,97.19l-3.3,12.18l-22.98-6.12l3.3-12.24
L283.67,97.19z"/>
<path class="st2" d="M281.57,107.33l2.1-7.74l-0.6-0.18l-2.1,7.74L281.57,107.33 M284.99,98.81l-2.64,9.84l-2.7-0.72l2.64-9.84
L284.99,98.81z M257.93,100.97l2.1-7.74l-0.6-0.18l-2.1,7.74L257.93,100.97z M261.35,92.45l-2.64,9.84l-2.7-0.72l2.64-9.84
L261.35,92.45z M270.23,79.01l0.3-1.08l10.74,2.88l-0.3,1.08L270.23,79.01z M268.61,84.71l0.24-1.08l10.8,2.88l-0.3,1.08
L268.61,84.71z M263.75,95.33l0.3-1.08l14.64,3.96l-0.24,1.02L263.75,95.33z"/>
<path class="st2" d="M253.07,96.05l0.24-1.02l2.22,0.6l-0.3,1.02L253.07,96.05 M283.43,106.91l1.62-6.12l-0.6-0.12l-1.62,6.12
L283.43,106.91z M286.37,100.07l-2.16,8.22l-2.7-0.78l2.16-8.22L286.37,100.07z"/>
<path class="st2" d="M251.81,95.69c0.06,0.18,0.24,0.3,0.42,0.36c0.18,0.06,0.36,0,0.54-0.06c0.18-0.12,0.3-0.24,0.36-0.48
c0.06-0.18,0-0.36-0.06-0.54c-0.12-0.18-0.3-0.3-0.48-0.36c-0.18,0-0.36,0-0.54,0.12c-0.18,0.06-0.3,0.24-0.36,0.42
S251.69,95.57,251.81,95.69 M253.55,94.73c0.12,0.24,0.18,0.6,0.12,0.96c-0.12,0.3-0.3,0.6-0.6,0.78c-0.3,0.18-0.66,0.18-0.96,0.12
c-0.36-0.12-0.6-0.3-0.78-0.6c-0.18-0.3-0.24-0.66-0.12-0.96c0.06-0.36,0.3-0.6,0.54-0.78c0.3-0.18,0.66-0.24,1.02-0.12
C253.07,94.19,253.37,94.43,253.55,94.73z M290.15,106.01l0.3-1.02l1.02,0.24l-0.3,1.08L290.15,106.01z M284.63,104.51l0.3-1.02
l2.16,0.6l-0.3,1.02L284.63,104.51z"/>
<path class="st2" d="M267.17,109.43l0.96-3.54l1.02,0.3l-0.9,3.48L267.17,109.43 M271.01,94.37l0.96-3.54l1.02,0.3l-0.9,3.48
L271.01,94.37z M289.19,108.71l1.74-6.54c-0.84-0.18-1.68-0.06-2.4,0.36c-0.78,0.48-1.32,1.2-1.56,2.04c-0.24,0.9-0.12,1.8,0.3,2.58
C287.69,107.87,288.35,108.41,289.19,108.71z M291.59,101.75l-2.04,7.62l-0.3-0.06c0,0,0-0.06-0.06-0.06
c-1.02-0.24-1.86-0.9-2.34-1.8c-0.54-0.9-0.72-1.98-0.42-3c0.3-1.02,0.9-1.86,1.86-2.4c0.9-0.48,1.92-0.66,2.94-0.36
c0.06,0,0.06,0,0.06,0L291.59,101.75z"/>
<path class="st2" d="M277.67,91.79l4.14-15.36l-9.72-2.64l-4.14,15.42L277.67,91.79 M283.13,75.65l-4.68,17.52l-11.82-3.18
l4.68-17.52L283.13,75.65z"/>
<path class="st2" d="M260.93,113.45l0.24-1.02l10.8,2.88l-0.3,1.08L260.93,113.45 M259.67,119.27l0.3-1.02l10.74,2.88l-0.24,1.02
L259.67,119.27z M274.01,91.01l4.38-16.5l1.08,0.3l-4.44,16.44L274.01,91.01z M270.11,90.35l4.44-16.44l1.02,0.3l-4.38,16.44
L270.11,90.35z"/>
<path class="st2" d="M268.73,126.41l4.14-15.42l-9.72-2.58l-4.14,15.36L268.73,126.41 M274.19,110.21l-4.68,17.52l-11.82-3.18
l4.68-17.52L274.19,110.21z"/>
<path class="st2" d="M265.07,125.57l4.38-16.44l1.08,0.24l-4.44,16.44L265.07,125.57 M261.23,124.91l4.38-16.44l1.08,0.3
l-4.44,16.44L261.23,124.91z"/>
<path class="st2" d="M257.09,217.79l7.38-7.38l-0.78-0.84l-7.44,7.44L257.09,217.79 M266.03,210.41l-8.94,8.94l-2.34-2.34l8.94-8.94
L266.03,210.41z M274.43,235.13l7.38-7.38l-15.3-15.3l-7.38,7.38L274.43,235.13z M283.37,227.75l-8.94,8.94l-16.86-16.86l8.94-8.94
L283.37,227.75z"/>
<path class="st2" d="M276.47,235.49l5.7-5.7l-0.42-0.42l-5.7,5.7L276.47,235.49 M283.73,229.79l-7.26,7.26l-1.98-1.98l7.26-7.26
L283.73,229.79z M259.19,218.15l5.64-5.64l-0.42-0.48l-5.7,5.7L259.19,218.15z M266.39,212.51l-7.2,7.2l-1.98-1.98l7.2-7.2
L266.39,212.51z M280.79,205.31l0.78-0.78l7.86,7.86l-0.72,0.78L280.79,205.31z M276.53,209.39l0.78-0.78l7.86,7.92l-0.72,0.78
L276.53,209.39z M267.05,216.17l0.78-0.78l10.74,10.74l-0.78,0.78L267.05,216.17z"/>
<path class="st2" d="M257.39,211.49l0.78-0.78l1.56,1.62l-0.78,0.72L257.39,211.49 M278.27,236.09l4.5-4.5l-0.48-0.42l-4.44,4.44
L278.27,236.09z M284.27,231.59l-6,6l-1.98-1.98l6-6L284.27,231.59z"/>
<path class="st2" d="M256.49,210.53c0,0.18,0.06,0.36,0.18,0.54c0.18,0.12,0.36,0.18,0.54,0.18c0.18,0,0.36-0.06,0.54-0.18
c0.12-0.18,0.18-0.36,0.18-0.54c0-0.18-0.06-0.36-0.18-0.54c-0.18-0.12-0.36-0.18-0.54-0.18c-0.18,0-0.36,0.06-0.54,0.18
C256.55,210.17,256.49,210.35,256.49,210.53 M258.47,210.53c0,0.36-0.12,0.66-0.36,0.9c-0.24,0.24-0.54,0.36-0.9,0.36
c-0.36,0-0.66-0.12-0.9-0.36c-0.24-0.24-0.36-0.54-0.36-0.9c0-0.36,0.12-0.66,0.36-0.9c0.24-0.24,0.54-0.36,0.9-0.36
c0.36,0,0.66,0.12,0.9,0.36C258.35,209.87,258.47,210.17,258.47,210.53z M284.57,238.67l0.78-0.78l0.72,0.72l-0.78,0.78
L284.57,238.67z M280.49,234.59l0.78-0.78l1.62,1.62l-0.78,0.78L280.49,234.59z"/>
<path class="st2" d="M262.97,230.09l2.58-2.58l0.78,0.78l-2.58,2.58L262.97,230.09 M273.83,218.99l2.52-2.58l0.78,0.78l-2.52,2.58
L273.83,218.99z M282.35,240.47l4.8-4.8c-0.6-0.54-1.44-0.84-2.28-0.84c-0.9,0-1.74,0.36-2.4,0.96c-0.6,0.66-0.96,1.5-0.96,2.4
C281.51,239.03,281.81,239.87,282.35,240.47z M287.93,235.67l-5.58,5.58l-0.18-0.24c-0.06,0-0.06,0-0.06,0
c-0.72-0.78-1.14-1.74-1.14-2.82c0-1.02,0.42-2.04,1.14-2.76s1.74-1.14,2.76-1.14c1.08,0,2.04,0.42,2.82,1.14c0,0,0,0,0,0.06
L287.93,235.67z"/>
<path class="st2" d="M280.85,220.13l11.28-11.28l-7.14-7.14l-11.28,11.28L280.85,220.13 M293.63,208.85l-12.78,12.78l-8.64-8.64
l12.78-12.78L293.63,208.85z"/>
<path class="st2" d="M255.47,230.51l0.78-0.78l7.92,7.86l-0.78,0.78L255.47,230.51 M251.51,234.89l0.78-0.78l7.92,7.92l-0.78,0.72
L251.51,234.89z M278.09,217.55l12-12.06l0.78,0.78l-12.06,12.06L278.09,217.55z M275.03,215.09l12.06-12.06l0.78,0.78l-12.06,12.06
L275.03,215.09z"/>
<path class="st2" d="M255.83,245.57l11.28-11.28l-7.14-7.08l-11.28,11.28L255.83,245.57 M268.67,234.29l-12.84,12.84l-8.64-8.64
l12.78-12.84L268.67,234.29z"/>
<path class="st2" d="M253.07,242.99l12-12l0.78,0.78l-12,12L253.07,242.99 M250.01,240.53l12.06-12l0.78,0.78l-12.06,12
L250.01,240.53z"/>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

+121
View File
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="80"
height="15"
id="svg2279"
sodipodi:version="0.32"
inkscape:version="0.45+devel"
version="1.0"
sodipodi:docname="by-nc-nd.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs2281">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3442">
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3444"
width="20.614058"
height="12.483703"
x="171.99832"
y="239.1203" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="10.5125"
inkscape:cx="40"
inkscape:cy="7.5"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="80px"
height="15px"
showborder="true"
inkscape:showpageshadow="false"
inkscape:window-width="935"
inkscape:window-height="624"
inkscape:window-x="50"
inkscape:window-y="160" />
<metadata
id="metadata2284">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="BY-NC-ND"
transform="matrix(0.9875019,0,0,0.9333518,-323.90064,-411.87964)">
<g
id="g3783"
transform="translate(158,204)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.04161763;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3785"
width="80"
height="15"
x="170.5"
y="237.86218" />
<rect
y="239.36218"
x="172"
height="12"
width="77"
id="rect3787"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#abb1aa;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.46913578"
d="M 171.99996,239.37505 L 171.99996,251.37505 L 192.33474,251.37505 C 193.64339,249.62474 194.52652,247.59057 194.52652,245.37505 C 194.52652,243.17431 193.65859,241.1179 192.36599,239.37505 L 171.99996,239.37505 z"
id="path3789"
sodipodi:nodetypes="cccscc" />
<g
id="g3791"
transform="matrix(0.9612533,0,0,0.9612533,6.8341566,9.5069994)"
clip-path="url(#clipPath3442)">
<path
id="path3793"
cx="296.35416"
ry="22.939548"
cy="264.3577"
type="arc"
rx="22.939548"
d="M 190.06417,245.36206 C 190.06667,249.25405 186.91326,252.41072 183.02153,252.41323 C 179.12979,252.41572 175.97262,249.26256 175.97036,245.3706 C 175.97036,245.36783 175.97036,245.36507 175.97036,245.36206 C 175.9681,241.47007 179.12126,238.3134 183.013,238.31113 C 186.90524,238.30864 190.06191,241.46181 190.06417,245.3538 C 190.06417,245.35628 190.06417,245.35929 190.06417,245.36206 z"
style="opacity:1;fill:#ffffff" />
<path
d="M 188.74576,239.62226 C 190.30843,241.18492 191.08988,243.09869 191.08988,245.36206 C 191.08988,247.62592 190.32197,249.51913 188.78615,251.04165 C 187.15627,252.64521 185.22995,253.44672 183.00722,253.44672 C 180.81132,253.44672 178.91837,252.65172 177.32887,251.06174 C 175.73912,249.47198 174.94436,247.57226 174.94436,245.36206 C 174.94436,243.15235 175.73912,241.23908 177.32887,239.62226 C 178.87799,238.0591 180.77094,237.27764 183.00722,237.27764 C 185.2706,237.27764 187.18312,238.05909 188.74576,239.62226 z M 178.38093,240.67355 C 177.05978,242.008 176.39945,243.57116 176.39945,245.36429 C 176.39945,247.15694 177.05326,248.70682 178.36062,250.01393 C 179.66822,251.32153 181.22487,251.97509 183.03105,251.97509 C 184.83724,251.97509 186.40716,251.31502 187.74161,249.99412 C 189.0086,248.76725 189.64234,247.22467 189.64234,245.36429 C 189.64234,243.51799 188.99831,241.95084 187.71101,240.66354 C 186.42396,239.37649 184.86406,238.7327 183.03105,238.7327 C 181.19804,238.73271 179.64767,239.37975 178.38093,240.67355 z M 181.85761,244.57559 C 181.65573,244.13545 181.35354,243.91525 180.95051,243.91525 C 180.23802,243.91525 179.8819,244.39501 179.8819,245.35404 C 179.8819,246.31328 180.23802,246.79255 180.95051,246.79255 C 181.421,246.79255 181.75705,246.55908 181.95869,246.09111 L 182.94629,246.61701 C 182.47555,247.45339 181.76934,247.87168 180.82763,247.87168 C 180.10136,247.87168 179.51953,247.64899 179.08265,247.20409 C 178.64502,246.7587 178.42684,246.14477 178.42684,245.36206 C 178.42684,244.59313 178.65204,243.98271 179.10271,243.53056 C 179.55338,243.07838 180.11463,242.8524 180.7875,242.8524 C 181.78288,242.8524 182.49561,243.24465 182.92647,244.02835 L 181.85761,244.57559 z M 186.50398,244.57559 C 186.30184,244.13545 186.00567,243.91525 185.61517,243.91525 C 184.88839,243.91525 184.52474,244.39501 184.52474,245.35404 C 184.52474,246.31328 184.88839,246.79255 185.61517,246.79255 C 186.08642,246.79255 186.41644,246.55908 186.6048,246.09111 L 187.61447,246.61701 C 187.14448,247.45339 186.43926,247.87168 185.49931,247.87168 C 184.77403,247.87168 184.19346,247.64899 183.75683,247.20409 C 183.32096,246.7587 183.10254,246.14477 183.10254,245.36206 C 183.10254,244.59313 183.32422,243.98271 183.76737,243.53056 C 184.21026,243.07838 184.77404,242.8524 185.4592,242.8524 C 186.45282,242.8524 187.16455,243.24465 187.5939,244.02835 L 186.50398,244.57559 z"
id="path3795"
style="opacity:1" />
</g>
</g>
<path
id="text3797"
d="M 357.4197,448.68503 C 357.66518,448.68504 357.85131,448.63146 357.9781,448.52428 C 358.10488,448.41712 358.16827,448.25905 358.16828,448.05008 C 358.16827,447.84378 358.10488,447.68705 357.9781,447.57988 C 357.85131,447.47004 357.66518,447.41512 357.4197,447.41511 L 356.55784,447.41511 L 356.55784,448.68503 L 357.4197,448.68503 M 357.4723,451.30929 C 357.78522,451.30929 358.0199,451.24364 358.17637,451.11236 C 358.33552,450.98109 358.4151,450.78283 358.4151,450.51759 C 358.4151,450.25771 358.33686,450.06347 358.18041,449.93488 C 358.02396,449.80359 357.78792,449.73796 357.4723,449.73795 L 356.55784,449.73795 L 356.55784,451.30929 L 357.4723,451.30929 M 358.92089,449.15122 C 359.25538,449.24767 359.51434,449.42583 359.69779,449.68571 C 359.88121,449.94559 359.97293,450.26441 359.97294,450.64217 C 359.97293,451.22087 359.776,451.65222 359.38217,451.93621 C 358.98833,452.2202 358.38947,452.36219 357.5856,452.36219 L 355.00001,452.36219 L 355.00001,446.3622 L 357.33878,446.3622 C 358.17771,446.36221 358.78466,446.48813 359.15962,446.73996 C 359.53727,446.99181 359.7261,447.39502 359.7261,447.9496 C 359.7261,448.24164 359.65732,448.4908 359.51975,448.69709 C 359.38217,448.90072 359.18255,449.05209 358.92089,449.15122 M 359.83746,446.3622 L 361.54096,446.3622 L 362.91671,448.50018 L 364.29245,446.3622 L 366,446.3622 L 363.69764,449.8344 L 363.69764,452.36219 L 362.13982,452.36219 L 362.13982,449.8344 L 359.83746,446.3622 M 365.15837,449.40842 L 367.69946,449.40842 L 367.69946,450.57787 L 365.15837,450.57787 L 365.15837,449.40842 M 368.9174,446.3622 L 370.65732,446.3622 L 372.85447,450.47741 L 372.85447,446.3622 L 374.33138,446.3622 L 374.33138,452.36219 L 372.59146,452.36219 L 370.3943,448.24699 L 370.3943,452.36219 L 368.9174,452.36219 L 368.9174,446.3622 M 380.65173,452.03266 C 380.36579,452.18002 380.0677,452.2912 379.75749,452.36622 C 379.44727,452.44123 379.12357,452.47875 378.78638,452.47875 C 377.78019,452.47875 376.98307,452.20011 376.395,451.64284 C 375.80693,451.08289 375.5129,450.32469 375.5129,449.36823 C 375.5129,448.40909 375.80693,447.65089 376.395,447.09361 C 376.98307,446.53367 377.78019,446.2537 378.78638,446.25369 C 379.12357,446.2537 379.44727,446.29121 379.75749,446.36621 C 380.0677,446.44124 380.36579,446.55243 380.65173,446.69977 L 380.65173,447.94157 C 380.36309,447.746 380.0785,447.60266 379.79796,447.51156 C 379.5174,447.42047 379.22203,447.37493 378.91181,447.37493 C 378.35611,447.37493 377.91911,447.55175 377.6008,447.9054 C 377.28249,448.25905 377.12333,448.74666 377.12333,449.36823 C 377.12333,449.98712 377.28249,450.47339 377.6008,450.82703 C 377.91911,451.18069 378.35611,451.35751 378.91181,451.35751 C 379.22203,451.35751 379.5174,451.31197 379.79796,451.22087 C 380.0785,451.12978 380.36309,450.98644 380.65173,450.79086 L 380.65173,452.03266 M 381.82921,449.40842 L 384.3703,449.40842 L 384.3703,450.57787 L 381.82921,450.57787 L 381.82921,449.40842 M 385.58824,446.3622 L 387.32815,446.3622 L 389.52531,450.47741 L 389.52531,446.3622 L 391.00222,446.3622 L 391.00222,452.36219 L 389.26229,452.36219 L 387.06515,448.24699 L 387.06515,452.36219 L 385.58824,452.36219 L 385.58824,446.3622 M 394.08956,447.53165 L 394.08956,451.19274 L 394.64795,451.19274 C 395.28456,451.19274 395.77013,451.03602 396.10462,450.72255 C 396.44181,450.40909 396.61041,449.95363 396.61042,449.35617 C 396.61041,448.7614 396.44317,448.30862 396.10867,447.99783 C 395.77417,447.68705 395.28726,447.53166 394.64795,447.53165 L 394.08956,447.53165 M 392.53172,446.3622 L 394.17453,446.3622 C 395.09169,446.36221 395.77417,446.42784 396.22197,446.55912 C 396.67245,446.68772 397.0582,446.90742 397.37922,447.2182 C 397.66246,447.48879 397.87286,447.80092 398.01044,448.15456 C 398.14801,448.50822 398.2168,448.90875 398.21681,449.35617 C 398.2168,449.80896 398.14801,450.21351 398.01044,450.56983 C 397.87286,450.92349 397.66246,451.23561 397.37922,451.50621 C 397.05551,451.81699 396.66706,452.03802 396.21387,452.1693 C 395.76069,452.29789 395.0809,452.36219 394.17453,452.36219 L 392.53172,452.36219 L 392.53172,446.3622"
style="font-size:8.25858784px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:'Bitstream Vera Sans'" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

+121
View File
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="80"
height="15"
id="svg2279"
sodipodi:version="0.32"
inkscape:version="0.45+devel"
version="1.0"
sodipodi:docname="by-nc-sa.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs2281">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3442">
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3444"
width="20.614058"
height="12.483703"
x="171.99832"
y="239.1203" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="10.5125"
inkscape:cx="40"
inkscape:cy="7.5"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="80px"
height="15px"
showborder="true"
inkscape:showpageshadow="false"
inkscape:window-width="935"
inkscape:window-height="624"
inkscape:window-x="50"
inkscape:window-y="160" />
<metadata
id="metadata2284">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="BY-NC-SA"
transform="matrix(0.9875019,0,0,0.9333518,-323.90064,-331.6114)">
<g
transform="translate(158,118)"
id="g3729">
<rect
y="237.86218"
x="170.5"
height="15"
width="80"
id="rect3731"
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.04161763;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3733"
width="77"
height="12"
x="172"
y="239.36218" />
<path
sodipodi:nodetypes="cccscc"
id="path3735"
d="M 171.99996,239.37505 L 171.99996,251.37505 L 192.33474,251.37505 C 193.64339,249.62474 194.52652,247.59057 194.52652,245.37505 C 194.52652,243.17431 193.65859,241.1179 192.36599,239.37505 L 171.99996,239.37505 z"
style="fill:#abb1aa;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.46913578" />
<g
clip-path="url(#clipPath3442)"
transform="matrix(0.9612533,0,0,0.9612533,6.8341566,9.5069994)"
id="g3737">
<path
style="opacity:1;fill:#ffffff"
d="M 190.06417,245.36206 C 190.06667,249.25405 186.91326,252.41072 183.02153,252.41323 C 179.12979,252.41572 175.97262,249.26256 175.97036,245.3706 C 175.97036,245.36783 175.97036,245.36507 175.97036,245.36206 C 175.9681,241.47007 179.12126,238.3134 183.013,238.31113 C 186.90524,238.30864 190.06191,241.46181 190.06417,245.3538 C 190.06417,245.35628 190.06417,245.35929 190.06417,245.36206 z"
rx="22.939548"
type="arc"
cy="264.3577"
ry="22.939548"
cx="296.35416"
id="path3739" />
<path
style="opacity:1"
id="path3741"
d="M 188.74576,239.62226 C 190.30843,241.18492 191.08988,243.09869 191.08988,245.36206 C 191.08988,247.62592 190.32197,249.51913 188.78615,251.04165 C 187.15627,252.64521 185.22995,253.44672 183.00722,253.44672 C 180.81132,253.44672 178.91837,252.65172 177.32887,251.06174 C 175.73912,249.47198 174.94436,247.57226 174.94436,245.36206 C 174.94436,243.15235 175.73912,241.23908 177.32887,239.62226 C 178.87799,238.0591 180.77094,237.27764 183.00722,237.27764 C 185.2706,237.27764 187.18312,238.05909 188.74576,239.62226 z M 178.38093,240.67355 C 177.05978,242.008 176.39945,243.57116 176.39945,245.36429 C 176.39945,247.15694 177.05326,248.70682 178.36062,250.01393 C 179.66822,251.32153 181.22487,251.97509 183.03105,251.97509 C 184.83724,251.97509 186.40716,251.31502 187.74161,249.99412 C 189.0086,248.76725 189.64234,247.22467 189.64234,245.36429 C 189.64234,243.51799 188.99831,241.95084 187.71101,240.66354 C 186.42396,239.37649 184.86406,238.7327 183.03105,238.7327 C 181.19804,238.73271 179.64767,239.37975 178.38093,240.67355 z M 181.85761,244.57559 C 181.65573,244.13545 181.35354,243.91525 180.95051,243.91525 C 180.23802,243.91525 179.8819,244.39501 179.8819,245.35404 C 179.8819,246.31328 180.23802,246.79255 180.95051,246.79255 C 181.421,246.79255 181.75705,246.55908 181.95869,246.09111 L 182.94629,246.61701 C 182.47555,247.45339 181.76934,247.87168 180.82763,247.87168 C 180.10136,247.87168 179.51953,247.64899 179.08265,247.20409 C 178.64502,246.7587 178.42684,246.14477 178.42684,245.36206 C 178.42684,244.59313 178.65204,243.98271 179.10271,243.53056 C 179.55338,243.07838 180.11463,242.8524 180.7875,242.8524 C 181.78288,242.8524 182.49561,243.24465 182.92647,244.02835 L 181.85761,244.57559 z M 186.50398,244.57559 C 186.30184,244.13545 186.00567,243.91525 185.61517,243.91525 C 184.88839,243.91525 184.52474,244.39501 184.52474,245.35404 C 184.52474,246.31328 184.88839,246.79255 185.61517,246.79255 C 186.08642,246.79255 186.41644,246.55908 186.6048,246.09111 L 187.61447,246.61701 C 187.14448,247.45339 186.43926,247.87168 185.49931,247.87168 C 184.77403,247.87168 184.19346,247.64899 183.75683,247.20409 C 183.32096,246.7587 183.10254,246.14477 183.10254,245.36206 C 183.10254,244.59313 183.32422,243.98271 183.76737,243.53056 C 184.21026,243.07838 184.77404,242.8524 185.4592,242.8524 C 186.45282,242.8524 187.16455,243.24465 187.5939,244.02835 L 186.50398,244.57559 z" />
</g>
</g>
<path
id="text3743"
d="M 357.4197,362.68502 C 357.66518,362.68502 357.85131,362.63144 357.9781,362.52427 C 358.10488,362.41711 358.16827,362.25904 358.16828,362.05005 C 358.16827,361.84377 358.10488,361.68704 357.9781,361.57986 C 357.85131,361.47002 357.66518,361.4151 357.4197,361.4151 L 356.55784,361.4151 L 356.55784,362.68502 L 357.4197,362.68502 M 357.4723,365.30926 C 357.78522,365.30926 358.0199,365.24363 358.17637,365.11235 C 358.33552,364.98107 358.4151,364.78281 358.4151,364.51758 C 358.4151,364.2577 358.33686,364.06346 358.18041,363.93485 C 358.02396,363.80358 357.78792,363.73793 357.4723,363.73793 L 356.55784,363.73793 L 356.55784,365.30926 L 357.4723,365.30926 M 358.92089,363.15119 C 359.25538,363.24765 359.51434,363.42581 359.69779,363.68569 C 359.88121,363.94557 359.97293,364.26439 359.97294,364.64215 C 359.97293,365.22086 359.776,365.6522 359.38217,365.93619 C 358.98833,366.22019 358.38947,366.36218 357.5856,366.36218 L 355.00001,366.36218 L 355.00001,360.36218 L 357.33878,360.36218 C 358.17771,360.36218 358.78466,360.48811 359.15962,360.73994 C 359.53727,360.99179 359.7261,361.39501 359.7261,361.94959 C 359.7261,362.24162 359.65732,362.49078 359.51975,362.69708 C 359.38217,362.9007 359.18255,363.05207 358.92089,363.15119 M 359.83746,360.36218 L 361.54096,360.36218 L 362.91671,362.50016 L 364.29245,360.36218 L 366,360.36218 L 363.69764,363.83438 L 363.69764,366.36218 L 362.13982,366.36218 L 362.13982,363.83438 L 359.83746,360.36218 M 365.15837,363.40839 L 367.69946,363.40839 L 367.69946,364.57785 L 365.15837,364.57785 L 365.15837,363.40839 M 368.9174,360.36218 L 370.65732,360.36218 L 372.85447,364.47738 L 372.85447,360.36218 L 374.33138,360.36218 L 374.33138,366.36218 L 372.59146,366.36218 L 370.3943,362.24698 L 370.3943,366.36218 L 368.9174,366.36218 L 368.9174,360.36218 M 380.65173,366.03264 C 380.36579,366.17999 380.0677,366.29118 379.75749,366.3662 C 379.44727,366.44122 379.12357,366.47872 378.78638,366.47872 C 377.78019,366.47872 376.98307,366.20009 376.395,365.64282 C 375.80693,365.08288 375.5129,364.32468 375.5129,363.36821 C 375.5129,362.40907 375.80693,361.65087 376.395,361.0936 C 376.98307,360.53366 377.78019,360.25368 378.78638,360.25367 C 379.12357,360.25368 379.44727,360.29119 379.75749,360.3662 C 380.0677,360.44122 380.36579,360.55241 380.65173,360.69976 L 380.65173,361.94156 C 380.36309,361.74597 380.0785,361.60265 379.79796,361.51155 C 379.5174,361.42046 379.22203,361.37492 378.91181,361.37491 C 378.35611,361.37492 377.91911,361.55174 377.6008,361.90538 C 377.28249,362.25904 377.12333,362.74665 377.12333,363.36821 C 377.12333,363.9871 377.28249,364.47337 377.6008,364.82702 C 377.91911,365.18067 378.35611,365.35749 378.91181,365.35749 C 379.22203,365.35749 379.5174,365.31195 379.79796,365.22086 C 380.0785,365.12976 380.36309,364.98643 380.65173,364.79085 L 380.65173,366.03264 M 381.82921,363.40839 L 384.3703,363.40839 L 384.3703,364.57785 L 381.82921,364.57785 L 381.82921,363.40839 M 389.79236,360.55107 L 389.79236,361.82099 C 389.46056,361.67364 389.13686,361.56245 388.82125,361.48743 C 388.50563,361.41242 388.20756,361.37492 387.92701,361.37491 C 387.55475,361.37492 387.2796,361.42581 387.10156,361.52762 C 386.92352,361.62943 386.8345,361.7875 386.83451,362.00183 C 386.8345,362.16259 386.89385,362.28851 387.01255,362.3796 C 387.13393,362.46801 387.35244,362.54437 387.66804,362.60866 L 388.33165,362.74129 C 389.00333,362.87525 389.4808,363.07886 389.76405,363.35214 C 390.04728,363.62541 390.1889,364.01389 390.18891,364.51758 C 390.1889,365.17933 389.99063,365.67229 389.5941,365.99647 C 389.20025,366.31797 388.59735,366.47872 387.78539,366.47872 C 387.40234,366.47872 387.01794,366.44255 386.63219,366.37022 C 386.24644,366.29788 385.86069,366.19072 385.47494,366.04871 L 385.47494,364.74262 C 385.86069,364.94624 386.23295,365.10029 386.59173,365.20478 C 386.9532,365.30658 387.30118,365.35749 387.63567,365.35749 C 387.97556,365.35749 388.23588,365.30123 388.41662,365.18871 C 388.59735,365.07618 388.68771,364.91543 388.68772,364.70646 C 388.68771,364.51891 388.62567,364.37424 388.50159,364.27242 C 388.38019,364.17062 388.13607,364.07954 387.76921,363.99915 L 387.1663,363.86653 C 386.56205,363.73793 386.11965,363.53298 385.83911,363.25167 C 385.56127,362.97035 385.42234,362.59125 385.42234,362.11435 C 385.42234,361.51691 385.61656,361.05743 386.00501,360.73592 C 386.39346,360.41443 386.95185,360.25368 387.68019,360.25367 C 388.01198,360.25368 388.35322,360.27914 388.70391,360.33003 C 389.05459,360.37826 389.4174,360.45194 389.79236,360.55107 M 395.22657,365.26908 L 392.79069,365.26908 L 392.40629,366.36218 L 390.84037,366.36218 L 393.07798,360.36218 L 394.93524,360.36218 L 397.17286,366.36218 L 395.60693,366.36218 L 395.22657,365.26908 M 393.17914,364.15588 L 394.83409,364.15588 L 394.00863,361.76875 L 393.17914,364.15588"
style="font-size:8.25858784px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:'Bitstream Vera Sans'" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

+121
View File
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="80"
height="15"
id="svg2279"
sodipodi:version="0.32"
inkscape:version="0.45+devel"
version="1.0"
sodipodi:docname="by-nc.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs2281">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3442">
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3444"
width="20.614058"
height="12.483703"
x="171.99832"
y="239.1203" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="10.5125"
inkscape:cx="40"
inkscape:cy="7.5"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="80px"
height="15px"
showborder="true"
inkscape:showpageshadow="false"
inkscape:window-width="935"
inkscape:window-height="624"
inkscape:window-x="50"
inkscape:window-y="160" />
<metadata
id="metadata2284">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="BY-NC"
transform="matrix(0.9875019,0,0,0.9333518,-323.90064,-302.67749)">
<g
id="g3711"
transform="translate(158,87)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.04161763;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3713"
width="80"
height="15"
x="170.5"
y="237.86218" />
<rect
y="239.36218"
x="172"
height="12"
width="77"
id="rect3715"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#abb1aa;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.46913578"
d="M 171.99996,239.37505 L 171.99996,251.37505 L 192.33474,251.37505 C 193.64339,249.62474 194.52652,247.59057 194.52652,245.37505 C 194.52652,243.17431 193.65859,241.1179 192.36599,239.37505 L 171.99996,239.37505 z"
id="path3717"
sodipodi:nodetypes="cccscc" />
<g
id="g3719"
transform="matrix(0.9612533,0,0,0.9612533,6.8341566,9.5069994)"
clip-path="url(#clipPath3442)">
<path
id="path3721"
cx="296.35416"
ry="22.939548"
cy="264.3577"
type="arc"
rx="22.939548"
d="M 190.06417,245.36206 C 190.06667,249.25405 186.91326,252.41072 183.02153,252.41323 C 179.12979,252.41572 175.97262,249.26256 175.97036,245.3706 C 175.97036,245.36783 175.97036,245.36507 175.97036,245.36206 C 175.9681,241.47007 179.12126,238.3134 183.013,238.31113 C 186.90524,238.30864 190.06191,241.46181 190.06417,245.3538 C 190.06417,245.35628 190.06417,245.35929 190.06417,245.36206 z"
style="opacity:1;fill:#ffffff" />
<path
d="M 188.74576,239.62226 C 190.30843,241.18492 191.08988,243.09869 191.08988,245.36206 C 191.08988,247.62592 190.32197,249.51913 188.78615,251.04165 C 187.15627,252.64521 185.22995,253.44672 183.00722,253.44672 C 180.81132,253.44672 178.91837,252.65172 177.32887,251.06174 C 175.73912,249.47198 174.94436,247.57226 174.94436,245.36206 C 174.94436,243.15235 175.73912,241.23908 177.32887,239.62226 C 178.87799,238.0591 180.77094,237.27764 183.00722,237.27764 C 185.2706,237.27764 187.18312,238.05909 188.74576,239.62226 z M 178.38093,240.67355 C 177.05978,242.008 176.39945,243.57116 176.39945,245.36429 C 176.39945,247.15694 177.05326,248.70682 178.36062,250.01393 C 179.66822,251.32153 181.22487,251.97509 183.03105,251.97509 C 184.83724,251.97509 186.40716,251.31502 187.74161,249.99412 C 189.0086,248.76725 189.64234,247.22467 189.64234,245.36429 C 189.64234,243.51799 188.99831,241.95084 187.71101,240.66354 C 186.42396,239.37649 184.86406,238.7327 183.03105,238.7327 C 181.19804,238.73271 179.64767,239.37975 178.38093,240.67355 z M 181.85761,244.57559 C 181.65573,244.13545 181.35354,243.91525 180.95051,243.91525 C 180.23802,243.91525 179.8819,244.39501 179.8819,245.35404 C 179.8819,246.31328 180.23802,246.79255 180.95051,246.79255 C 181.421,246.79255 181.75705,246.55908 181.95869,246.09111 L 182.94629,246.61701 C 182.47555,247.45339 181.76934,247.87168 180.82763,247.87168 C 180.10136,247.87168 179.51953,247.64899 179.08265,247.20409 C 178.64502,246.7587 178.42684,246.14477 178.42684,245.36206 C 178.42684,244.59313 178.65204,243.98271 179.10271,243.53056 C 179.55338,243.07838 180.11463,242.8524 180.7875,242.8524 C 181.78288,242.8524 182.49561,243.24465 182.92647,244.02835 L 181.85761,244.57559 z M 186.50398,244.57559 C 186.30184,244.13545 186.00567,243.91525 185.61517,243.91525 C 184.88839,243.91525 184.52474,244.39501 184.52474,245.35404 C 184.52474,246.31328 184.88839,246.79255 185.61517,246.79255 C 186.08642,246.79255 186.41644,246.55908 186.6048,246.09111 L 187.61447,246.61701 C 187.14448,247.45339 186.43926,247.87168 185.49931,247.87168 C 184.77403,247.87168 184.19346,247.64899 183.75683,247.20409 C 183.32096,246.7587 183.10254,246.14477 183.10254,245.36206 C 183.10254,244.59313 183.32422,243.98271 183.76737,243.53056 C 184.21026,243.07838 184.77404,242.8524 185.4592,242.8524 C 186.45282,242.8524 187.16455,243.24465 187.5939,244.02835 L 186.50398,244.57559 z"
id="path3723"
style="opacity:1" />
</g>
</g>
<path
id="text3725"
d="M 357.4197,331.68502 C 357.66518,331.68502 357.85131,331.63144 357.9781,331.52427 C 358.10488,331.4171 358.16827,331.25904 358.16828,331.05005 C 358.16827,330.84377 358.10488,330.68703 357.9781,330.57986 C 357.85131,330.47002 357.66518,330.41509 357.4197,330.41509 L 356.55784,330.41509 L 356.55784,331.68502 L 357.4197,331.68502 M 357.4723,334.30926 C 357.78522,334.30926 358.0199,334.24363 358.17637,334.11235 C 358.33552,333.98107 358.4151,333.7828 358.4151,333.51757 C 358.4151,333.25769 358.33686,333.06346 358.18041,332.93485 C 358.02396,332.80358 357.78792,332.73793 357.4723,332.73793 L 356.55784,332.73793 L 356.55784,334.30926 L 357.4723,334.30926 M 358.92089,332.15119 C 359.25538,332.24765 359.51434,332.42581 359.69779,332.68569 C 359.88121,332.94557 359.97293,333.26439 359.97294,333.64215 C 359.97293,334.22085 359.776,334.6522 359.38217,334.93619 C 358.98833,335.22018 358.38947,335.36218 357.5856,335.36218 L 355.00001,335.36218 L 355.00001,329.36218 L 357.33878,329.36218 C 358.17771,329.36218 358.78466,329.48811 359.15962,329.73994 C 359.53727,329.99178 359.7261,330.395 359.7261,330.94958 C 359.7261,331.24162 359.65732,331.49078 359.51975,331.69708 C 359.38217,331.9007 359.18255,332.05207 358.92089,332.15119 M 359.83746,329.36218 L 361.54096,329.36218 L 362.91671,331.50015 L 364.29245,329.36218 L 366,329.36218 L 363.69764,332.83438 L 363.69764,335.36218 L 362.13982,335.36218 L 362.13982,332.83438 L 359.83746,329.36218 M 365.15837,332.40839 L 367.69946,332.40839 L 367.69946,333.57785 L 365.15837,333.57785 L 365.15837,332.40839 M 368.9174,329.36218 L 370.65732,329.36218 L 372.85447,333.47738 L 372.85447,329.36218 L 374.33138,329.36218 L 374.33138,335.36218 L 372.59146,335.36218 L 370.3943,331.24698 L 370.3943,335.36218 L 368.9174,335.36218 L 368.9174,329.36218 M 380.65173,335.03264 C 380.36579,335.17999 380.0677,335.29118 379.75749,335.36619 C 379.44727,335.44122 379.12357,335.47872 378.78638,335.47872 C 377.78019,335.47872 376.98307,335.20009 376.395,334.64282 C 375.80693,334.08288 375.5129,333.32467 375.5129,332.36821 C 375.5129,331.40907 375.80693,330.65087 376.395,330.0936 C 376.98307,329.53365 377.78019,329.25368 378.78638,329.25367 C 379.12357,329.25368 379.44727,329.29118 379.75749,329.3662 C 380.0677,329.44122 380.36579,329.55241 380.65173,329.69975 L 380.65173,330.94155 C 380.36309,330.74597 380.0785,330.60263 379.79796,330.51154 C 379.5174,330.42046 379.22203,330.37491 378.91181,330.3749 C 378.35611,330.37491 377.91911,330.55174 377.6008,330.90538 C 377.28249,331.25904 377.12333,331.74665 377.12333,332.36821 C 377.12333,332.9871 377.28249,333.47336 377.6008,333.82701 C 377.91911,334.18066 378.35611,334.35749 378.91181,334.35749 C 379.22203,334.35749 379.5174,334.31194 379.79796,334.22085 C 380.0785,334.12976 380.36309,333.98643 380.65173,333.79085 L 380.65173,335.03264"
style="font-size:8.25858784px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:'Bitstream Vera Sans'" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

+117
View File
@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="80"
height="15"
id="svg2279"
sodipodi:version="0.32"
inkscape:version="0.45+devel"
version="1.0"
sodipodi:docname="by-nd.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs2281">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3442">
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3444"
width="20.614058"
height="12.483703"
x="171.99832"
y="239.1203" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="10.5125"
inkscape:cx="40"
inkscape:cy="7.5"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="80px"
height="15px"
showborder="true"
inkscape:showpageshadow="false"
inkscape:window-width="935"
inkscape:window-height="624"
inkscape:window-x="50"
inkscape:window-y="160" />
<metadata
id="metadata2284">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="BY-ND"
transform="matrix(0.9875019,0,0,0.9333518,-323.90064,-384.81244)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.04161763;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3767"
width="80"
height="15"
x="328.5"
y="412.86218" />
<rect
y="414.36218"
x="330"
height="12"
width="77"
id="rect3769"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#abb1aa;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.46913578"
d="M 329.99996,414.36218 L 329.99996,426.36218 L 350.33474,426.36218 C 351.64339,424.61187 352.52652,422.5777 352.52652,420.36218 C 352.52652,418.16144 351.65859,416.10503 350.36599,414.36218 L 329.99996,414.36218 z"
id="path3771"
sodipodi:nodetypes="cccscc" />
<g
id="g3773"
transform="matrix(0.9612533,0,0,0.9612533,164.83416,184.507)"
clip-path="url(#clipPath3442)">
<path
id="path3775"
cx="296.35416"
ry="22.939548"
cy="264.3577"
type="arc"
rx="22.939548"
d="M 190.06417,245.36206 C 190.06667,249.25405 186.91326,252.41072 183.02153,252.41323 C 179.12979,252.41572 175.97262,249.26256 175.97036,245.3706 C 175.97036,245.36783 175.97036,245.36507 175.97036,245.36206 C 175.9681,241.47007 179.12126,238.3134 183.013,238.31113 C 186.90524,238.30864 190.06191,241.46181 190.06417,245.3538 C 190.06417,245.35628 190.06417,245.35929 190.06417,245.36206 z"
style="opacity:1;fill:#ffffff" />
<path
d="M 188.74576,239.62226 C 190.30843,241.18492 191.08988,243.09869 191.08988,245.36206 C 191.08988,247.62592 190.32197,249.51913 188.78615,251.04165 C 187.15627,252.64521 185.22995,253.44672 183.00722,253.44672 C 180.81132,253.44672 178.91837,252.65172 177.32887,251.06174 C 175.73912,249.47198 174.94436,247.57226 174.94436,245.36206 C 174.94436,243.15235 175.73912,241.23908 177.32887,239.62226 C 178.87799,238.0591 180.77094,237.27764 183.00722,237.27764 C 185.2706,237.27764 187.18312,238.05909 188.74576,239.62226 z M 178.38093,240.67355 C 177.05978,242.008 176.39945,243.57116 176.39945,245.36429 C 176.39945,247.15694 177.05326,248.70682 178.36062,250.01393 C 179.66822,251.32153 181.22487,251.97509 183.03105,251.97509 C 184.83724,251.97509 186.40716,251.31502 187.74161,249.99412 C 189.0086,248.76725 189.64234,247.22467 189.64234,245.36429 C 189.64234,243.51799 188.99831,241.95084 187.71101,240.66354 C 186.42396,239.37649 184.86406,238.7327 183.03105,238.7327 C 181.19804,238.73271 179.64767,239.37975 178.38093,240.67355 z M 181.85761,244.57559 C 181.65573,244.13545 181.35354,243.91525 180.95051,243.91525 C 180.23802,243.91525 179.8819,244.39501 179.8819,245.35404 C 179.8819,246.31328 180.23802,246.79255 180.95051,246.79255 C 181.421,246.79255 181.75705,246.55908 181.95869,246.09111 L 182.94629,246.61701 C 182.47555,247.45339 181.76934,247.87168 180.82763,247.87168 C 180.10136,247.87168 179.51953,247.64899 179.08265,247.20409 C 178.64502,246.7587 178.42684,246.14477 178.42684,245.36206 C 178.42684,244.59313 178.65204,243.98271 179.10271,243.53056 C 179.55338,243.07838 180.11463,242.8524 180.7875,242.8524 C 181.78288,242.8524 182.49561,243.24465 182.92647,244.02835 L 181.85761,244.57559 z M 186.50398,244.57559 C 186.30184,244.13545 186.00567,243.91525 185.61517,243.91525 C 184.88839,243.91525 184.52474,244.39501 184.52474,245.35404 C 184.52474,246.31328 184.88839,246.79255 185.61517,246.79255 C 186.08642,246.79255 186.41644,246.55908 186.6048,246.09111 L 187.61447,246.61701 C 187.14448,247.45339 186.43926,247.87168 185.49931,247.87168 C 184.77403,247.87168 184.19346,247.64899 183.75683,247.20409 C 183.32096,246.7587 183.10254,246.14477 183.10254,245.36206 C 183.10254,244.59313 183.32422,243.98271 183.76737,243.53056 C 184.21026,243.07838 184.77404,242.8524 185.4592,242.8524 C 186.45282,242.8524 187.16455,243.24465 187.5939,244.02835 L 186.50398,244.57559 z"
id="path3777"
style="opacity:1" />
</g>
<path
id="text3779"
d="M 357.4197,419.68502 C 357.66518,419.68502 357.85131,419.63145 357.9781,419.52427 C 358.10488,419.41711 358.16827,419.25904 358.16828,419.05006 C 358.16827,418.84377 358.10488,418.68704 357.9781,418.57987 C 357.85131,418.47002 357.66518,418.4151 357.4197,418.4151 L 356.55784,418.4151 L 356.55784,419.68502 L 357.4197,419.68502 M 357.4723,422.30927 C 357.78522,422.30927 358.0199,422.24363 358.17637,422.11235 C 358.33552,421.98107 358.4151,421.78281 358.4151,421.51758 C 358.4151,421.2577 358.33686,421.06346 358.18041,420.93485 C 358.02396,420.80358 357.78792,420.73794 357.4723,420.73794 L 356.55784,420.73794 L 356.55784,422.30927 L 357.4723,422.30927 M 358.92089,420.1512 C 359.25538,420.24766 359.51434,420.42582 359.69779,420.6857 C 359.88121,420.94558 359.97293,421.2644 359.97294,421.64215 C 359.97293,422.22086 359.776,422.65221 359.38217,422.93619 C 358.98833,423.22019 358.38947,423.36218 357.5856,423.36218 L 355.00001,423.36218 L 355.00001,417.36219 L 357.33878,417.36219 C 358.17771,417.36219 358.78466,417.48812 359.15962,417.73994 C 359.53727,417.99179 359.7261,418.39501 359.7261,418.94959 C 359.7261,419.24162 359.65732,419.49079 359.51975,419.69708 C 359.38217,419.90071 359.18255,420.05208 358.92089,420.1512 M 359.83746,417.36219 L 361.54096,417.36219 L 362.91671,419.50016 L 364.29245,417.36219 L 366,417.36219 L 363.69764,420.83439 L 363.69764,423.36218 L 362.13982,423.36218 L 362.13982,420.83439 L 359.83746,417.36219 M 365.15837,420.4084 L 367.69946,420.4084 L 367.69946,421.57785 L 365.15837,421.57785 L 365.15837,420.4084 M 368.9174,417.36219 L 370.65732,417.36219 L 372.85447,421.47739 L 372.85447,417.36219 L 374.33138,417.36219 L 374.33138,423.36218 L 372.59146,423.36218 L 370.3943,419.24698 L 370.3943,423.36218 L 368.9174,423.36218 L 368.9174,417.36219 M 377.41872,418.53164 L 377.41872,422.19273 L 377.97711,422.19273 C 378.61373,422.19273 379.09929,422.03599 379.43379,421.72253 C 379.77098,421.40907 379.93957,420.95361 379.93957,420.35616 C 379.93957,419.76138 379.77232,419.3086 379.43783,418.99782 C 379.10333,418.68704 378.61643,418.53164 377.97711,418.53164 L 377.41872,418.53164 M 375.86089,417.36219 L 377.50369,417.36219 C 378.42085,417.36219 379.10333,417.42783 379.55113,417.5591 C 380.00162,417.68771 380.38736,417.9074 380.70838,418.21818 C 380.99161,418.48878 381.20202,418.8009 381.3396,419.15455 C 381.47717,419.5082 381.54596,419.90874 381.54597,420.35616 C 381.54596,420.80894 381.47717,421.21349 381.3396,421.56982 C 381.20202,421.92347 380.99161,422.23559 380.70838,422.5062 C 380.38466,422.81697 379.99622,423.038 379.54304,423.16928 C 379.08984,423.29788 378.41007,423.36218 377.50369,423.36218 L 375.86089,423.36218 L 375.86089,417.36219"
style="font-size:8.25858784px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:'Bitstream Vera Sans'" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

+121
View File
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="80"
height="15"
id="svg2279"
sodipodi:version="0.32"
inkscape:version="0.45+devel"
version="1.0"
sodipodi:docname="by-sa.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs2281">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3442">
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3444"
width="20.614058"
height="12.483703"
x="171.99832"
y="239.1203" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="10.5125"
inkscape:cx="40"
inkscape:cy="7.5"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="80px"
height="15px"
showborder="true"
inkscape:showpageshadow="false"
inkscape:window-width="935"
inkscape:window-height="624"
inkscape:window-x="50"
inkscape:window-y="160" />
<metadata
id="metadata2284">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="BY-SA"
transform="matrix(0.9875019,0,0,0.9333518,-323.90064,-356.81188)">
<g
id="g3747"
transform="translate(158,145)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.04161763;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3749"
width="80"
height="15"
x="170.5"
y="237.86218" />
<rect
y="239.36218"
x="172"
height="12"
width="77"
id="rect3751"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#abb1aa;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.46913578"
d="M 171.99996,239.37505 L 171.99996,251.37505 L 192.33474,251.37505 C 193.64339,249.62474 194.52652,247.59057 194.52652,245.37505 C 194.52652,243.17431 193.65859,241.1179 192.36599,239.37505 L 171.99996,239.37505 z"
id="path3753"
sodipodi:nodetypes="cccscc" />
<g
id="g3755"
transform="matrix(0.9612533,0,0,0.9612533,6.8341566,9.5069994)"
clip-path="url(#clipPath3442)">
<path
id="path3757"
cx="296.35416"
ry="22.939548"
cy="264.3577"
type="arc"
rx="22.939548"
d="M 190.06417,245.36206 C 190.06667,249.25405 186.91326,252.41072 183.02153,252.41323 C 179.12979,252.41572 175.97262,249.26256 175.97036,245.3706 C 175.97036,245.36783 175.97036,245.36507 175.97036,245.36206 C 175.9681,241.47007 179.12126,238.3134 183.013,238.31113 C 186.90524,238.30864 190.06191,241.46181 190.06417,245.3538 C 190.06417,245.35628 190.06417,245.35929 190.06417,245.36206 z"
style="opacity:1;fill:#ffffff" />
<path
d="M 188.74576,239.62226 C 190.30843,241.18492 191.08988,243.09869 191.08988,245.36206 C 191.08988,247.62592 190.32197,249.51913 188.78615,251.04165 C 187.15627,252.64521 185.22995,253.44672 183.00722,253.44672 C 180.81132,253.44672 178.91837,252.65172 177.32887,251.06174 C 175.73912,249.47198 174.94436,247.57226 174.94436,245.36206 C 174.94436,243.15235 175.73912,241.23908 177.32887,239.62226 C 178.87799,238.0591 180.77094,237.27764 183.00722,237.27764 C 185.2706,237.27764 187.18312,238.05909 188.74576,239.62226 z M 178.38093,240.67355 C 177.05978,242.008 176.39945,243.57116 176.39945,245.36429 C 176.39945,247.15694 177.05326,248.70682 178.36062,250.01393 C 179.66822,251.32153 181.22487,251.97509 183.03105,251.97509 C 184.83724,251.97509 186.40716,251.31502 187.74161,249.99412 C 189.0086,248.76725 189.64234,247.22467 189.64234,245.36429 C 189.64234,243.51799 188.99831,241.95084 187.71101,240.66354 C 186.42396,239.37649 184.86406,238.7327 183.03105,238.7327 C 181.19804,238.73271 179.64767,239.37975 178.38093,240.67355 z M 181.85761,244.57559 C 181.65573,244.13545 181.35354,243.91525 180.95051,243.91525 C 180.23802,243.91525 179.8819,244.39501 179.8819,245.35404 C 179.8819,246.31328 180.23802,246.79255 180.95051,246.79255 C 181.421,246.79255 181.75705,246.55908 181.95869,246.09111 L 182.94629,246.61701 C 182.47555,247.45339 181.76934,247.87168 180.82763,247.87168 C 180.10136,247.87168 179.51953,247.64899 179.08265,247.20409 C 178.64502,246.7587 178.42684,246.14477 178.42684,245.36206 C 178.42684,244.59313 178.65204,243.98271 179.10271,243.53056 C 179.55338,243.07838 180.11463,242.8524 180.7875,242.8524 C 181.78288,242.8524 182.49561,243.24465 182.92647,244.02835 L 181.85761,244.57559 z M 186.50398,244.57559 C 186.30184,244.13545 186.00567,243.91525 185.61517,243.91525 C 184.88839,243.91525 184.52474,244.39501 184.52474,245.35404 C 184.52474,246.31328 184.88839,246.79255 185.61517,246.79255 C 186.08642,246.79255 186.41644,246.55908 186.6048,246.09111 L 187.61447,246.61701 C 187.14448,247.45339 186.43926,247.87168 185.49931,247.87168 C 184.77403,247.87168 184.19346,247.64899 183.75683,247.20409 C 183.32096,246.7587 183.10254,246.14477 183.10254,245.36206 C 183.10254,244.59313 183.32422,243.98271 183.76737,243.53056 C 184.21026,243.07838 184.77404,242.8524 185.4592,242.8524 C 186.45282,242.8524 187.16455,243.24465 187.5939,244.02835 L 186.50398,244.57559 z"
id="path3759"
style="opacity:1" />
</g>
</g>
<path
id="text3761"
d="M 357.4197,389.68502 C 357.66518,389.68502 357.85131,389.63144 357.9781,389.52427 C 358.10488,389.4171 358.16827,389.25904 358.16828,389.05005 C 358.16827,388.84376 358.10488,388.68703 357.9781,388.57986 C 357.85131,388.47002 357.66518,388.4151 357.4197,388.41509 L 356.55784,388.41509 L 356.55784,389.68502 L 357.4197,389.68502 M 357.4723,392.30926 C 357.78522,392.30926 358.0199,392.24363 358.17637,392.11235 C 358.33552,391.98107 358.4151,391.78281 358.4151,391.51756 C 358.4151,391.25769 358.33686,391.06345 358.18041,390.93485 C 358.02396,390.80357 357.78792,390.73793 357.4723,390.73793 L 356.55784,390.73793 L 356.55784,392.30926 L 357.4723,392.30926 M 358.92089,390.15119 C 359.25538,390.24764 359.51434,390.42581 359.69779,390.68568 C 359.88121,390.94557 359.97293,391.26439 359.97294,391.64215 C 359.97293,392.22086 359.776,392.6522 359.38217,392.93619 C 358.98833,393.22018 358.38947,393.36218 357.5856,393.36218 L 355.00001,393.36218 L 355.00001,387.36218 L 357.33878,387.36218 C 358.17771,387.36218 358.78466,387.4881 359.15962,387.73994 C 359.53727,387.99178 359.7261,388.395 359.7261,388.94959 C 359.7261,389.24162 359.65732,389.49078 359.51975,389.69708 C 359.38217,389.90069 359.18255,390.05206 358.92089,390.15119 M 359.83746,387.36218 L 361.54096,387.36218 L 362.91671,389.50015 L 364.29245,387.36218 L 366,387.36218 L 363.69764,390.83438 L 363.69764,393.36218 L 362.13982,393.36218 L 362.13982,390.83438 L 359.83746,387.36218 M 365.15837,390.40839 L 367.69946,390.40839 L 367.69946,391.57785 L 365.15837,391.57785 L 365.15837,390.40839 M 373.12153,387.55105 L 373.12153,388.82099 C 372.78973,388.67363 372.46602,388.56245 372.15042,388.48743 C 371.8348,388.41241 371.53671,388.3749 371.25618,388.3749 C 370.88391,388.3749 370.60877,388.42581 370.43073,388.52761 C 370.25268,388.62943 370.16367,388.7875 370.16367,389.00183 C 370.16367,389.16259 370.22301,389.28851 370.3417,389.37959 C 370.4631,389.46801 370.68159,389.54436 370.99721,389.60866 L 371.66081,389.74127 C 372.33249,389.87524 372.80996,390.07886 373.0932,390.35213 C 373.37644,390.62541 373.51806,391.01389 373.51807,391.51756 C 373.51806,392.17933 373.3198,392.67229 372.92326,392.99647 C 372.52941,393.31797 371.92651,393.47872 371.11455,393.47872 C 370.7315,393.47872 370.3471,393.44255 369.96136,393.37021 C 369.5756,393.29788 369.18985,393.1907 368.80411,393.04871 L 368.80411,391.74262 C 369.18985,391.94624 369.56211,392.10029 369.92089,392.20477 C 370.28236,392.30658 370.63034,392.35749 370.96484,392.35749 C 371.30473,392.35749 371.56504,392.30123 371.74578,392.1887 C 371.92651,392.07618 372.01688,391.91542 372.01688,391.70645 C 372.01688,391.51891 371.95484,391.37423 371.83076,391.27242 C 371.70936,391.17062 371.46523,391.07952 371.09837,390.99915 L 370.49547,390.86653 C 369.89122,390.73793 369.44882,390.53297 369.16827,390.25166 C 368.89042,389.97035 368.7515,389.59125 368.7515,389.11435 C 368.7515,388.51691 368.94572,388.05743 369.33418,387.73592 C 369.72262,387.41442 370.28101,387.25367 371.00935,387.25367 C 371.34115,387.25367 371.68238,387.27912 372.03307,387.33003 C 372.38374,387.37826 372.74656,387.45193 373.12153,387.55105 M 378.55573,392.26907 L 376.11985,392.26907 L 375.73545,393.36218 L 374.16953,393.36218 L 376.40714,387.36218 L 378.2644,387.36218 L 380.50201,393.36218 L 378.93609,393.36218 L 378.55573,392.26907 M 376.5083,391.15588 L 378.16324,391.15588 L 377.3378,388.76874 L 376.5083,391.15588"
style="font-size:8.25858784px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:'Bitstream Vera Sans'" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

+121
View File
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="80"
height="15"
id="svg2279"
sodipodi:version="0.32"
inkscape:version="0.45+devel"
version="1.0"
sodipodi:docname="by.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs2281">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3442">
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3444"
width="20.614058"
height="12.483703"
x="171.99832"
y="239.1203" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="10.5125"
inkscape:cx="40"
inkscape:cy="7.5"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="80px"
height="15px"
showborder="true"
inkscape:showpageshadow="false"
inkscape:window-width="935"
inkscape:window-height="624"
inkscape:window-x="50"
inkscape:window-y="160" />
<metadata
id="metadata2284">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="BY"
transform="matrix(0.9875019,0,0,0.9333518,-323.90064,-271.87688)">
<g
transform="translate(158,54)"
id="g3693">
<rect
y="237.86218"
x="170.5"
height="15"
width="80"
id="rect3695"
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.04161763;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3697"
width="77"
height="12"
x="172"
y="239.36218" />
<path
sodipodi:nodetypes="cccscc"
id="path3699"
d="M 171.99996,239.37505 L 171.99996,251.37505 L 192.33474,251.37505 C 193.64339,249.62474 194.52652,247.59057 194.52652,245.37505 C 194.52652,243.17431 193.65859,241.1179 192.36599,239.37505 L 171.99996,239.37505 z"
style="fill:#abb1aa;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.46913578" />
<g
clip-path="url(#clipPath3442)"
transform="matrix(0.9612533,0,0,0.9612533,6.8341566,9.5069994)"
id="g3701">
<path
style="opacity:1;fill:#ffffff"
d="M 190.06417,245.36206 C 190.06667,249.25405 186.91326,252.41072 183.02153,252.41323 C 179.12979,252.41572 175.97262,249.26256 175.97036,245.3706 C 175.97036,245.36783 175.97036,245.36507 175.97036,245.36206 C 175.9681,241.47007 179.12126,238.3134 183.013,238.31113 C 186.90524,238.30864 190.06191,241.46181 190.06417,245.3538 C 190.06417,245.35628 190.06417,245.35929 190.06417,245.36206 z"
rx="22.939548"
type="arc"
cy="264.3577"
ry="22.939548"
cx="296.35416"
id="path3703" />
<path
style="opacity:1"
id="path3705"
d="M 188.74576,239.62226 C 190.30843,241.18492 191.08988,243.09869 191.08988,245.36206 C 191.08988,247.62592 190.32197,249.51913 188.78615,251.04165 C 187.15627,252.64521 185.22995,253.44672 183.00722,253.44672 C 180.81132,253.44672 178.91837,252.65172 177.32887,251.06174 C 175.73912,249.47198 174.94436,247.57226 174.94436,245.36206 C 174.94436,243.15235 175.73912,241.23908 177.32887,239.62226 C 178.87799,238.0591 180.77094,237.27764 183.00722,237.27764 C 185.2706,237.27764 187.18312,238.05909 188.74576,239.62226 z M 178.38093,240.67355 C 177.05978,242.008 176.39945,243.57116 176.39945,245.36429 C 176.39945,247.15694 177.05326,248.70682 178.36062,250.01393 C 179.66822,251.32153 181.22487,251.97509 183.03105,251.97509 C 184.83724,251.97509 186.40716,251.31502 187.74161,249.99412 C 189.0086,248.76725 189.64234,247.22467 189.64234,245.36429 C 189.64234,243.51799 188.99831,241.95084 187.71101,240.66354 C 186.42396,239.37649 184.86406,238.7327 183.03105,238.7327 C 181.19804,238.73271 179.64767,239.37975 178.38093,240.67355 z M 181.85761,244.57559 C 181.65573,244.13545 181.35354,243.91525 180.95051,243.91525 C 180.23802,243.91525 179.8819,244.39501 179.8819,245.35404 C 179.8819,246.31328 180.23802,246.79255 180.95051,246.79255 C 181.421,246.79255 181.75705,246.55908 181.95869,246.09111 L 182.94629,246.61701 C 182.47555,247.45339 181.76934,247.87168 180.82763,247.87168 C 180.10136,247.87168 179.51953,247.64899 179.08265,247.20409 C 178.64502,246.7587 178.42684,246.14477 178.42684,245.36206 C 178.42684,244.59313 178.65204,243.98271 179.10271,243.53056 C 179.55338,243.07838 180.11463,242.8524 180.7875,242.8524 C 181.78288,242.8524 182.49561,243.24465 182.92647,244.02835 L 181.85761,244.57559 z M 186.50398,244.57559 C 186.30184,244.13545 186.00567,243.91525 185.61517,243.91525 C 184.88839,243.91525 184.52474,244.39501 184.52474,245.35404 C 184.52474,246.31328 184.88839,246.79255 185.61517,246.79255 C 186.08642,246.79255 186.41644,246.55908 186.6048,246.09111 L 187.61447,246.61701 C 187.14448,247.45339 186.43926,247.87168 185.49931,247.87168 C 184.77403,247.87168 184.19346,247.64899 183.75683,247.20409 C 183.32096,246.7587 183.10254,246.14477 183.10254,245.36206 C 183.10254,244.59313 183.32422,243.98271 183.76737,243.53056 C 184.21026,243.07838 184.77404,242.8524 185.4592,242.8524 C 186.45282,242.8524 187.16455,243.24465 187.5939,244.02835 L 186.50398,244.57559 z" />
</g>
</g>
<path
id="text3707"
d="M 357.4197,298.68502 C 357.66518,298.68503 357.85131,298.63145 357.9781,298.52427 C 358.10488,298.41711 358.16827,298.25904 358.16828,298.05007 C 358.16827,297.84377 358.10488,297.68704 357.9781,297.57987 C 357.85131,297.47003 357.66518,297.41511 357.4197,297.4151 L 356.55784,297.4151 L 356.55784,298.68502 L 357.4197,298.68502 M 357.4723,301.30928 C 357.78522,301.30928 358.0199,301.24363 358.17637,301.11235 C 358.33552,300.98108 358.4151,300.78282 358.4151,300.51758 C 358.4151,300.2577 358.33686,300.06346 358.18041,299.93486 C 358.02396,299.80358 357.78792,299.73795 357.4723,299.73794 L 356.55784,299.73794 L 356.55784,301.30928 L 357.4723,301.30928 M 358.92089,299.15121 C 359.25538,299.24766 359.51434,299.42582 359.69779,299.6857 C 359.88121,299.94558 359.97293,300.26439 359.97294,300.64216 C 359.97293,301.22086 359.776,301.6522 359.38217,301.9362 C 358.98833,302.22019 358.38947,302.36218 357.5856,302.36218 L 355.00001,302.36218 L 355.00001,296.36218 L 357.33878,296.36218 C 358.17771,296.36219 358.78466,296.48811 359.15962,296.73995 C 359.53727,296.9918 359.7261,297.39501 359.7261,297.94959 C 359.7261,298.24163 359.65732,298.49079 359.51975,298.69708 C 359.38217,298.9007 359.18255,299.05208 358.92089,299.15121 M 359.83746,296.36218 L 361.54096,296.36218 L 362.91671,298.50016 L 364.29245,296.36218 L 366,296.36218 L 363.69764,299.83439 L 363.69764,302.36218 L 362.13982,302.36218 L 362.13982,299.83439 L 359.83746,296.36218"
style="font-size:8.25858784px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:'Bitstream Vera Sans'" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.1 KiB

+72
View File
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="80px" height="15px" viewBox="0 0 80 15" enable-background="new 0 0 80 15" xml:space="preserve">
<g>
<g>
<rect fill="#FFFFFF" width="80" height="15"/>
</g>
<path d="M22.797,2C23.8,3.595,24.39,5.477,24.39,7.501c0,2.023-0.589,3.904-1.592,5.499H80V2H22.797z"/>
<g>
<path id="text2809_5_" d="M12.42,2.031c-3.137,0-3.926,2.959-3.926,5.469s0.787,5.469,3.926,5.469
c3.137,0,3.924-2.959,3.924-5.469S15.557,2.031,12.42,2.031z M12.42,4.094c0.127,0,0.242,0.02,0.352,0.047
c0.227,0.193,0.336,0.463,0.121,0.838l-2.09,3.838C10.738,8.33,10.729,7.855,10.729,7.5C10.729,6.395,10.807,4.094,12.42,4.094z
M13.982,5.863c0.111,0.588,0.127,1.203,0.127,1.637c0,1.105-0.076,3.406-1.689,3.406c-0.127,0-0.244-0.012-0.354-0.039
c-0.02-0.006-0.039-0.014-0.061-0.021c-0.031-0.01-0.066-0.02-0.098-0.031c-0.359-0.154-0.586-0.43-0.26-0.92L13.982,5.863z"/>
<path d="M21.229,3.848c-0.465-1.152-1.143-2.172-2.035-3.066C18.907,0.496,18.607,0.241,18.302,0h-3.708
c1.248,0.348,2.367,1.009,3.354,1.998c0.736,0.736,1.299,1.576,1.684,2.516s0.578,1.936,0.578,2.986
c0,2.184-0.746,3.994-2.227,5.441c-0.771,0.746-1.635,1.32-2.596,1.717c-0.344,0.143-0.694,0.251-1.046,0.342h3.892
c0.336-0.257,0.664-0.529,0.972-0.834c0.895-0.871,1.57-1.871,2.021-3c0.465-1.143,0.693-2.363,0.693-3.666
C21.92,6.211,21.691,4.99,21.229,3.848z M6.957,12.975c-0.746-0.746-1.322-1.59-1.729-2.527c-0.396-0.951-0.6-1.93-0.6-2.947
c0-1.029,0.203-2.016,0.6-2.955c0.406-0.949,0.982-1.803,1.729-2.561C7.916,1.004,9.021,0.346,10.268,0H6.58
C6.289,0.235,6.004,0.484,5.732,0.762C4.816,1.676,4.117,2.721,3.631,3.887C3.156,5.041,2.92,6.244,2.92,7.5
c0,1.268,0.236,2.471,0.711,3.613s1.164,2.17,2.068,3.086C5.994,14.49,6.305,14.752,6.623,15h3.88
c-0.345-0.088-0.686-0.191-1.019-0.328C8.547,14.277,7.705,13.711,6.957,12.975z"/>
</g>
<g>
<path d="M80,0v15H0V0H80 M79.25,0.75H0.75v13.5h78.5V0.75L79.25,0.75z"/>
</g>
<g>
<path fill="#FFFFFF" d="M30.514,8.106c-0.279,0.233-0.678,0.35-1.197,0.35h-0.993v1.717h-0.991V5.398h2.05
c0.473,0,0.849,0.123,1.13,0.369s0.422,0.628,0.422,1.144C30.934,7.475,30.794,7.873,30.514,8.106z M29.753,6.387
c-0.127-0.106-0.304-0.159-0.531-0.159h-0.898v1.406h0.898c0.228,0,0.404-0.058,0.531-0.172c0.126-0.114,0.189-0.296,0.189-0.544
C29.942,6.669,29.879,6.492,29.753,6.387z"/>
<path fill="#FFFFFF" d="M31.733,5.398h1.015v2.933c0,0.328,0.038,0.567,0.116,0.718c0.12,0.268,0.383,0.401,0.787,0.401
c0.402,0,0.664-0.134,0.784-0.401c0.077-0.15,0.116-0.39,0.116-0.718V5.398h1.014v2.935c0,0.508-0.079,0.902-0.236,1.186
c-0.293,0.519-0.853,0.777-1.678,0.777c-0.826,0-1.387-0.259-1.682-0.777c-0.157-0.283-0.236-0.678-0.236-1.186V5.398z"/>
<path fill="#FFFFFF" d="M40.085,5.907c0.146,0.203,0.219,0.446,0.219,0.729c0,0.292-0.074,0.526-0.221,0.703
c-0.083,0.1-0.204,0.19-0.364,0.272c0.243,0.088,0.427,0.229,0.551,0.421s0.187,0.425,0.187,0.699
c0,0.283-0.071,0.537-0.213,0.761c-0.09,0.149-0.203,0.274-0.338,0.376c-0.152,0.117-0.332,0.196-0.539,0.24
c-0.208,0.043-0.433,0.064-0.675,0.064H36.54V5.398h2.308C39.43,5.407,39.842,5.577,40.085,5.907z M37.492,6.228V7.28h1.16
c0.208,0,0.376-0.039,0.505-0.118c0.13-0.079,0.194-0.219,0.194-0.419c0-0.223-0.086-0.369-0.257-0.44
c-0.147-0.05-0.335-0.075-0.563-0.075H37.492z M37.492,8.07v1.273h1.159c0.207,0,0.368-0.028,0.483-0.084
c0.209-0.104,0.313-0.303,0.313-0.597c0-0.248-0.101-0.419-0.304-0.512C39.031,8.1,38.872,8.073,38.667,8.07H37.492z"/>
<path fill="#FFFFFF" d="M41.313,5.398h0.998v3.916h2.384v0.858h-3.382V5.398z"/>
<path fill="#FFFFFF" d="M46.275,10.173h-0.991V5.398h0.991V10.173z"/>
<path fill="#FFFFFF" d="M47.665,5.897c0.385-0.393,0.874-0.59,1.468-0.59c0.795,0,1.376,0.264,1.743,0.791
c0.203,0.296,0.312,0.593,0.327,0.891h-0.998c-0.063-0.229-0.145-0.402-0.244-0.519c-0.178-0.207-0.441-0.311-0.79-0.311
c-0.355,0-0.636,0.146-0.841,0.438s-0.308,0.707-0.308,1.242s0.108,0.937,0.324,1.203c0.217,0.267,0.492,0.4,0.826,0.4
c0.342,0,0.603-0.114,0.782-0.344c0.1-0.123,0.182-0.308,0.247-0.554h0.991c-0.086,0.521-0.304,0.943-0.655,1.27
s-0.802,0.489-1.351,0.489c-0.68,0-1.214-0.221-1.603-0.661c-0.389-0.442-0.583-1.049-0.583-1.82
C47.002,6.991,47.224,6.349,47.665,5.897z"/>
<path fill="#FFFFFF" d="M54.797,5.502c0.335,0.11,0.606,0.312,0.813,0.606c0.167,0.237,0.28,0.494,0.341,0.771
s0.091,0.54,0.091,0.79c0,0.635-0.128,1.173-0.383,1.613c-0.346,0.594-0.88,0.891-1.602,0.891h-2.059V5.398h2.059
C54.354,5.403,54.601,5.438,54.797,5.502z M52.968,6.228v3.116h0.922c0.471,0,0.8-0.232,0.985-0.696
c0.102-0.255,0.152-0.559,0.152-0.91c0-0.486-0.076-0.859-0.229-1.119s-0.455-0.391-0.909-0.391H52.968z"/>
<path fill="#FFFFFF" d="M60.466,9.749c-0.36,0.371-0.882,0.557-1.564,0.557s-1.204-0.186-1.564-0.557
c-0.483-0.456-0.726-1.112-0.726-1.97c0-0.875,0.242-1.531,0.726-1.97c0.36-0.371,0.882-0.557,1.564-0.557
s1.204,0.186,1.564,0.557c0.481,0.438,0.722,1.095,0.722,1.97C61.188,8.637,60.947,9.293,60.466,9.749z M59.842,9.023
c0.232-0.292,0.349-0.706,0.349-1.244c0-0.535-0.116-0.949-0.349-1.242c-0.231-0.293-0.545-0.438-0.94-0.438
s-0.711,0.146-0.946,0.437c-0.235,0.292-0.353,0.706-0.353,1.244s0.117,0.952,0.353,1.244c0.235,0.291,0.551,0.437,0.946,0.437
S59.61,9.314,59.842,9.023z"/>
<path fill="#FFFFFF" d="M65.116,5.398h1.436v4.774h-0.929V6.943c0-0.093,0.001-0.223,0.003-0.39
c0.002-0.168,0.003-0.297,0.003-0.388l-0.904,4.007h-0.97l-0.898-4.007c0,0.091,0.001,0.22,0.003,0.388
c0.003,0.167,0.004,0.297,0.004,0.39v3.229h-0.93V5.398h1.451l0.869,3.754L65.116,5.398z"/>
<path fill="#FFFFFF" d="M68.84,5.398h1.129l1.689,4.774h-1.082l-0.314-0.981h-1.759l-0.323,0.981h-1.044L68.84,5.398z
M68.774,8.369h1.223L69.395,6.49L68.774,8.369z"/>
<path fill="#FFFFFF" d="M73.175,10.173h-0.991V5.398h0.991V10.173z"/>
<path fill="#FFFFFF" d="M74.093,5.398h1.046l1.895,3.329V5.398h0.93v4.774h-0.997l-1.943-3.388v3.388h-0.93V5.398z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 827 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 B

+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 100.1 100.3" style="enable-background:new 0 0 100.1 100.3;" xml:space="preserve">
<style type="text/css">
.st0{fill:#2C2C2C;}
.st1{fill:#FFFFFF;}
</style>
<path class="st0" d="M50.1,98.6c-26.7,0-48.4-21.7-48.4-48.4S23.4,1.8,50.1,1.8s48.4,21.7,48.4,48.4S76.8,98.6,50.1,98.6z"/>
<path class="st0" d="M50.1,3.3c-25.8,0-46.9,21-46.9,46.9s21,46.9,46.9,46.9S97,76.1,97,50.2S75.9,3.3,50.1,3.3 M50.1,0.2
c27.6,0,50,22.4,50,50s-22.4,50-50,50s-50-22.4-50-50S22.4,0.2,50.1,0.2z"/>
<path class="st1" d="M78.3,17.1c0-0.7-0.3-1.4-0.7-1.9c-0.5-0.7-1.1-1.2-1.8-1.6c-0.7-0.4-1.5-1-2.2-1.4c-1-0.3-1.6-0.4-2.2-0.4
c-0.8,0-1.8,0.4-3,0.8c-0.5,0.4-1.1,0.5-1.6,0.8c-0.5,0.4-1.1,0.5-1.8,0.5c-4.6,0.7-9,1.2-13,1.5c-4.1,0.4-8.4,0.8-12.8,1.1
c-0.5,0.1-1.2,0.1-1.8,0.1c-0.7,0-1.4,0.1-1.9,0.3c-1.2,0.4-1.8,1-1.8,1.6c0,1.5,1.1,2.9,3.7,4.2c0.4,0.4,1.1,0.5,2,0.8s2,0.4,3,0.4
c1.1,0,2,0,3.1-0.3l3.8-0.4c1-0.1,2-0.3,3-0.4l2.2-0.4c0,3.9,0.1,8.1,0.4,12.5l0.4,12.8L55.8,59c0,3.4,0.1,6.1,0.1,7.6
c0,1.1-0.1,2.4-0.3,3.9c-0.3,1.8-0.4,3.3-1,4.9c-0.5,1.6-1.1,3.1-2,4.2c-0.8,1.1-2.2,1.8-3.7,1.8c-1.1,0-2.2-0.3-3.1-0.8
c-1.4-0.7-2.6-1.5-3.8-2.6c-1.5-1.2-3-2.6-4.2-4.1c-1.6-1.6-3-3.4-4.1-5.4c-0.8-1.2-1.6-2.6-2.2-3.9c-0.8-1.5-1.1-2.7-1.1-3.7
c0-0.5,0.3-1.1,0.7-1.8c0.4-0.7,0.8-1.2,1.2-1.8l0.8-0.8l0.4-0.7v-0.7c0-0.4-0.1-0.8-0.4-1.1c-0.3-0.5-0.7-1-1.1-1.4
c-0.5-0.4-1.1-0.8-1.6-1.1c-0.7-0.3-1.4-0.4-2-0.4c-2.3,0-3.9,1-5,2.6c-1.1,1.8-1.6,3.8-1.6,5.8c0,1.1,0.1,2.2,0.5,3.1
c0.3,1.2,0.8,2.4,1.4,3.7c0.4,1.4,1,2.6,1.8,3.8c0.7,1.2,1.2,2.3,1.8,3c2.6,3.7,4.9,6.4,7.3,8.3c2.3,2,4.3,3.7,6.2,4.6
c1.8,1.1,3.4,1.8,4.8,2c1,0.1,1.8,0.3,2.7,0.4c3.3,0,6-0.5,8.1-1.9c2-1.1,3.8-2.9,5-4.8c1.2-2.2,2-4.5,2.6-6.9
c0.4-2.6,0.7-5.2,0.7-7.6c0-3.3-0.1-7.1-0.1-11.3L64,43l-0.3-12.1c-0.1-3.8-0.1-6.9-0.1-9.8c1,0,1.9-0.1,2.9-0.3
c0.7,0,1.4-0.1,2-0.1l2-0.3c0.8,0,1.5-0.1,2.3-0.4c1.2-0.1,2.4-0.5,3.5-1.1C77.6,18.8,78.3,18.2,78.3,17.1L78.3,17.1z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" id="NexT" width="512" height="512" x="0" y="0" enable-background="new 0 0 512 512" version="1.1" viewBox="0 0 512 512" xml:space="preserve"><metadata id="metadata3390"/><path style="fill:#222;fill-opacity:1" id="path3384" d="M 256.4,25.8 56.4,141.3 56,371.5 255.6,486.2 455.6,370.7 456,140.5 Z m 92.6,328.8 -18.4,10.7 -18.6,-11 0,0 -112,-142.3 0,142.6 -18.4,10.7 -18.6,-11 0,-197 18.5,-10.6 18.5,10.8 0,0 112,144.5 0,-144.6 18.5,-10.6 18.5,10.8 z"/></svg>

After

Width:  |  Height:  |  Size: 534 B

+6
View File
@@ -0,0 +1,6 @@
---
title: tags
date: 2020-11-24 21:23:17
type: tags
comments: false
---