===================
== lxulxu's blog ==
===================
Hello there

Y2025Q2 影视音总结

生活

🎬MOVIES

FPGA设计流程与EDA工具架构解析——以Vivado为例

eda Xilinx

FPGA设计流程概览

FPGA设计遵循一个由上至下的流程,主要包括以下阶段:

  1. 功能设计/RTL:使用HDL(Verilog/VHDL)编写代码,进行功能仿真验证
  2. 逻辑综合:RTL转换为门级网表,进行逻辑优化
  3. 物理设计:包括布局(确定各单元具体位置)和布线(实现单元间互连)
  4. 物理验证:设计规则检查、时序分析、功耗评估
  5. 比特流生成:生成FPGA配置文件
  6. 硬件配置与调试:将设计烧录到FPGA并进行系统测试

一个典型的Vivado项目管理tcl脚本示例:

 1# 创建并配置项目
 2create_project myproject ./myproject -part xc7a100tcsg324-1
 3
 4# 添加设计文件
 5add_files -fileset sources_1 ./src/design/
 6add_files -fileset constrs_1 ./src/constraints/
 7
 8# 设置顶层模块
 9set_property top top_module [current_fileset]
10
11# 创建综合运行
12create_run …
Read more...

Y2025Q1 影视音总结

生活

🎬MOVIES

DFX中的关键概念与规则

xilinx DFX

1. 基础概念与术语

1.1 动态重配置的定义

​ Dynamic Function eXchange(DFX,也称为动态部分重配置)是一种在FPGA运行时动态修改其部分功能区域的技术。DFX可以在FPGA继续运行时,让用户更改芯片预定义区域的功能,而不影响其他区域的正常运行。相比传统的全局配置方式,DFX具有以下优势:

  • 节省硬件成本:可以通过时分复用的方式在同一个区域切换不同功能
  • 支持实时更新:无需停止系统运行即可更新部分功能
  • 提升系统灵活性:可以根据需要动态调整功能
  • 减少配置时间:部分配置比完整配置速度更快

​ FPGA 设计中的逻辑分为两种不同类型:可重配置逻辑和静态逻辑。静态逻辑在运行期间保持正常工作,不受加载部分比特流的影响。可重配置逻辑则会被部分比特流的内容替换。

DFX Basic Concept

​ 如上图所示,通过下载任一部分比特流文件(A1.bit、A2.bit、A3.bit 或A4.bit)即可修改重配置块 A 中实现的功能。标记为"FPGA"的区域表示静态逻辑,标记为"重配置块 A"的区域表示可重配置逻辑。

1.2 …

Read more...

Y2024Q4 影视音总结

生活

🎬MOVIES

Tcl C API 概览(一)

tcl

解释器管理

解释器是Tcl的核心概念。这部分API用于创建、删除和管理Tcl解释器。

Tcl_CreateInterp

功能: 创建一个新的Tcl解释器

语法: Tcl_Interp *Tcl_CreateInterp(void)

返回值: 新创建的解释器的指针

说明:

  • 创建一个新的Tcl解释器实例
  • 必须使用Tcl_DeleteInterp释放

示例:

1Tcl_Interp *interp = Tcl_CreateInterp();
2if (interp == NULL) {
3    // 处理错误
4}

Tcl_DeleteInterp

功能: 删除Tcl解释器

语法: void Tcl_DeleteInterp(Tcl_Interp *interp)

参数:

  • interp: 要删除的解释器

说明:

  • 释放与解释器相关的所有资源
  • 调用所有已注册的退出处理程序

示例:

1Tcl_DeleteInterp(interp);

Tcl_InterpDeleted

功能: 检查解释器是否已被删除

语法: int Tcl_InterpDeleted(Tcl_Interp …

Read more...

C++中的push_back与emplace_back

c++

1. 引言

C++标准库提供了push_backemplace_back两种向容器末尾添加元素的方法。本文将深入分析这两个函数的区别、使用场景,以及在实际应用中的性能考虑。

2. 基本概念

2.1 push_back push_back有两个重载版本:

1void push_back(const T& value);
2void push_back(T&& value);

第一个版本复制元素,第二个版本移动元素。

2.2 emplace_back emplace_back是C++11引入的变参模板函数:

1template <class... Args>
2void emplace_back(Args&&... args);

它直接在容器中构造对象,参数被完美转发给元素的构造函数。

3. 主要区别

  1. 构造方式push_back需要预先构造的对象,emplace_back在容器内构造对象。
  2. 参数传递push_back接受对象,emplace_back接受构造函数参数。
  3. 效率emplace_back可能避免不必要的临时对象创建和复 …
Read more...

Y2024Q3 影视音总结

生活

🎬MOVIES

Y2024Q2 影视音总结

生活

🎬MOVIES

C++安全指南

c++

编程习惯

  • switch中应有default
  • 不应在debug或错误信息中提供过多内容
  • 不应该在客户端代码中硬编码对称加密秘钥
1    // Bad
2    char g_aes_key[] = {...};
3    void Foo() {
4      ....
5      AES_func(g_aes_key, input_data, output_data);
6    }
1    // Good
2    char* g_aes_key;
3    void Foo() {
4      ....
5      AES_encrypt(g_aes_key, input_data, output_data);
6    }
7    void Init() {
8      g_aes_key = get_key_from_https(user_id, ...);
9    }
  • 函数不可以返回栈上的变量的地址,而应当使用堆来传递非简单类型变量,强烈建议返回 string、vector 等类型。
1    // Bad
2    char* Foo(char* …
Read more...
1 of 2 Next Page