【LiteX】【开发板】【BoChenK7】使用Python开发FPGA【SDRAM/DDR/Bootloader】

news2024/9/21 14:47:36

目录

  • 开发板介绍
  • 下载仓库
  • 工程设计
    • 代码实现
  • 工程构建
    • 启动测试
    • Memory测速
    • Bootloader(裸机BareMetal程序)
    • Bootloader(Linux OS)
  • 开发板信息

开发板介绍

手头目前只有一个购买的BoChenK7开发板,后续会用它来进行LiteX FPGA SoC的构建
测试可能会包括:

  • LED:【LiteX】【开发板】【BoChenK7】使用Python开发FPGA【Hello World、LED点灯、Memory测速、替换BIOS】
  • DDR:本篇文章
  • QSPI Flash
  • SD Card
  • Ethernet以太网
  • HDMI视频输入输出
  • PCIe
  • Linux

下载仓库

LiteX有一个生态库叫做litex-boards,里面包含了上百种开发板(比如Xilinx、Digilent等品牌)
若是你手中有现成的开发板,可以直接使用litex-boards仓库:https://github.com/litex-hub/litex-boards
而我目前手头的是BoChenK7开发板我自己作了一个litex-boards-vacajk仓库:https://github.com/vacajk/litex-boards-vacajk

BoChenK7开发板在Python代码中的名称为:bochen_kintex7_base
litex-boards-vacajk仓库依赖LiteX开发环境,环境搭建方法可以跳转:【LiteX】使用Python实现FPGA SoC构建的开源工具

# 激活conda环境
conda activate <your conda env name>
# 进入litex环境目录
cd ~/Study/litex/env/litex
# 下载仓库
git clone git@github.com:vacajk/litex-boards-vacajk.git
# 安装仓库
cd litex-boards-vacajk
pip install --editable .

工程设计

bochen_kintex7_base开发板的基础配置文件:litex-boards-vacajk/litex_boards_vacajk/targets/bochen_kintex7_base.py
这次我们需要开启如下配置:

  • --with-sdram

代码实现

源码:litex-boards-vacajk/litex_boards_vacajk/platforms/bochen_kintex7_base.py

  • IO管脚约束
  • DDR DCI_CASCADE约束
# _io = [
# DDR3 SDRAM
	("ddram", 0,
	    Subsignal("a", Pins(
	        "AF8 AB10 V9  Y7   AC9 W8 Y11 V8",
	        "AA8 AC11 AD9 AA10 AF9 V7 Y8"),
	        IOStandard("SSTL15")),
	    Subsignal("ba",    Pins("AA7 AB11 AF7"), IOStandard("SSTL15")),
	    Subsignal("ras_n", Pins("AD8"), IOStandard("SSTL15")),
	    Subsignal("cas_n", Pins("W10"), IOStandard("SSTL15")),
	    Subsignal("we_n",  Pins("W9"),  IOStandard("SSTL15")),
	    Subsignal("cs_n",  Pins("AB7"), IOStandard("SSTL15")),
	    Subsignal("dm", Pins("AF15 AA15 AB19 V14"),
	        IOStandard("SSTL15")),
	    Subsignal("dq", Pins(
	        "AF14 AF17 AE15 AE17 AD16 AF20 AD15 AF19",
	        "AB15 AC14 AA18 AA14 AB16 AB14 AA17 AD14",
	        "AD19 AC19 AD18 AA19 AC17 AA20 AC18 AB17",
	        "Y17  V16  V17  W14  V18  W15  V19  W16"),
	        IOStandard("SSTL15_T_DCI")),
	    Subsignal("dqs_p", Pins("AE18 Y15 AD20 W18"),
	        IOStandard("DIFF_SSTL15")),
	    Subsignal("dqs_n", Pins("AF18 Y16 AE20 W19"),
	        IOStandard("DIFF_SSTL15")),
	    Subsignal("clk_p", Pins("AA9"),  IOStandard("DIFF_SSTL15")),
	    Subsignal("clk_n", Pins("AB9"),  IOStandard("DIFF_SSTL15")),
	    Subsignal("cke",   Pins("AF10"), IOStandard("SSTL15")),
	    Subsignal("odt",   Pins("AC8"),  IOStandard("SSTL15")),
	    Subsignal("reset_n", Pins("Y10"), IOStandard("LVCMOS15")),
	    Misc("SLEW=FAST"),
	    Misc("VCCAUX_IO=HIGH")
	),
# class Platform(Xilinx7SeriesPlatform):
#   def do_finalize(self, fragment):
		self.add_platform_command("set_property DCI_CASCADE {{32}} [get_iobanks 33]")

