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

FPGA程序设计

  • 在设计FPGA时,多运用模块化的思想取设计模块,将某一功能设计成module。

  • 设计之前要先画一下模块设计图,列出输入输出接口,再进一步设计内部功能。

  • 状态机要画图,确定每个状态和状态之间怎么切换。状态用localparam定义。

  • 顶层向下传递的要定义为wire,底层向上传递的要定义为reg。

  • 根据时序将每一个时钟周期进行按步分解。对于通讯协议要对每条线仔细分析。

  • 每个模块要用一个tb测试

  • testbench例子

    always #10 Clk = ~Clk;initial beginClk = 1;Rst_n = 0;Cmd = 6'b000000;Go = 0;Tx_DATA = 8'd0;#2001;Rst_n = 1;#2000;//写数据操作,往EEPROM器件的B1地址写数据DA//第一次:起始位+EEPROM器件地址(7位)+写方向(1位)Cmd = STA | WR;Go = 1;Tx_DATA = 8'hA0 | 8'd0;//写方向@ (posedge Clk);#1;Go = 0;@ (posedge Trans_Done);#200;//第二次:写8位EEPROM的寄存器地址Cmd = WR;Go = 1;Tx_DATA = 8'hB1;//写地址B1@ (posedge Clk);#1;Go = 0;@ (posedge Trans_Done);#200;//第三次:写8位数据 + 停止位Cmd = WR | STO;Go = 1;Tx_DATA = 8'hda;//写数据DA@ (posedge Clk);#1;Go = 0;@ (posedge Trans_Done);#200;#5000000; //仿真模型的两次操作时间间隔//读数据操作,从EEPROM器件的B1地址读数据//第一次:起始位+EEPROM器件地址(7位)+写方向(1位)Cmd = STA | WR;Go = 1;Tx_DATA = 8'hA0 | 8'd0;//写方向@ (posedge Clk);#1;Go = 0;@ (posedge Trans_Done);#200;//第二次:写8位EEPROM的寄存器地址Cmd = WR;Go = 1;Tx_DATA = 8'hB1;//写地址B1@ (posedge Clk);#1;Go = 0;@ (posedge Trans_Done);#200;//第三次:起始位+EEPROM器件地址(7位)+读方向(1位)Cmd = STA | WR;Go = 1;Tx_DATA = 8'hA0 | 8'd1;//读方向@ (posedge Clk);#1;Go = 0;@ (posedge Trans_Done);#200;//第四次:读8位数据 + 停止位Cmd = RD | STO;Go = 1;@ (posedge Clk);#1;Go = 0;@ (posedge Trans_Done);#200;#2000;$stop;end
  • 每个模块要建立一个testbench

  • 时钟分频

   	//系统时钟采用50MHzparameter SYS_CLOCK = 50_000_000;//SCL总线时钟采用400kHzparameter SCL_CLOCK = 400_000;//产生时钟SCL计数器最大值localparam SCL_CNT_M = SYS_CLOCK/SCL_CLOCK/4 - 1;reg [19:0]div_cnt;reg en_div_cnt;always@(posedge Clk or negedge Rst_n)if(!Rst_n)div_cnt <= 20'd0;else if(en_div_cnt)beginif(div_cnt < SCL_CNT_M)div_cnt <= div_cnt + 1'b1;elsediv_cnt <= 0;endelsediv_cnt <= 0;wire sclk_plus = div_cnt == SCL_CNT_M;
  • 串转并

reg[7:0]Rx_DATA;
Rx_DATA <= {Rx_DATA[6:0],i2c_sdat};
  • 命令可以选择使用独热码编码

localparam
IDLE = 7'b0000001, //空闲状态
GEN_STA = 7'b0000010, //产生起始信号
WR_DATA = 7'b0000100, //写数据状态
RD_DATA = 7'b0001000, //读数据状态
CHECK_ACK = 7'b0010000, //检测应答状态
GEN_ACK = 7'b0100000, //产生应答状态
GEN_STO = 7'b1000000; //产生停止信号
  • 亚稳态

跨时钟域信号传输;异步信号采集;复位电路。

在FPGA系统中,如果数据传输中不满足触发器的Tsu和Th不满足,或者复位过程中复位信号的释放相对于有效时钟沿的恢复时间(recovery time)不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端在0和1之间处于振荡状态,而不是等于数据输入端D的值。这段时间称为决断时间(resolution time)。经过resolution time之后Q端将稳定到0或1上,但是稳定到0或者1,是随机的,与输入没有必然的关系。

