Tang Primer 20K 译码器亮灯

更新历史
日期 版本 作者 更新内容
2022-09-30 v0.1 wonder
  • 初稿

说明

本例程使用 Dock 底板上的 S0、S1 按键,和 LED0、LED1、LED2、LED3 四个 LED 灯。

使用两个按键来控制 4 个LED灯的状态,进行的操作与对应的结果如下:

按键 LED 状态 真值表达式
S0 S1 LED0 LED1 LED2 LED3
$$ LED0 = S0\cdot S1 $$
按下 $$ LED1 = \overline{S0}\cdot S1 $$
按下 $$ LED2 = S0\cdot \overline{S1} $$
按下 按下 $$ LED3 = \overline{S0}\cdot \overline{S1} $$

从前面的 按键亮灯 已知:当 FPGA 与 LED 所连接的引脚为低电平时,对应的 LED 灯会亮;按下按键,对应的 FPGA 引脚为低电平状态。

上面那个表格的输出是以 1 为结果,为了根据原理图来点灯,需要将上面的真值表结果取反来实现最终的效果:

按键 LED 电平状态 真值表达式
S0 S1 LED0 LED1 LED2 LED3
0 $$ LED0= \overline{S0\cdot S1} $$
0 0 $$ LED1 = \overline{\overline{S0}\cdot S1} $$
0 0 $$ LED2 = \overline{S0\cdot \overline{S1}} $$
0 0 0 $$ LED3 = \overline{\overline{S0}\cdot \overline{S1}} = S0 | S1 $$

操作

引脚复用

  • READY
  • DONE
  • SSPI

端口和引脚

Port Direction Location
key[0] input T10
key[1] input T3
led[0] output C13
led[1] output A13
led[2] output N16
led[3] output N14

代码

decode_led_on.v decode_led_on.cst

Verilog文件;
定义了两个按键输入端口,和四个输出端口。根据按键输入的状态,译码输出到对应的端口。

module decode_led_on(
    input  [1:0] key,
    output [3:0] led
);
    assign led[0] = !( key[0] & key[1] ) ;
    assign led[1] = !(!key[0] & key[1] ) ;
    assign led[2] = !( key[0] &!key[1] ) ;
    assign led[3] =  ( key[0] | key[1] ) ;
endmodule

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

IO_LOC "led[3]" N14;
IO_LOC "led[2]" N16;
IO_LOC "led[1]" A13;
IO_LOC "led[0]" C13;
IO_LOC "key[1]" T3;
IO_LOC "key[0]" T10;
IO_PORT "led[3]" PULL_MODE=UP DRIVE=8;
IO_PORT "led[2]" PULL_MODE=UP DRIVE=8;
IO_PORT "led[1]" PULL_MODE=UP DRIVE=8;
IO_PORT "led[0]" PULL_MODE=UP DRIVE=8;
IO_PORT "key[1]" PULL_MODE=UP;
IO_PORT "key[0]" PULL_MODE=UP;

效果

默认只有 LED0 亮;按下 S0 按键 LED1 亮;按下 S1 按键 LED1 亮;按下 S0 和 S2 按键 LED3 亮;

按键 LED 状态
S0 S1 LED0 LED1 LED2 LED3
按下
按下
按下 按下

返回上一页(Back)