异或逻辑亮灯

更新历史
日期 版本 作者 更新内容
2022-10-11 v0.1 wonder
  • 初次编辑

原理

异或逻辑介绍

异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。
其运算法则为:$$C = A\oplus B = (\overline{A}\cdot B) | (A\cdot \overline{B}) $$

真值表为:

变量 A 0 0 1 1
变量 B 0 1 0 1
结果 B 0 1 1 0

在 verilog 中,可以使用 ^ 来表示异或运算,所以可以写成$$C = A\oplus B = A\wedge B $$

同理容易算出,四个信号的异或运算结果如下:

$$E = A\oplus B\oplus C\oplus D = A\wedge B \wedge C\wedge D= (((A\wedge B )\wedge C)\wedge D)$$

根据两项输入的运算方式来计算四项输入运算方法,不难得出以下真值表结果:

变量 A 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
变量 B 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
变量 C 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
变量 D 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
结果 E 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0

拨码开关说明

Tang Primer 20K DOCK 底板配备有一个 5P 的拨码开关。其中一号拨码开关被设计成核心板卡使能位;剩下四个拨码开关用于用户自定义编程功能。

拨码开关原理图 拨码开关与 FPGA 连接引脚图
dip_switch dip_switch_pin

从上图 原理图 可以知道,拨码开关连通时对应 FPGA 引脚为高电平输入。

将拨码开关四个角均作输入信号,并将其异或运算,得出一位结果。最终拨码开关状态与输出信号如下表:

开关 2 1 1 1 1 1 1 1 1
开关 3 1 1 1 1 1 1 1 1
开关 4 1 1 1 1 1 1 1 1
开关 5 1 1 1 1 1 1 1 1
输出结果 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0

上表中,开关那一行中的空白表示开关断开,1 表示开关拨下。

板载 LED 说明

根据 LED 电路,可以知道当 FPGA 引脚为低电平的时候对应连接的 LED 会亮起来。

板载自定义 LED 电路原理图 板载自定义 LED 与 FPGA 连接引脚图
key_schematic key_pin

这里选择 LED0 作为结果引脚来验证代码现象。

操作

引脚复用

  • DONE

端口和引脚

Port Direction Location
dip_switch[2] input E9
dip_switch[3] input E8
dip_switch[4] output T4
dip_switch[5] output T5
led[0] output C13

代码

xor_led_on.v xor_led_on.cst

Verilog文件;
定义了 4 个拨码开关输入端口,和 1 个 LED 输出端口。根据拨码开关输入的状态,异或运算后输出到对应的端口。

module xor_led_on(
  input [5:2] dip_switch,
  output led
);
  assign led = dip_switch[5] ^ dip_switch[4] ^dip_switch[3] ^ dip_switch[2] ;
endmodule

物理约束文件;
将 verilog 代码里的端口绑定到 FPGA 引脚上面

IO_LOC "led" C13;
IO_LOC "dip_switch[5]" T5;
IO_LOC "dip_switch[4]" T4;
IO_LOC "dip_switch[3]" E8;
IO_LOC "dip_switch[2]" E9;
IO_PORT "led" PULL_MODE=UP DRIVE=8;
IO_PORT "dip_switch[5]" PULL_MODE=DOWN;
IO_PORT "dip_switch[4]" PULL_MODE=DOWN;
IO_PORT "dip_switch[3]" PULL_MODE=DOWN;
IO_PORT "dip_switch[2]" PULL_MODE=DOWN;

效果

四个拨码开关 2、3、4、5 位有奇数个开关拨下是;LED0 熄灭,偶数个开关拨下时,LED0 点亮。

补充说明

在高云 IDE 中,我们可以看到自己代码综合后所消耗芯片资源数量以及占比。

used_resource

从这里面可以看到这次编写的代码消耗量 1 个 LUT,5 个 IO。

对于 CLS 的解释可以查看高云半导体官方文档 UG288 中的第二章。

Tang Primer 20K 的主控芯片 GW2A-LV18PG256C8/I7 内部基本逻辑单元为 LUT4。LUT 即为查找表(Look-Up-Table),本质上就是一个 RAM。它将数据事先写入 RAM 后,每个输入信号就相当于目标内容地址,找出地址对应的内容,然后输出。LUT4 指的是 4 个输入信号的查找表。其简单解释图如下:

这里用一个4输入与门为例

本地代码中,我们恰好 4 个输入和 1 个输出。所以使用 1 个 lut4 就够了。

相关问题

烧录代码后拨动拨码开关 LED 状态没有改变

这是因为拨码开关引脚上拉了,自己将物理约束文件 (.cst) 文件里面的 PULL_MODE=UP 改成 PULL_MODE=DOWN

返回上一页(Back)