异或门和同或门
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 41 课,共 90 课。
本课将介绍另外两种逻辑门:XOR(异或)和 XNOR(同或)。这些逻辑门可用于比较位和检查奇偶性。
XOR 门
当输入不同时,XOR 门会输出1。
真值表(2 输入):
| a | b | out |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Verilog 门原语:
xor(out, a, b);等效的连续赋值:
assign out = a ^ b;XNOR 门
当输入相同时,XNOR 门会输出 1。它与 XOR 相反。
真值表(2 输入):
| a | b | out |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Verilog 门原语:
xnor(out, a, b);等效的连续赋值:
assign out = a ~^ b; // 或 ~(a ^ b)多个输入
XOR 和 XNOR 门可以有多于 2 个输入。输出为:
- XOR:如果有奇数个输入为 1,则输出 1
- XNOR:如果有偶数个输入为 1,则输出 1
xor(out, a, b, c); // 3 输入异或门
xnor(out, p, q, r, s); // 4 输入同或门示例(3 输入 XOR):
| a | b | c | out |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 0 |
| 1 | 1 | 1 | 1 |
常见用途
| 用途 | 示例 |
|---|---|
| 比较两个位是否不同 | xor(diff, a, b) |
| 比较两个位是否相同 | xnor(same, a, b) |
| 生成奇偶校验位(1 的数量为奇数) | xor(parity, data[0], data[1], data[2], data[3]) |
| 检查奇偶校验(1 的数量为偶数) | xnor(parity, data[0], data[1], data[2], data[3]) |
代码示例
module xor_xnor_demo (
input a, b,
output xor_out,
output xnor_out
);
xor(xor_out, a, b);
xnor(xnor_out, a, b);
endmodule汇总表
| 逻辑门 | 输出为 1 的条件 | 原语 | 运算符 |
|---|---|---|---|
| XOR | 输入不同 | xor(out, a, b) | ^ |
| XNOR | 输入相同 | xnor(out, a, b) | ~^ |
挑战
根据任务添加缺失的门原语。
要做什么:
- 创建一个 XOR 门,输出为
xor_result,输入为x和y - 创建一个 XNOR 门,输出为
xnor_result,输入为x和y
亲手试试
module xor_xnor_challenge (
input x,
input y,
output xor_result,
output xnor_result
);
// TODO: 添加 XOR 门(xor_result = x ^ y)
// TODO: 添加 XNOR 门(xnor_result = x ~^ y)
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器