FPGA笔记[2]-拨码开关控制LED灯

news/2024/11/17 21:35:51/文章来源:https://www.cnblogs.com/qsbye/p/18200003

摘要

使用四个拨码开关的异或逻辑亮灯控制LED灯亮灭.

关键信息

  • 系统macOS 14.4.1,Apple Silicon M2
  • 开发板:Sipeed-Tang-Primer-20k
  • FPGA芯片:GW2A-LV18PG256C8/I7(GW2A-18C-PBGA256)
  • 工具链:YosysHQ/oss-cad-suite

原理简介

LUT4简介

[https://wiki.sipeed.com/hardware/zh/tang/tang-primer-20k/examples/xor_led_on.html]
Tang Primer 20K 的主控芯片 GW2A-LV18PG256C8/I7 内部基本逻辑单元为 LUT4。LUT 即为查找表(Look-Up-Table),本质上就是一个 RAM。它将数据事先写入 RAM 后,每个输入信号就相当于目标内容地址,找出地址对应的内容,然后输出。LUT4 指的是 4 个输入信号的查找表。
如下代码中,我们恰好 使用4 个输入和 1 个输出。所以使用 1 个 lut4 就够了。

实现

文件结构

key.v
build.sh
tangprimer20k.cst

核心代码

key.v

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

(tips:VSCODE中cst文件默认可能会使用Lushy Code打开,右键文件可以选择以文本编辑器打开文件)
tangprimer20k.cst

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;

build.sh

export PATH=$PATH:/Applications/oss-cad-suite/bin
NAME="key"
yosys -p "read_verilog key.v; synth_gowin -json $NAME.json"
# 通过设置设备名、CST文件和刚才生成的 JSON 文件来生成 FPGA 布局和布线信息,并且放入 test_led_pnr.json 中。
nextpnr-gowin --device GW2A-LV18PG256C8/I7 --cst tangprimer20k.cst --json $NAME.json --write test_${NAME}_pnr.json
# 生成码流
gowin_pack -d "GW2A-18" -o $NAME.fs test_${NAME}_pnr.json
# 烧录
openFPGALoader -b tangprimer20k $NAME.fs

构建

chmod +x ./build.sh
./build.sh

输出:

2.30. Printing statistics.=== xor_led_on ===Number of wires:                  4Number of wire bits:             10Number of public wires:           4Number of public wire bits:      10Number of ports:                  2Number of port bits:              5Number of memories:               0Number of memory bits:            0Number of processes:              0Number of cells:                  6IBUF                            4LUT4                            1OBUF                            12.31. Executing CHECK pass (checking for obvious problems).
Checking module xor_led_on...
Found and reported 0 problems.2.32. Executing JSON backend.End of script. Logfile hash: 711b6756e0, CPU: user 0.23s system 0.02s
Yosys 0.41+69 (git sha1 07ac4c2fa, aarch64-apple-darwin21.4-clang++ 14.0.0-1ubuntu1.1 -fPIC -Os)
Time spent: 29% 19x read_verilog (0 sec), 13% 1x abc9_exe (0 sec), ...
Info: Series:GW2A-18 Device:GW2A-18 Package:PBGA256 Speed:C8/I7Info: Packing constants..
Info: Packing Shadow RAM..
Info: Packing GSR..
Info: No GSR in the chip base
Info: Packing IOs..
Info: Packing diff IOs..
Info: Packing IO logic..
Info: Packing wide LUTs..
Info: Packing LUT5s..
Info: Packing LUT6s..
Info: Packing LUT7s..
Info: Packing LUT8s..
Info: Packing ALUs..
Info: Packing LUT-FFs..
Info: Packing non-LUT FFs..
Info: Packing PLLs..
Info: Checksum: 0x7495f0c9Info: Device utilisation:
Info:                    VCC:       1/      1   100%
Info:                  SLICE:       1/  20736     0%
Info:                    IOB:       5/    383     1%
Info:                IOLOGIC:       0/    408     0%
Info:              MUX2_LUT5:       0/  10368     0%
Info:              MUX2_LUT6:       0/   5184     0%
Info:              MUX2_LUT7:       0/   2592     0%
Info:              MUX2_LUT8:       0/   2544     0%
Info:                    GND:       1/      1   100%
Info:                   RAMW:       0/    648     0%
Info:                    OSC:       0/      1     0%
Info:                   rPLL:       0/      4     0%Info: Placed 5 cells based on constraints.
Info: Creating initial analytic placement for 1 cells, random placement wirelen = 192.
Info:     at initial placer iter 0, wirelen = 181
Info:     at initial placer iter 1, wirelen = 161
Info:     at initial placer iter 2, wirelen = 150
Info:     at initial placer iter 3, wirelen = 150
Info: Running main analytical placer, max placement attempts per cell = 10000.
Info:     at iteration #1, type SLICE: wirelen solved = 150, spread = 150, legal = 150; time = 0.00s
Info: HeAP Placer Time: 0.01s
Info:   of which solving equations: 0.00s
Info:   of which spreading cells: 0.00s
Info:   of which strict legalisation: 0.00sInfo: Running simulated annealing placer for refinement.
Info:   at iteration #1: temp = 0.000000, timing cost = 0, wirelen = 150
Info:   at iteration #2: temp = 0.000000, timing cost = 0, wirelen = 149 
Info: SA placement time 0.00sInfo: No Fmax available; no interior timing paths found in design.
Info: Checksum: 0x586e3d35Info: Routing..
Info: Setting up routing queue.
Info: Routing 5 arcs.
Info:            |   (re-)routed arcs  |   delta    | remaining|       time spent     |
Info:    IterCnt |  w/ripup   wo/ripup |  w/r  wo/r |      arcs| batch(sec) total(sec)|
Info:          5 |        0          5 |    0     5 |         0|       0.01       0.01|
Info: Routing complete.
Info: Router1 time 0.01s
Info: Checksum: 0x35124c9cInfo: Critical path report for cross-domain path '<async>' -> '<async>':
Info: curr total
Info:  0.0  0.0  Source dip_switch_IBUF_I_3$iob.O
Info:  6.5  6.5    Net dip_switch_IBUF_I_O[3] (0,37) -> (45,44)
Info:                Sink led_OBUF_O_I_LUT4_F_LC.D
Info:                Defined in:
Info:                  /Applications/oss-cad-suite/libexec/../share/yosys/gowin/cells_map.v:130.20-130.21
Info:  0.4  6.8  Source led_OBUF_O_I_LUT4_F_LC.F
Info:  3.0  9.9    Net led_OBUF_O_I (45,44) -> (55,31)
Info:                Sink led_OBUF_O$iob.I
Info: 0.4 ns logic, 9.5 ns routingInfo: No Fmax available; no interior timing paths found in design.Info: Program finished normally.
empty
Jtag frequency : requested 6.00MHz   -> real 6.00MHz  
Parse file Parse key.fs: 
Done
DONE
Load SRAM: [==================================================] 100.00%
Done
DONE

效果

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

偶数个开关拨下 奇数个开关拨下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/708558.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32f103c8t6 HAL库更改中断向量表(app部分)

打开HAL库工程的system_stm32f1xx.c文件 /* 注意:以下向量表地址必须与链接器一致定义配置。*//*!< 如果需要重新定位向量表,请取消注释以下行 在 Flash 或 Sram 中的任何位置,否则向量表将保持在自动状态 重新映射选择的启动地址 *//* #define USER_VECT_TAB_…

向web服务器下载文件

web服务器向客户端发送文件 Web服务器读取一个文件的二进制数据,把这组二进制数据发送个客户端,服务器发送给客户端的HTML文档的本质也是二进制。客户端使用以下代码读文件 response = urllib.request.urlopen(url + "?" + urllib.parse.quote(fileName)) data = …

Delphi TMSMQTT使用笔记

服务端用的是 mosquitto ,下载地址https://mosquitto.org/download/ 安装完成后需要配置 找到安装目录:mosquitto.conf,打开后修改 allow_anonymous false(禁止匿名登录),password_file D:\Program Files\mosquitto\pwfile.example(密码存放位置) 创建新用户,安装目录…

沪锡

沪锡要想牛市 必须要突破这里286700 要不然就是ABC反弹结束了。 小周期 反弹还有最后一个3-5 然后迎来回调 然后等待看是什么级别的回调。

产业园区开发运营及盈利模式分析

摘 要:产业园区一般由政府或企业开发建设,是区域经济和产业发展的重要空间载体,具有显著的资源集聚能力和产业规模效益,承担着产业要素集聚、新型产业培育、经济高质量发展和新型城镇化建设等重要使命。然而,当前国内部分产业园区因前期开发投入规模大、后期招商及运营管理…

使用Github Actions + Watchtower 实现项目CI/CD

使用Github Actions + Watchtower 实现项目CI/CD 前言 对于我们这种个人开发者,将程序部署在服务器上一般都是通过宝塔部署来确保服务能够一直存活,但是对于一个经常改来改去的项目,这是一个非常头疼的事情,需要重复地本地编译-->打开宝塔-->输入账号密码(甚至安全模…

Atcoder 题目选做(三)

Atcoder 题目选做(三)(20/20)推荐阅读:#5、#7、#11、#13、#15、#18、#19\(\text{By DaiRuiChen007}\)1. [ARC152E] Xor Annihilation Problem Link给 \(2^n-1\) 个动点,权值为 \(1\sim 2^n-1\) 的排列,对于每个点,设其左右两边所有点权异或和分别为 \(L,R\),那么他会向…

铁矿石 短线

周初要关注893一线阻力 ABC调整结构会出现 30分钟周期:

简单纯粹

如何做到极致的简单纯粹 2024.5.16-5.172024.5.17

.Net6 web API (Log日志)

前言 需要给项目打上日志 可以查询哪里的信息下面是步骤注意:不能允许没有任何监控的系统上线 如何监控---日志记录 需要日志信息的持久化-保存到文件中,保存到数据库中; 11.11og4net日志记录 1、Nuget引l入程序包Log4net+Microsoft.Extensions.Logging.Log4Net.AspNetcore …

给github新增讨论功能

给github新增讨论功能给github新增讨论功能 giscus讨论功能说明 https://giscus.app/zh-CN giscus GitHub https://github.com/giscus/giscus/blob/main/README.zh-CN.md网站:http://shibowl.topgithub:https://github.com/hanbinjxnc博客园:https://www.cnblogs.com/hool 博…