源码:litex-boards-vacajk/litex_boards_vacajk/targets/bochen_kintex7_base.py

  • SDRAM需要4倍于系统时钟频率的时钟
    • SoC及总线运行在100MHz
    • SDRAM的bitrate为800Mbps(DDR数据,需要800/2=400MHz的时钟)
  • 添加DDR3 PHY:s7ddrphy.K7DDRPHY
  • 添加SDRAM模块:self.add_sdram
# class _CRG(LiteXModule):
	if with_sdram:
	     self.cd_sys4x  = ClockDomain()
	     pll.create_clkout(self.cd_sys4x,  4*sys_clk_freq)
# class BaseSoC(SoCCore):
	# DDR3 SDRAM -------------------------------------------------------------------------------
	if with_sdram and not self.integrated_main_ram_size:
	    self.ddrphy = s7ddrphy.K7DDRPHY(platform.request("ddram"),
	        memtype      = "DDR3",
	        nphases      = 4,
	        sys_clk_freq = sys_clk_freq)
	    self.add_sdram("sdram",
	        phy           = self.ddrphy,
	        module        = MT41K256M16(sys_clk_freq, "1:4"),
	        l2_cache_size = kwargs.get("l2_size", 8192),
	    )

工程构建

# 加载vivado开发环境
$ source ~/Xilinx/Vitis/2021.1/settings64.sh
# 找一个工程目录(如果使用python -m的方法,在哪里运行都无所谓)
$ cd ~/Study/litex/env/litex-boards-vacajk/litex_boards_vacajk
# 编译BIOS、综合、布局、布线、生成bitstream
$ python -m litex_boards_vacajk.targets.bochen_kintex7_base --with-sdram --build

启动测试

连接JTAG(USB)、UART(USB)、电源(USB)到BoChenK7开发板

# 查看USB转串口设备名
$ ls /dev/ttyUSB*
/dev/ttyUSB0
# +x属性到USB转串口设备
$ sudo chmod +x /dev/ttyUSB0

提前打开新的BASH Shell,使用litex_term打开串口监听

# BASH B
$ cd ~/Study/litex/env/litex-boards-vacajk/litex_boards_vacajk
$ litex_term /dev/ttyUSB0

打开litex_term后,再进行FPGA bitstream下载

# BASH A
$ cd ~/Study/litex/env/litex-boards-vacajk/litex_boards_vacajk
$ python -m litex_boards_vacajk.targets.bochen_kintex7_base --with-sdram --load

查看BASH B中的litex_term命令行

        __   _ __      _  __
       / /  (_) /____ | |/_/
      / /__/ / __/ -_)>  <
     /____/_/\__/\__/_/|_|
   Build your hardware, easily!

 (c) Copyright 2012-2024 Enjoy-Digital
 (c) Copyright 2007-2015 M-Labs

 BIOS built on Aug 17 2024 21:40:22
 BIOS CRC passed (be79585d)

 LiteX git sha1: 35498b468

--=============== SoC ==================--
CPU:		VexRiscv @ 100MHz
BUS:		wishbone 32-bit @ 4GiB
CSR:		32-bit data
ROM:		128.0KiB
SRAM:		8.0KiB
L2:		8.0KiB
SDRAM:		1.0GiB 32-bit @ 800MT/s (CL-6 CWL-5)
MAIN-RAM:	1.0GiB

--========== Initialization ============--
Initializing SDRAM @0x40000000...
Switching SDRAM to software control.
Write leveling:
  tCK equivalent taps: 32
  Cmd/Clk scan (0-16)
  |1111111111100000| best: 0
  Setting Cmd/Clk delay to 0 taps.
  Data scan:
  m0: |000000001111111111111111| delay: 08
  m1: |000000001111111111111111| delay: 08
  m2: |000000000001111111111111| delay: 11
  m3: |000000000011111111111111| delay: 10
Write latency calibration:
m0:0 m1:0 m2:0 m3:0 
Write DQ-DQS training:
m0: |011111111111111100000000000000000| delays: 07+-06
m1: |011111111111111100000000000000000| delays: 07+-06
m2: |000011111111111111100000000000000| delays: 10+-06
m3: |000111111111111111000000000000000| delays: 09+-06
Read leveling:
  m0, b00: |00000000000000000000000000000000| delays: -
  m0, b01: |00011111111111111000000000000000| delays: 09+-06
  m0, b02: |00000000000000000000111111111111| delays: 25+-05
  m0, b03: |00000000000000000000000000000000| delays: -
  m0, b04: |00000000000000000000000000000000| delays: -
  m0, b05: |00000000000000000000000000000000| delays: -
  m0, b06: |00000000000000000000000000000000| delays: -
  m0, b07: |00000000000000000000000000000000| delays: -
  best: m0, b01 delays: 09+-06
