diff --git a/docs/Computer Science/Algorithm/03 Trees.md b/docs/Computer Science/Algorithm/03 Trees.md index a2693c8..39b6cc5 100644 --- a/docs/Computer Science/Algorithm/03 Trees.md +++ b/docs/Computer Science/Algorithm/03 Trees.md @@ -163,5 +163,3 @@ typedef struct TreeNode { 你需要在循环里边手动建一个堆栈来模仿系统堆栈的行为,想想都觉得受不了,消停写你的递归版得了。 ## 3.2 Binary Search Trees - -blinksmoblinkblinkphapphasd \ No newline at end of file diff --git a/docs/Computer Science/System/CSAPP.md b/docs/Computer Science/System/CSAPP.md index f116bd2..1d45de6 100644 --- a/docs/Computer Science/System/CSAPP.md +++ b/docs/Computer Science/System/CSAPP.md @@ -66,6 +66,12 @@ $$S=\frac{1}{1-\alpha}.$$ 接下来,我们将上述四个布尔运算推广到**位向量/Bit vectors**的运算,所谓位向量就是固定长度$w$,由`0`与`1`组成的串。所谓的推广也非常简单,就是将上述四个布尔运算应用到位向量的每一位上,得到的结果也是一个位向量。换句话说,就是我们在C语言中学的按位运算。 +### 2.1.9 Shift Operations in C + +C语言提供了一组移位运算,右移有两种,算数右移与逻辑右移,算数右移在左侧补上**最高位有效值/符号位**,逻辑右移在左侧补上**0**。左移就简单的多,就是在右侧补上**0**。 + +为什么会有两种右移呢?因为两种右移对应着两种不同的数据类型的计算:算数右移对应的是有符号数的计算,逻辑右移对应的是无符号数的计算,这在下面会讲到。 + ### 2.2 Integer Representations #### 2.2.1 Unsigned Encodings @@ -97,9 +103,10 @@ $$B2T_w(\vec{x}) = -x_{w-1}2^{w-1}+\sum_{i=0}^{w-2}x_i2^i.$$ - 补码的范围是**不对称**的,负数的范围比整数的范围大1,也就是说编码的最小值$TMin$没有与之对应的整数。 - 最大的无符号数值刚刚好比最大值的两倍多一点点$UMax_w=2TMax_w+1$。补码的负数的位模式在无符号表示中都变成了比原补码整数大的正数。 -> 在C库中的`limits.h`中定义了一些常用的整数的最大值与最小值,用来限制编译器运行的不同整型数据的取值范围,例如`INT_MAX`、`INT_MIN`、`UINT_MAX`等。 -> -> 在C库中的`stdint.h`中定义了一些固定大小的整数类型,例如`int8_t`、`uint8_t`、`int16_t`、`uint16_t`等,这些类型很好地提升了程序的可移植性。 +??? note "C库里的整数类型" + 在C库中的`limits.h`中定义了一些常用的整数的最大值与最小值,用来限制编译器运行的不同整型数据的取值范围,例如`INT_MAX`、`INT_MIN`、`UINT_MAX`等。 + + 在C库中的`stdint.h`中定义了一些固定大小的整数类型,例如`int8_t`、`uint8_t`、`int16_t`、`uint16_t`等,这些类型很好地提升了程序的可移植性。 有符号数还有下面两种其他的表示方法: @@ -113,6 +120,11 @@ $$B2S_w(\vec{x}) = (-1)^{x_w-1}\cdot\left(\sum_{i=0}^{w-2}x_i2^i\right).$$ 这两种编码方式都有统一的缺点:对于数字`0`,有两种完全不同的表示方法,并且这两种编码不能很好地支持算数运算,因而,我们现在开始使用更加方便的补码编码。 +??? note "Numbers to Memory" + 对于32位的整型,下面的几个数还是很重要的:`UMax=4294967295`,`TMax=2147483647`,`TMin=-2147483648`。 + + 另外,`TMin`被定义为`-TMax-1`而不是`-2147483648`,这是因为`-2147483648`在C语言中是对`2147483648`取负号,而`2147483648`超出了32位正整型的范围,所以只好用`-TMax-1`来表示。 + ### 2.3 Integer Arithmetic #### 2.3.1 Unsigned Addition diff --git a/docs/Computer Science/System/Verilog.md b/docs/Computer Science/System/Verilog.md index bae3e06..df37737 100644 --- a/docs/Computer Science/System/Verilog.md +++ b/docs/Computer Science/System/Verilog.md @@ -11,6 +11,12 @@ Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。Verilog HDL提供了编程语言接口,通过这个接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 +### 1.3 数字电路 + +根据逻辑电路的不同特点,数字电路可以分为**组合逻辑**和**时序逻辑**。其中: + +- 组合逻辑的特点是在任意时刻,模块的**输出仅仅取决于此时刻的输入**,与电路原本的状态无关。电路逻辑中不牵涉边沿信号的处理,也没有记忆性。 +- 时序逻辑的特点是在任意时刻,模块的输出不仅取决于此时刻的输入,而且**还和电路原来的状态有关**。电路里面有存储元件用于保存信息。**一般仅当时钟的边沿到达时**,电路内部存储的信息才有可能发生变化。 ```Verilog module main( @@ -30,26 +36,28 @@ module main( ### 2.1 数值系统 -Verilog这种硬件描述语言都基于基本的硬件逻辑之上,因此Verilog具有一套独特的基于电平逻辑的数值系统,使用下面四种基本数值表示电平逻辑: +Verilog 这种硬件描述语言都基于基本的硬件逻辑之上,因此 Verilog 具有一套独特的基于电平逻辑的数值系统,使用下面四种基本数值表示电平逻辑: -- 0:表示低电平或者False; -- 1:表示高电平或者True; +- 0:表示低电平或者 False; +- 1:表示高电平或者 True; - X:表示电平未知,实际情况可能是高电平或者低电平,甚至都不是; - Z:表示高阻态,这种情况就是来源于信号没有驱动. -我们还经常用到整数,可以**简单使用十进制表示**,也可以使用**立即数**表示,基于如下的基数规则表示:`'`,其中``表示二进制位宽,空缺不填就会根据后边的数值自动分配;``表示进制,``可以是b/o/d/h,分别是二进制,八进制,十进制以及十六进制;``表示数值,插入下划线`_`可以有效提升可读性。 +我们还经常用到整数,可以**简单使用十进制表示**,也可以使用**立即数**表示,基于如下的基数规则表示:`'`,其中 `` 表示二进制位宽,空缺不填就会根据后边的数值自动分配;`` 表示进制, `` 可以是 b/o/d/h,分别是二进制,八进制,十进制以及十六进制;`` 表示数值,插入下划线 `_` 可以有效提升可读性。 ### 2.2 标识符与变量类型 -- **wire** - 用于声明线网型数据。wire本质上对应着一根没有任何其他逻辑的导线,仅仅将输入自身的信号原封不动地传递到输出端。该类型数据用来表示以assign语句内赋值的组合逻辑信号,其默认初始值是 Z(高阻态)。 +- **`wire`** + 用于声明线网型数据。`wire` 本质上对应着一根没有任何其他逻辑的导线,仅仅将输入自身的信号原封不动地传递到输出端。该类型数据用来表示以 `assign` 语句内赋值的组合逻辑信号,其默认初始值是 Z(高阻态)。 + + `wire` 是 Verilog 的默认数据类型。也就是说,对于没有显式声明类型的信号,Verilog 一律将其默认为 `wire` 类型。 - wire是Verilog的默认数据类型。也就是说,对于没有显式声明类型的信号,Verilog一律将其默认为wire类型。 +- **`reg`** + 用于声明在 `always` 语句内部进行赋值操作的信号。一般而言,`reg` 型变量对应着一种存储单元,其默认初始值是 X(未知状态)。为了避免可能的错误,凡是在 `always` 语句内部被赋值的信号,都应该被定义成 `reg` 类型。 -- **reg** - 用于声明在`always`语句内部进行赋值操作的信号。一般而言,reg型变量对应着一种存储单元,其默认初始值是x(未知状态)。为了避免可能的错误,凡是在`always`语句内部被赋值的信号,都应该被定义成reg类型。 + 如果 `always` 描述的是组合逻辑,那么 `reg` 就会综合成一根线,如果 `always` 描述的是时序逻辑,那么 `reg` 才会综合成一个寄存器。 -### 运算符 +### 2.3 运算符 按位运算符: @@ -57,11 +65,28 @@ Verilog这种硬件描述语言都基于基本的硬件逻辑之上,因此Veri - `|`:按位或; - `^`:按位异或; - `~`:按位取反; -- `~^`或者`^~`:按位同或; -- **Note**:如果运算符的两个操作数位宽不相等,则利用0向左扩展补充较短的操作数. +- `~^` 或者 `^~`:按位同或; +- **Note**:如果运算符的两个操作数位宽不相等,则利用 0 向左扩展补充较短的操作数. 算数运算符: +### 2.4 Verilog 语句 + +#### 2.4.1 连续赋值 `assign` + +#### 2.4.2 过程赋值 `always`/`initial` + +除了直接使用信号作为敏感变量,Verilog 还支持通过使用 `posedge` 和 `negedge` 关键字将电平变化作为敏感变量。其中 `posedge` 对应上升沿,`negedge` 对应下降沿。我们将电平从低电平变成高电平的时刻称为**上升沿**,从高电平变为低电平的时刻称为**下降沿**. + +#### 2.4.3 阻塞赋值与非阻塞赋值 + +- 阻塞赋值 + + 阻塞赋值是顺序执行的,即下一条语句执行前,当前语句一定会执行完毕。这与 C 语言的赋值思想是一致的。阻塞赋值语句使用等号 = 作为赋值符。 + +- 非阻塞赋值 + + 非阻塞赋值属于并行执行语句,即下一条语句的执行和当前语句的执行是同时进行的,它不会阻塞位于同一个语句块中后面语句的执行。非阻塞赋值语句使用小于等于号 <= 作为赋值符。 @@ -161,7 +186,7 @@ if-else 必须在always块中使用,并且输出必须是reg类型。但是在 output wire g, output wire p ); - + assign a = LE | ( data[0] & data[1] & ~data[2] & data[3] | data[0] & ~data[1] & data[2] & data[3] | ~data[0] & ~data[1] & data[2] & ~data[3] | diff --git a/docs/css/custom.css b/docs/css/custom.css index a0fcd77..c8bb55c 100644 --- a/docs/css/custom.css +++ b/docs/css/custom.css @@ -1,11 +1,23 @@ -/* :root { +:root { --md-text-font: "LXGW WenKai Screen", "JetBrains Mono"; - } */ - + --md-code-font: 'Monaspace Argon Light', 'LXGW WenKai Screen'; + } + .md-typeset code, + .md-typeset kbd, + .md-typeset pre { + font-feature-settings: "ss01", 'ss02', 'ss03', 'ss04', 'ss05', 'ss06', 'ss07', "ss08", "calt", "dlig"; + font-variant-ligatures: normal; + } + /* p, li { font-family: "Times New Roman", "Songti SC"; font-weight: 600; } */ + /* p code, + li code { + font-family: 'Monaspace Argon Light', 'LXGW WenKai Screen'; + src: url('MonaspaceArgon-Light.woff'); + } */ .md-nav__link { zoom: 105% } diff --git a/mkdocs.yml b/mkdocs.yml index a3f56d9..834d654 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -22,9 +22,9 @@ theme: - search.share - search.highlight # 搜索出的文章关键词加入高亮 - search.suggest # 搜索输入一些字母时推荐补全整个单词 - font: - text: LXGW WenKai Screen - code: [JetBrains Mono, LXGW WenKai Screen] + # font: + # text: LXGW WenKai Screen + # code: [Monaspace Argon Light, JetBrains Mono, LXGW WenKai Screen] palette: # - scheme: default - media: "(prefers-color-scheme: light)"