当前位置: 首页 > news >正文

FPGA基础 -- Verilog 数据流建模

一、数据流建模概念简介(初级)

1. 什么是数据流建模?

数据流建模是一种 使用并行赋值语句(assign)来表达布尔逻辑或组合逻辑行为 的建模方式。它强调 信号之间的逻辑数据依赖关系,而不明确指定信号何时更新(不使用时钟)。

特点:

  • 面向组合逻辑,不依赖时钟;
  • 高度抽象,更关注表达式而非行为顺序;
  • 使用 assign 语句进行建模。

2. 基础语法

assign y = a & b;
assign z = (a | b) & c;

上面两个 assign 就是数据流建模风格 —— 描述信号之间的数据关系


3. 与其他建模方式对比

建模方式应用场景语法关键字侧重点
数据流建模组合逻辑assign表达逻辑关系
行为建模时序逻辑或控制流程always, if, case行为过程控制
结构建模结构层次化系统instantiation模块连接构建

二、常用数据流表达方式(中级)

1. 组合逻辑表达式

assign out = (~a & b) | (a & ~b);  // XOR

2. 优化常用逻辑结构

优先编码器(4选1)
assign out = d[3] ? 2'b11 :d[2] ? 2'b10 :d[1] ? 2'b01 :d[0] ? 2'b00 : 2'bxx;
译码器(2 to 4 decoder)
assign y = (sel == 2'b00) ? 4'b0001 :(sel == 2'b01) ? 4'b0010 :(sel == 2'b10) ? 4'b0100 :(sel == 2'b11) ? 4'b1000 : 4'b0000;
加法器(1 位加法器)
assign sum  = a ^ b ^ cin;
assign cout = (a & b) | (cin & (a ^ b));

3. 运用 generate 优化可扩展结构(适合中级)

genvar i;
generatefor(i=0; i<8; i=i+1) begin : gen_xorassign out[i] = in1[i] ^ in2[i];end
endgenerate

这是在结构上批量生成 assign,配合数据流建模更有可扩展性。


三、深入工程级建模技巧(高级)

1. 使用数据流实现条件控制

assign y = sel ? a : b;  // 相当于 mux

注意:该写法等效于:

always @(*) beginif (sel)y = a;elsey = b;
end

但数据流更为精炼、高效,适用于简单逻辑条件分支。


2. 与综合工具的协同

数据流描述方式更容易让综合工具(如 Vivado、Quartus)进行 逻辑优化与资源折叠,特别在:

  • 减少 LUT 使用;
  • 加快组合路径;
  • 自动组合约束分析。

3. 常见坑位与陷阱

问题类型示例分析
赋值环路assign a = b; assign b = a;会形成非法环路,综合失败
多驱动冲突多个 assign 同时驱动一个 wire不可综合
表达式过复杂一行表达多个条件判断和算术时序路径太长,影响时序收敛
条件优先级不清晰三目表达式嵌套过深建议改写为多个分支或行为建模方式

四、配套仿真验证建议

建议:

  • 使用 Testbenchassign 逻辑输出进行覆盖率测试;
  • 利用 assertmonitor 验证边界条件;
  • 搭配 GTKWave 查看组合输出稳定时间。

五、实践项目建议(进阶应用)

  1. 实现一个 8 位加减法器(带符号)
  2. 实现一个带优先级的多路选择器(Mux)
  3. 构建组合滤波模块(如中值滤波)
  4. 结合 Vivado Schematic View 观察 assign 合成后的门级结构
http://www.dtcms.com/a/254095.html

相关文章:

  • WPF入门 #1 WPF布局基础、WPF样式基础、WPF控件模板、WPF数据模板
  • Python笔记1
  • 影刀rpa-3步获取社区信息
  • Dify动手实战教程(入门-猜病、哄哄模拟器)
  • singlefligt使用方法和源码解读
  • MySQL 索引和select优化
  • vuex中的辅助函数怎样使用
  • P7 QT项目----会学天气预报
  • 初识树及二叉树
  • 18.字符串函数
  • 【Redis】持久化机制:RDB / AOF 的应用与场景
  • 48-Oracle CDB下的SID-实例名-服务名
  • LVS+Keepliaved高可用群集
  • 【web应用】Vue 3 中实现 Chart.js 柱状图:详细指南
  • 【Leetcode】每日一题 —— No.2966
  • new()和new[]有什么区别?
  • 12.8Java Swing 中的MVC
  • MySQL 类型转换与加密函数深度解析
  • 【AI Study】第四天,Pandas(1)- 基础知识
  • 《仿盒马》app开发技术分享-- 订单结合优惠券结算(60)
  • 【Python打卡Day22】kaggle泰坦尼克@浙大疏锦行
  • 黑马点评,请求被取消,首页店铺类型和blog列表无法正常展示
  • Spring MVC 处理静态资源请求 - ResourceHandler
  • Python多态的简单分享
  • HarmonyOS性能优化——感知流畅优化
  • C++ 第一阶段 基本语法 - 第一节:变量与数据类型详解
  • 19.数学函数
  • eps8266作为AP服务端 esp32c3作为STA客户端
  • LVS +Keepalived 高可用群集
  • 稀疏大模型架构与训练算法研究