......
  best: m3, b01 delays: 08+-07
Switching SDRAM to hardware control.
Memtest at 0x40000000 (2.0MiB)...
  Write: 0x40000000-0x40200000 2.0MiB     
   Read: 0x40000000-0x40200000 2.0MiB     
Memtest OK
Memspeed at 0x40000000 (Sequential, 2.0MiB)...
  Write speed: 58.2MiB/s
   Read speed: 62.4MiB/s

--============== Boot ==================--
Booting from serial...
Press Q or ESC to abort boot completely.
sL5DdSMmkekro
Timeout
No boot medium found

--============= Console ================--

litex> 

可以看到BIOS启动时:

  • 驱动对SDRAM进行了初始化(包括了各种IO delay训练)
  • 初始化完成后将SDRAM的控制权交给了硬件
  • 对SDRAM进行了读写速度测试
    • 写:58.2MB/s
    • 读:62.4MB/s

Memory测速

litex> help
sdram_mr_write           - Write SDRAM Mode Register
sdram_force_bitslip      - Force write leveling Bitslip
sdram_rst_bitslip        - Reset write leveling Bitslip
sdram_force_dat_delay    - Force write leveling Dat delay
sdram_rst_dat_delay      - Reset write leveling Dat delay
sdram_cal                - Calibrate SDRAM
sdram_test               - Test SDRAM
sdram_init               - Initialize SDRAM (Init + Calibration)
sdram_force_cmd_delay    - Force write leveling Cmd delay
sdram_rst_cmd_delay      - Reset write leveling Cmd delay
sdram_force_wrphase      - Force write phase
sdram_force_rdphase      - Force read phase

litex> mem_list
Available memory regions:
ROM       0x00000000 0x20000 
SRAM      0x10000000 0x2000 
MAIN_RAM  0x40000000 0x40000000 
CSR       0xf0000000 0x10000

litex> sdram_test
Memtest at 0x40000000 (32.0MiB)...
  Write: 0x40000000-0x42000000 32.0MiB    
   Read: 0x40000000-0x42000000 32.0MiB    
Memtest OK

litex> mem_speed 0x40000000 0x20000
Memspeed at 0x40000000 (Sequential, 128.0KiB)...
  Write speed: 58.1MiB/s
   Read speed: 59.4MiB/s

Bootloader(裸机BareMetal程序)

编译demo程序

# --build-path=build/bochen_kintex7_base:指向编译目录,该文件夹中包含了gateware和software子目录
$ cd ~/Study/litex/env/litex-boards-vacajk/litex_boards_vacajk
$ litex_bare_metal_demo --build-path=build/bochen_kintex7_base

提前打开新的BASH Shell,使用litex_term打开串口监听,并指定bootloader需要下载的二阶段启动程序demo.bin

# BASH B
$ cd ~/Study/litex/env/litex-boards-vacajk/litex_boards_vacajk
# --kernel <kernel image>:可以是bare metal程序,也可以是Linux的uboot
$ litex_term /dev/ttyUSB0 --kernel demo.bin

打开litex_term后,再进行FPGA bitstream下载

# BASH A
$ cd ~/Study/litex/env/litex-boards-vacajk/litex_boards_vacajk
$ python -m litex_boards_vacajk.targets.bochen_kintex7_base --load

在BASH B中查看demo.bin的加载和运行

--============== Boot ==================--
Booting from serial...
Press Q or ESC to abort boot completely.
sL5DdSMmkekro
[LITEX-TERM] Received firmware download request from the device.
[LITEX-TERM] Uploading demo.bin to 0x40000000 (7556 bytes)...
[LITEX-TERM] Upload calibration... (inter-frame: 10.00us, length: 64)
[LITEX-TERM] Upload complete (9.8KB/s).
[LITEX-TERM] Booting the device.
[LITEX-TERM] Done.
Executing booted program at 0x40000000

--============= Liftoff! ===============--

LiteX minimal demo app built Aug 17 2024 21:59:56