异步信号采集

always@(posedge clk or posedge reset)if(reset)beginuart_rx_sync1 <= 1'b0;uart_rx_sync2 <= 1'b0;endelse beginuart_rx_sync1 <= uart_rx;uart_rx_sync2 <= uart_rx_sync1;
end

边沿检测

//下降沿检测
always@(posedge clk or posedge reset)
if(reset)beginuart_rx_reg1 <= 1'b0;uart_rx_reg2 <= 1'b0;
end
else beginuart_rx_reg1 <= uart_rx_sync2;uart_rx_reg2 <= uart_rx_reg1;
endassign uart_rx_nedge = !uart_rx_reg1 & uart_rx_reg2;

相关文章:

FPGA程序设计

在设计FPGA时&#xff0c;多运用模块化的思想取设计模块&#xff0c;将某一功能设计成module。 设计之前要先画一下模块设计图&#xff0c;列出输入输出接口&#xff0c;再进一步设计内部功能。 状态机要画图&#xff0c;确定每个状态和状态之间怎么切换。状态用localparam定…...

彻底开源,免费商用,上海AI实验室把大模型门槛打下来

终于&#xff0c;业内迎来了首个全链条大模型开源体系。 大模型领域&#xff0c;有人探索前沿技术&#xff0c;有人在加速落地&#xff0c;也有人正在推动整个社区进步。 就在近日&#xff0c;AI 社区迎来首个统一的全链条贯穿的大模型开源体系。 虽然社区有LLaMA等影响力较大…...

MTEB评估基准使用指北

文章目录 介绍评估数据 介绍 文本嵌入通常是在单一任务的少量数据集上进行评估&#xff0c;这些数据集未涵盖其可能应用于其他任务的情况&#xff0c;不清楚在语义文本相似性&#xff08;semantic textual similarity, STS&#xff09;等任务上的最先进嵌入是否同样适用于聚类或…...

31. 1049. 最后一块石头的重量 II, 494.目标和,474.一和零

