What & How & Why

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
cs:comp_n_arch:courses:fnti_i:week_1 [2024/02/17 06:42] – [DMux Gate] codingharecs:comp_n_arch:courses:fnti_i:week_1 [2025/03/28 14:00] (当前版本) – [DMux Gate] codinghare
行 41: 行 41:
 \\ \\  \\ \\ 
 可见逻辑函数可以用函数或真值表的方式来表达。 可见逻辑函数可以用函数或真值表的方式来表达。
-==Boolean Indentites==+==Boolean Identites==
 <code cil> <code cil>
 # Commutative # Commutative
行 305: 行 305:
 a = a[0]; a = a[0];
 </code> </code>
-下边是一个 4bit 按位 AND 的门的实现:+下边是一个 4bit ,对所有输入进行 AND 的门的实现:
 <code nand2tetris-hdl> <code nand2tetris-hdl>
 /* ANDs together all 4 bits of the input*/ /* ANDs together all 4 bits of the input*/
行 354: 行 354:
 IN lsb[8], msb[8]; IN lsb[8], msb[8];
 OUT a[16]; OUT a[16];
 +//specifies the sub range for lsb[8] and msb[8]
 Add16[a[0..7] = lsb, a[8..15] = msb, b=..., out =...); Add16[a[0..7] = lsb, a[8..15] = msb, b=..., out =...);
 +Add16(..., out[0..3]=t1, out[4..15]=t2);
 </code> </code>
 ==buses 的几个惯例== ==buses 的几个惯例==
-sub-buses 输出时,允许基于 output buses 的带宽来进行重叠:+  * sub-buses 输出时,允许输出的 sub-bus 在选择带宽位时有重叠。 
 +  * 内部 pin 的带宽会被自行的推断,比如下面两种情况
 <code nand2tetris-hdl> <code nand2tetris-hdl>
 // 16bits input is truncated in 14bits output // 16bits input is truncated in 14bits output
 Add16(a=Bus1[0..15], b=Bus2[0..15], out[0..14]=out2[0..14]); Add16(a=Bus1[0..15], b=Bus2[0..15], out[0..14]=out2[0..14]);
 </code> </code>
-''true'' 和 ''false'' 代表对应的(1 & 0)任意长度的输入输出: 
-<code nand2tetris-hdl> 
-Add16(a=true, b=false, out=out2); 
-</code> 
-internal pin 的带宽会被自动推断: 
 <code nand2tetris-hdl> <code nand2tetris-hdl>
 // single bit width // single bit width
行 373: 行 371:
 y = lsb[i..j]; y = lsb[i..j];
 </code> </code>
 +  * ''true'' 和 ''false'' 可以对所有的 bits 进行初始值设定(对应 ''0'' 和 ''1''
 +<code nand2tetris-hdl>
 +Add16(a=true, b=false, out=out2);
 +</code>
 +
 <WRAP center round info 100%> <WRAP center round info 100%>
 internal pin 不允许使用下标访问,比如 //y[i]// 是非法的。 internal pin 不允许使用下标访问,比如 //y[i]// 是非法的。
行 397: 行 400:
 {{ :cs:comp_n_arch:courses:fnti_i:mux_imp.svg?600 |}} {{ :cs:comp_n_arch:courses:fnti_i:mux_imp.svg?600 |}}
 $$\texttt{Mux(a, b, sel) = (a And Not(sel)) Or (b And sel)}$$ $$\texttt{Mux(a, b, sel) = (a And Not(sel)) Or (b And sel)}$$
 +<WRAP center round box 100%>
 +这类带开关的逻辑门通常可以用来创建可编程逻辑门(programmable gate)。将不同功能的门接入 ''MUX'' 即可通过 ''sel'' 信号来控制使用不同的逻辑门。</WRAP>
 ==DMux Gate== ==DMux Gate==
   * //Demultiplexor//(Dmux) 是 Mux 的反向操作,可以将单个输入分解为两个输出   * //Demultiplexor//(Dmux) 是 Mux 的反向操作,可以将单个输入分解为两个输出
行 409: 行 414:
 \end{align*} \end{align*}
 \] \]
 +<WRAP center round tip 100%>
 +传输过程中通常使用**单路**的 bit 串进行数字传输。通常传输链路都会非常长(几千公里),如果需要同时输送两组信号源比如(AAAAA... 和 BBBBB...,这种情况下比较经济的做法是将信号进行 ''MUX'',同时将 ''sel'' 设定为周期信号(//oscillator//)。
 +经 ''MUX'' 后的信号会将两组信号源按照 bit 位单位进行交叉输出(比如输出ABABABAB...),然后在接收方通过 ''DMUX'' 以同样的 ''sel''
 +进行分解来得到 A 和 B。
 +</WRAP>
 +
 <WRAP center round box 100%> <WRAP center round box 100%>
-作业中通常涉及到组多路的基础门。这种牵涉到多路的情况一般都是用一个多 bits 的 sel 来控制输出状态。只要搞清楚哪一位 bit 控制的是哪一个层级的 switch 即可。层级可以通过真值表来判断。比如 4 way 的需要用 00 01 10 11 来控制。如果 00 对应 ''a'', 01 对应 ''b''那么其控制层级就为 ''sel[0]''+作业中通常涉及到组多路的基础门。这种牵涉到多路的情况一般都是用一个多 bits 的 sel 来控制输出状态。只要搞清楚哪一位 bit 控制的是哪一个层级的 switch 即可。层级可以通过真值表来判断。比如 4 way 的需要用 00 01 10 11 来控制。如果 00 对应 ''a'', 01 对应 ''b''发生变化的只有 index 0,因此其控制层级就为 ''sel[0]''。\\ \\  
 +另外一点需要注意的是区分多个输入和多个输出的情况: 
 +  * 多个输入的情况,输入的时候需要先通过低层级的选择器筛选,才能将结果交给更高层级的门进行运算 
 +  * 多个输出的情况则完全相反;首先需要从最高层级进行划分,再对 sub-group 进行次层级的选择,以此类推
 </WRAP> </WRAP>