Available commands:
help               - Show this command
reboot             - Reboot CPU
led                - Led demo
donut              - Spinning Donut demo
helloc             - Hello C
litex-demo-app> helloc
Hello C demo...
C: Hello, world!
litex-demo-app> led
Led demo...
Counter mode...
Shift mode...
Dance mode...
litex-demo-app> donut
Donut demo...                                                                  
                                       $$@@@@@@@$                              
                                   ##########$$$$@@@$                          
                                ##**!!!!!!!!**###$$$$$$#                       
                              ***!!!;;;==;=!=!!**##$$$$$$*                     
                             **!===;;::~:::;;==!**####$$$#*                    
                            !!!=;;:~-,,.,--::;==!**########*                   
                           !!!!=;:-,......,-~:;=!!***######*!                  
                          !!*!==:~-,........-:;=!!!**######*!                  
                          !**!!=;:~,...    .,~;==!!****##***!=                 
                         ;!*#####*!=.      -:;==!!!********!==                 
                         ;!##$$$$$$#!-    :;===!!!*******!!!=;                 
                         :=*#$$@@@@$$#*=====!!!!!*****!*!!!=;                  
                          =!*#$$@@@@$$#***!!!!!!!***!!!!!!=;:                  
                          :=!*##$$$$$##*******!!!!!!!!!!==;:                   
                           :=!***######******!!!!!!!!===;;:                    
                            :=!!!!********!!!!!!!!===;;::-                     
                             -:==!!=!!!!!!!!!=====;;;::~,                      
                               ,::;;========;=;;;:::~-.                        
                                 .,~~:::::::::~~~-,.                           
litex-demo-app>

在命令行中我们可以看到:

  • BIOS启动
  • 初始化SDRAM
  • 对SRAM和SDRAM进行了读写测试
  • 从串口加载Kernel程序
  • 从SDRAM启动demo.bin程序
  • 手动输入命令对demo程序进行了测试,包括:
    • helloc
    • led
    • donut

Bootloader(Linux OS)

TODO:待补充

开发板信息

BoChenK7开发板的接口如下图,还是比较丰富的
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

政务大数据解决方案(九)

政务大数据解决方案旨在通过构建高效的数据处理与分析系统&#xff0c;全面整合政府各部门数据资源&#xff0c;运用尖端技术进行深入挖掘与智能分析&#xff0c;为政府决策提供科学、精准的数据支撑&#xff0c;优化政策制定与执行流程&#xff0c;同时通过加强数据安全与隐私…

基于Kotlin Multiplatform实现静态文件服务器(一)

本文将介绍如何基于Kotlin Multiplatform、Jetpack Compose实现静态文件服务器&#xff0c;并运行在Android、Windows以及Linux&#xff08;暂不支持server和mac&#xff09;。 创建KMP&#xff08;Kotlin Multiplatform&#xff09;项目 环境设置 安装Android Studiio 2023.…

Java二十三种设计模式-迭代子模式(16/23)

迭代器模式&#xff1a;顺序访问集合的稳健方式 引言 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许顺序访问一个集合对象中的各个元素&#xff0c;而不需要暴露集合的底层表示。 基础知识&#xff0c;java设计模式总体来说设计…

ESP32-C3在MQTT访问时出现“transport_base: Poll timeout or error”问题的分析(1)

笔者最近在测试时,突然遇到了以下错误: 网上看过一些帖子,要么就是只提出遇到了相同问题,但没有解答。如:transport_base: Poll timeout or error, errno=Connection already in progress - ESP32 Forum 要么就是和本问题类似,但不完全相同的问题。如: TRANSPORT_BASE:…

Tomcat学习进阶

目录 Apache Tomcat架构配置线程模型Tomcat 的类加载机制类加载器层次结构类加载流程 Tomcat 的优化策略Tomcat 的集群部署Tomcat故障排查 Apache Tomcat 架构配置 Apache Tomcat是一个开源的Java Servlet容器和Web服务器&#xff0c;它实现了Java EE规范中的Servlet和JSP API。…

mysql中的innodb存储结构

什么是InnoDB存储引擎 InnoDB是MySQL的默认存储引擎&#xff0c;它是一个事务安全的存储引擎&#xff0c;支持行级锁定和外键约束。InnoDB为MySQL提供了高性能、高可靠性和高可用性的解决方案。 InnoDB 的核心特点和功能 事务支持&#xff1a;InnoDB支持ACID事务特性&#x…

[算法题]【模板】前缀和/【模板】二维前缀和

题目链接: 【模板】前缀和 / 【模板】二维前缀和 两道前缀和模板题. 【模板】前缀和: 定义一维前缀和数组: presum[i]: 表示 1 - i 位置的和 状态转移方程: presum[i] presum[i - 1] arr[i - 1] 定义数组时多开一个位置, 下标位置从 1 开始计算, 不从 0 开始是为了避免越界…

我眼中的胶水工作:挑战与机遇并存