class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sum 0;for(int stone : stones) sum stone;int bagSize sum /2;vector<int> dp(bagSize 1, 0);for(int i 0; i < stones.size(); i){ //遍历物品for(int j bagSize; j >…...

PDF 中图表的解析探究

PDF 中图表的解析探究 0. 引言1. 开源方案探究 0. 引言 一直以来&#xff0c;对文档中的图片和表格处理都非常有挑战性。这篇文章记录一下最近工作上在这块的探究。图表分为图片和表格&#xff0c;这篇文章主要记录了对表格的探究。还有&#xff0c;我个人主要做日本项目&…...

递推(C语言)

文章目录 1.斐波那契数列2.太波那契数列3.二维递推问题4.实战4.1 力扣509 斐波那契数4.2 力扣70 爬楼梯4.3 力扣119 杨辉三角|| 递推最通俗的理解就是数列&#xff0c;递推和数列的关系就好比 算法 和 数据结构 的关系&#xff0c;数列有点 像数据结构中的线性表(可以是顺序表&…...

安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片

安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片 复习了下安卓程序的知识&#xff0c;我们会了解到&#xff0c;安卓程序清楚数据的时候有两个选项 一个是清除全部数据一个是清除缓存。 清除全部数据表示清除应用数据缓存。 对于安卓微信8.0之后而言&#xff0…...

ES6 Class(类) 总结(九)

ES6 中的 class 是一种面向对象编程的语法糖&#xff0c;提供了一种简洁的方式来定义对象的结构和行为。 JavaScript 语言中&#xff0c;生成实例对象的传统方法是通过构造函数。下面是一个例子。 function Point(x, y) {this.x x;this.y y; } Point.prototype.toString fu…...

使用 Vue.js 和 Element Plus 实现自动完成搜索功能

使用 Vue.js 和 Element Plus 实现自动完成搜索功能 一、前言1.环境准备2.组件配置3.后端数据请求4.样式5.总结 一、前言 在前端开发中&#xff0c;实现自动完成&#xff08;autocomplete&#xff09;功能可以极大地提升用户体验&#xff0c;特别是在需要用户输入和选择内容的…...

SpringBoot自定义starter

SpringBoot自定义starter 1、SpringBoot之starter机制 1.1、什么是自定义starter ​ SpringBoot中的starter是一种非常重要的机制(自动化配置)&#xff0c;能够抛弃以前繁杂的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#…...

深入探索大语言模型

深入探索大语言模型 引言 大语言模型&#xff08;LLM&#xff09;是现代人工智能领域中最为重要的突破之一。这些模型在自然语言处理&#xff08;NLP&#xff09;任务中展示了惊人的能力&#xff0c;从文本生成到问答系统&#xff0c;无所不包。本文将从多个角度全面介绍大语…...

querylist多线程采集curlMulti时,报错Curl error(60)

前言 在使用querylist多线程采集的时候&#xff0c;报错: Curl error(60)。测试了下用http时没有问题&#xff0c;https时有问题。其原因在于多线程采集库引用的另一个库有问题。需要手动更改。 解决 找到&#xff1a;vendor/ares333/php-curl/src/Curl.php 文件&#xff0c…...

Python数据分析~~美食排行榜

目录 1.模块的导入和路径的选择 2.访问前面五行数据 3.按照条件进行筛选 4.获取店铺评分里面的最高分 5.打印对应的店铺的名字 1.模块的导入和路径的选择 # 导入pandas模块&#xff0c;简称为pd import pandas as pd # 使用read_csv()函数 # TODO 读取路径"/Users/fe…...

Linux下解压.tar.gz文件

.tar.gz 是一种常用的压缩包格式&#xff0c;尤其在Unix、Linux以及macOS系统中非常普遍。这个格式结合了两种不同的功能&#xff1a; Tar (.tar): “Tar” 是“Tape Archive”的缩写&#xff0c;最初是为了将数据备份到磁带上而设计的。Tar命令可以将多个文件和目录打包成一个…...

【电商选品干货】差异化卖点要这样打造,80%商家却做不到

今天就给大家说说&#xff0c;如何去挖掘产品的差异化卖点&#xff1f;我们要找差异化卖点&#xff0c;就是因为我们的产品转化率不足&#xff0c;通常有下面几点原因&#xff1a; 1、产品差异化卖点不足&#xff0c;商家占比30% 2、流量和产品卖点不匹配&#xff0c;商家占比…...

LabVIEW比例压力控制阀自动测试系统

开发了一套基于LabVIEW编程和PLC控制的比例控制阀自动测试系统。该系统能够实现共轨管稳定的超高压供给&#xff0c;自动完成比例压力控制阀的耐久测试、流量滞环测试及压力-流量测试。该系统操作简便&#xff0c;具有高精度和高可靠性&#xff0c;完全满足企业对自动化测试的需…...

运营商认证API在Java、Python、PHP中的使用教程

随着数字化浪潮的推进&#xff0c;实名认证已深入我们生活的方方面面&#xff0c;从线上购物到电子资金转移&#xff0c;手机号已成为注册账号的主要凭证。然而&#xff0c;这也带来了身份验证的难题和手机号被盗用注册账号的风险。在信息爆炸的时代背景下&#xff0c;确保每个…...

用虚拟机,可以在x86的电脑上虚拟出arm的电脑吗

1.用虚拟机&#xff0c;可以在x86的电脑上虚拟出arm的电脑吗 是的&#xff0c;可以在x86的电脑上使用虚拟机技术虚拟出ARM架构的电脑。以下是通过虚拟机实现x86电脑上虚拟ARM电脑的几个关键步骤&#xff1a; 选择合适的虚拟化软件&#xff1a;通常&#xff0c;你可以使用如QE…...

富格林:可信观念摆脱暗箱陷阱

富格林指出&#xff0c;投资者产生的暗箱亏损多半是由于被不可信观念的迷惑影响&#xff0c;以为真的可以毫不费力就能赚钱&#xff0c;最后发现连交易的本金都打水漂了。事实上&#xff0c;投资市场并不像大家想得那么简单。要想安全实现交易成功&#xff0c;避免暗箱陷阱&…...

WEB前端01-HTML5基础(01)

一.WEB相关概念 软件架构 C/S: Client/Server &#xff08;客户端/服务器端&#xff09;&#xff1a;在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程序 优点&#xff1a;用户体验好 缺点&#xff1a;开发、安装&#xff0c;部署&#xff0c;维护麻烦 B/S: Br…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...