我眼中的胶水工作&#xff1a;挑战与机遇并存 胶水工作&#xff0c;看似不起眼&#xff0c;却如同团队运作的隐形脉络&#xff0c;起着至关重要的连接作用。它涵盖了各种各样的任务&#xff0c;从注意到团队成员的阻碍并伸出援手&#xff0c;到审查设计文档&#xff0c;再到新…

实现微信的订阅消息或模板消息API来实现实时通知(服务通知)

实现微信的订阅消息或模板消息API以实现实时通知&#xff0c;需要经过几个关键步骤&#xff0c;包括用户订阅、消息发送和接收消息事件。以下是具体实现流程&#xff1a; 1. 用户订阅消息 首先&#xff0c;需要让用户订阅消息。这通常通过前端代码触发一个授权请求来完成&am…

C:每日一题:字符串左旋

题目&#xff1a;实现一个函数&#xff0c;可以实现字符串的左旋 例如&#xff1a;ABCD左旋一个字符就是BCDA&#xff1b;ABCD左旋两个字符就是CDAB&#xff1b; 1、解题思路&#xff1a; 1.确定目标旋转k个字符&#xff0c;我们要获取字符串的长度 len&#xff0c;目的是根…

8.14 day bug

bug1 好家伙&#xff0c;折腾一个小时没通过&#xff0c;原来是代码写多了 // 定义初始状态 const defaultState {login: false };// 定义 reducer const reducer (state defaultState, action) > {if (action.typeLOGIN) {// 当接收到 LOGIN action 时&#xff0c;更新…

备战秋招60天算法挑战,Day20

题目链接&#xff1a; https://leetcode.cn/problems/reverse-bits/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1W2421Z7bi/ LeetCode 190.颠倒二进制位 题目描述 颠倒给定的 32 位无符号整数的二进制位。 举个例子&#xff1a; 输入&#xff1a;n 00000010…

Nginx--简介、安装、常用命令和配置文件

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Nginx简介 1、nginx介绍 Nginx (engine x) 是一个高性能的 HTTP 和 反向代理 服务&#xff0c;也是一个IMAP/POP3/SMTP服务。因它的稳定性、丰…

分布式锁实现方案--redis、zookeeper、mysql

分布式锁的几种实现方式 悲观锁和乐观锁分布式锁的实现要求 -- 互斥性、避免死锁、可重入性、高可用行、性能互斥-只能有一个客户端持有锁 -- redis setnx避免死锁引入过期时间 -- redis ttl锁过期问题 -- 自动续期 -- redis释放别人锁问题 -- 锁附加唯一性 -- 给每个客户端设置…

【嵌入式linux开发】智能家居入门6:最新ONENET,物联网开放平台(QT、微信小程序、MQTT协议、ONENET云平台、旭日x3派)

智能家居入门6&#xff1a;最新ONENET物联网开放平台 前言最终现象一、ONENET云平台创建产品与设备二、使用MQTT客户端软件测试2.1 测试前的准备2.2 测试 三、LInux QT代码四、onenet 云端API介绍及微信小程序代码4.1 onenet API介绍4.2 微信小程序代码 五、板端运行 前言 ONE…

LeetCode 热题100-24

回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff…

四层负载企业实战

通过四层负载LVSkeepalived将请求转发到nginx代理服务器。通过代理服务器访问后端真实应用服务。 拓补图&#xff1a; 准备环境6台机器&#xff1b; lvskeepalived---两台 nginx代理 ---两台 tomcat----一台 php ----一台 所有机器关闭防火墙和selinux 所有机器解析如下…

APP安全检测报告内容详解

一、APP安全检测的必要性 APP安全检测是确保移动应用安全的重要一环。在开发过程中&#xff0c;由于技术、人员和管理等方面的原因&#xff0c;APP可能存在各种安全漏洞和风险。这些漏洞一旦被黑客利用&#xff0c;可能导致用户数据泄露、恶意代码注入、应用被篡改等严重后果。…

Windows下使用QT5.14.2编译MySQL8.0对应的最新64位驱动程序步骤

不得不说mysql更新的速度是真的快&#xff0c;最近一两年都更新了好几个的小版本了。如果安装了高版本的 mysql软件&#xff0c;低版本的驱动就不支持了&#xff0c;因此需要重新使用QT来编译对应的mysql驱动。具体办法如下&#xff1a; 1、官网下载最新的mysql8.0安装包。下载…

day04--js的综合案例

1.1 商品全选 需求&#xff1a;商品全选 1. 全选 &#xff1a;点击全选按钮,所有复选框都被选中 2. 全不选 &#xff1a;点击全不选按钮,所有复选框都被取消选中 3. 反选 &#xff1a; 点击反选按钮,所有复选框状态取反 <!DOCTYPE html> <html lang"en">…