- 博客(53)
- 收藏
- 关注
原创 vivado时钟类型说明
reference clk frequency:参考时钟频率,是指某个接入(pcie、mac等)的采样时钟(就是多个接口共同以一个频率采样)专用时钟:一般是指mac、pcie等使用的时钟,而且这些接口必须使用专用时钟,使用主时钟分频出来的时钟无法工作,因为这种时钟精度不够。差分时钟:指有两个时钟信号共同组成时钟。主时钟:fpga逻辑模块使用的时钟。单端时钟: 一根线的时钟。
2024-07-06 12:51:07
122
原创 vitis 实现一拍完成的方法总结
vitis中常规操作是通过循环获取反复从fifo中读取数据,实现对一个完整数据包的处理,这个的好处是可以做到类似面向对象的作用,比如:一个函数可以处理一个udp包,并把数据包的数据拆解写入fifo,并送往下一个环节。4 循环中延迟一次,这种场景适合在循环中偶尔会出现一次两拍(大多数情况一拍)的场景,比如:中间偶尔需要发送两个包,可以循环继续,但是读取数据可以通过变量控制不读取,这个方法的前提是中金计算过程不需要用到i值。上述方案的确定是不能在综合报告体现出循环执行的次数。5 通过有限状态机控制循环。
2023-11-03 17:39:58
130
原创 在vitis中bit位赋值如何优化到一拍完成
ps:在实现上述功能的时候发现vitis对函数inline是在verilog层次的,就是说它先把c代码编译成verilog在inline,这样导致本来函数在从c到verilog过程中可以优化的地方无法优化了。上述代码通过三步解决了每次数据操作都是整拍的问题,这样后续即使一拍无法完成,也可以流水打拍完成,比如a如果是ram,就可以方便的流水打拍了。/// 1 这块代码的目的是将b中需要用到的数据copy出来,copy两份是为了后面赋值避免冲突。/// 2这块代码的目的是将数据分别放到两个64bit区域。
2023-11-01 19:49:41
156
原创 对硬件编程的一点理解---vitis使用
2 流水内部打拍是指在一个模块内部运行流程周期是M周期,如果需要执行N次,那么总时延是M*N,但是如果流水内部运行流程拆解成多个步骤,每个步骤1拍完成(既拆成M个步骤),然后设计的时候能保证第X步骤生成的中间值在后续步骤使用是不被破坏,就可以每拍启动一次,这样的好处是执行N次的时间是 M+N-1次。三拍后: a[0]=4,b[0]=1,c[0]=1,d=1+1。一拍后: a[0]=1,b[0]=1,c[0]=0,d=0。二拍后: a[0]=1,b[0]=1,c[0]=1,d=0。
2023-10-28 10:18:15
186
原创 位宽的性能问题
使用vitis测试下来,发现位宽影响还是很大的,基本上位宽64,判断分支64要8拍左右,如果想优化到一拍只能做到32*32场景,这种情况可以通过多级的方式来吧。比如是256*256的场景(位宽256,if判断也是256),通过移位的方式优化到32*32*8。
2023-10-26 20:56:47
94
原创 去外地旅游遇到的问题和心得
需要注意的是这种地方一般要进饭店,毕竟这种地方人流量大,走的是量,都不太会追求品质,饭店的味道要差很多,尝尝小摊、面馆什么就可以了。3) 景区内吃饭问题,一般景区内吃饭比外面高2-3倍,而且景区内部由于人流量大,基本也不会精工细作,味道好不到哪里去,所以如果可能,尽量提前带好零食和饭菜,这样技能吃的比较好,也能节省费用。如果因为预算的原因必须要选差一点的酒店,需要认真的筛选下,要看看评价、服务项目(比如免费停车、洗衣服务等),特别是评价非常重要,总的原则是新的比旧的好,大的比小的好。但是需要考虑交通方便。
2023-10-04 12:42:55
394
原创 vitis使用的一点心得
1 在一个for循环中实现两个不相干的逻辑,一般会优化成串行逻辑,这样需要多一倍的时钟,即使是告诉编译器两个逻辑共享参数无关、使用dataflow都不行,这个时候可以看看是否在循环中通过if else两个分支来处理,如果两个不相干的逻辑刚好可以错开执行,if else是不错的选择,编译器很容易会改成并行逻辑。3 array_partition很有用,在有时候需要多个时钟的情况下,很多场景都是因为访问raw的瓶颈导致的,这个时候如果ram不大,可以用array_partition展开。
2023-09-28 14:27:41
257
原创 关于vitis设计的一些心得
2)实现软件代码并验证,根据流程设计实现软件代码并验证功能,这部分主要是检验代码实现 的正确性,用软件的好处是可以快速发现逻辑问题、修改,以及对比验证工具的实现。c 尽可能实现前后逻辑不相关,这样的好处是减少耦合,功能实现相互独立,逻辑电路控制也 比较好做而且时延也不会增加。b 尽可能减少逐级嵌套,避免层次太深,导致组合电路时序不够,原则是有常量或固定参数最 外层,然后逐级代入。4) 将内核整合到工程中,测试功能正确性,并完成版本。
2023-09-06 22:07:04
122
原创 vivado简单工程
6 生成工程,运行implementation,这一步会生成中间文件,为下一步配置io引脚做准备。2)点击layout-->i/o planning,选择引脚配置,这里需要查看用户手册。8 执行generate bitstream,生成硬件文件。5 运行synthesis,目的是检测时序是不是有问题。2 添加source 文件,这里以mut2.v为例。4 运行仿真,目的是检查基本功能有没有问题。3 添加仿真文件,以mux2_tb为例。3) 保存生成IO.xdc时序约束文件。创建vivado工程。
2023-08-25 08:46:30
107
原创 platform相关资料
网上大部分都是创建Platform Project再创建Application Projet,然后在Application Projet里导入平台文件。在Vivado里导出bitstream到工程文件下的VITIS文件夹里(VITIS文件夹是自己创建的,也可以用其他名字)打开Vitis选择VITIS文件夹作为workspace创建application project创建名为helloworld的Appli_vitis怎么打开已有工程。
2023-08-24 16:46:07
110
原创 xlinux 文件类型介绍
2 xpfm:vitis的xrt开发官方标准文件,u50等板卡。3 tcl:硬件描述性语言,基本上硬件工程、功能都用此描述。1 xsa: vitis应用platform文件。
2023-08-23 19:10:29
225
原创 dataflow和pipeline验证情况
基于上述验证,使用dataflow可以做到并行;对需要并行的函数使用pipeline也可以做到并行;如果两个都有肯定可以并行;如果两个都没有肯定不行。4 有pipeline(在循环外部,作用域整个函数)没有dataflow,可以并行。3 有pipeline(在循环内部,作用域循环体)没有dateflow,不能并行。1 没有dataflow没有pipeline,无法并行。2 有dataflow没有pipeline,可以并行。
2023-08-17 19:00:36
161
原创 vitis结构理解
pipeline是流水打拍,可以理解为再已经生成的电路上形成“浪涌“,即整个流程没执行完成前,再次提前启动,因此流水打拍一定是多次执行有效,所以一定要在循环中(上面讲到的只考虑循环中一次的并行设计,本质上对整个流程进行切割成不同部分,再外围循环中执行,每个部分可以单独pipeline,在kernel中,先不考虑循环(只考虑循环中的一次代码执行),这种情况下执行流程总体是c++代码顺序执行的,这种就是控制驱动(代码流程“控制“了整个流程);总体上说驱动并行是解决一次执行中的并行度的问题;
2023-07-16 12:10:29
168
原创 对vitis的理解
4 vitis提出kernel的概念(*.xo),使用AXI、AXI lite4 、AXIS三种接口通讯,分别和verilog相关的概念对应。7 vitis和vivado对ram访问有相同的限制,vitis通过array*相关的宏对ram变量进行分割、重组、位宽管理,达到最优化效果。5 vitis为了避免不同时钟差异,一个内核只能用一种时钟,甚至一个工程内部多个内核也用一个时钟,vivado没有限制。8 vitis对AXI访问全局内存采用“突发”的方式,即通过实现一个fifo缓存、组合请求,达到优化效果。
2023-06-13 10:45:55
7492
原创 程序的新的境界
<br />程序员写的程序的好坏可以通过几个指标来衡量<br />1, 是否能实现功能<br />2, 是否能稳定的实现功能<br />3, 是否能稳定高效的实现功能<br />4, 是否能稳定高效的实现功能并能方便的修改这些功能并添加一些新的功能<br />5, 是否能向使用者方便的展示这些功能的实现过程<br />1, 实现某个功能是这个程序的基础,同样也是程序员需要记忆和学习的主要地方<br />2, 添加一个稳定,就要程序员做很多工作了,这时候要考虑边界问题了,多线程的同步,临界区的保护,等等<b
2010-10-07 14:50:00
358
原创 日志的作用
<br />以前一直认为日志的作用是为了发现错误,在这种思想的指导下,总是当考虑可能出现错误的时候才添加日志,这样对日志的维护就出现了东一块、西一块,有些信息在不同的日志中记录多次,而有的信息却没有记录。这种思想的错误会造成非常严重的问题。解决的方案是:记录日志可以分为三块1,输入部分。2,输出部分。3,执行过程。这样实际上就覆盖了整个流程,可以完整的保存从输入到输出的所有信息的现场。
2010-10-07 14:17:00
583
原创 vc嵌入汇编
char szHello[] = "Hello, world!"; char szAppName[] = "xuewd"; __asm { PUSH MB_OK;//MB_ICONINformATION //LEA EAX, szAppName; MOV EAX, OFFSET szTitle PUSH EAX LEA EAX, szHello; //MOV EAX, OFFSET szHello PUSH EAX
2010-08-27 08:37:00
446
原创 程序员工作要做什么?
<br />看到题目肯定会有人发笑。因为这个问题只要是写过helloworld的人都会条件反射的回答:写代码呀!<br />但是,这是一个错误的或者是不完全正确的答案。<br />如果你不行,我就来问你几个问题:<br />1. 如果让你写一个几十万行代码的程序, 你会这么写?<br />2. 如果让你修改一个几十万行代码的程序的部分功能,你这么修改?<br />3. 如果分配给你某个模块,你要先做什么?<br /> <br />思考完这几个问题你会发现,写代码只是程序员的一小部分工作。<br />一个程序
2010-08-19 11:03:00
2514
原创 删除文件收回
有时候,因为不小心或烦,删除了有用的或还要用的文件,而且又清空了回收站(或直接删除而根本不放入回收站)。怎么办?别着急,只要你的电脑还没有运 <br /><br /><br />有时候,因为不小心或烦,删除了有用的或还要用的文件,而且又清空了回收站(或直接删除而根本不放入回收站)。怎么办?别着急,只要你的电脑还没有运行磁盘整理,且系统完好,任何时候的文件都可以找回来。方法很简单: <br /><br /> 1、单击“开始/运行”,输入regedit 打开注册表 <br /><br /> 2、依次展开:H
2010-08-18 12:58:00
462
原创 求x的y次方
#include double pow(double x,double y) //求x的y次方 double exp (double x); //求e的x次幂的值
2010-08-09 09:19:00
1124
原创 什么是程序员
什么是程序员,这个问题以前我很容易回答,可是现在就不那么容易了。我真的越来越不知道在做什么,感觉好像厌倦了这种生活。每天无穷无尽的代码,而且大部分是重复性的。头痛呀,以前那种最求最高境界的想法渐渐的远去,真的,现在我都不知道我在做什么。其实这是必然,因为我的风格的不完善,导致了我必须要经历这样一个痛苦的阶段,通过重复性的劳动来磨练出完善的风格。我会坚持的。下一个阶段我要花些时间放到我的网店上去了,写一个iRC聊天系统,也算是对自己的检验。现在我已经走过了择业的阶段,不用再为没有工作,
2010-08-03 12:54:00
342
原创 这样用也可以的!
<br />class Base<br />{<br />public:<br /> virtual void f() { cout << "Base::f()" << endl; }<br />protected:<br /> Base(Base* pData) : m_pData(pData) { m_pData->f(); } // 为什么输出Base::f()?为什么不是Derived::f或者直接crash?vtable这时候初始化好了吗?<br /> Base* m_pData
2010-07-19 13:17:00
292
原创 VC中建立程序的关联文件
当我们双击一个txt文件的图标时,系统就会用记事本打开该文件,这就是程序的关联。那我们自己编写的程序如何建立关联文件呢?<br /><br />第一步:设置自己程序关联的文件类型<br />打开资源下的String Table,找到其中的IDR_MAINFRAME,双击该项,修改它的值,设它原来的值是:<br />TextEditor/n/nTextEd/n/n/nTextEditor.Document/nTextEd Document<br />若你关联的文件类型为.txt,则把它改为:<br />Tex
2010-07-16 11:19:00
933
原创 windows 线程管理类
<br />对于windows多线程,一般的处理情况是构建一个全局函数然后创建一个线程来处理,但是这样的处理有一个不方便的情况,就是不能方便的对一个线程处理,这时候可以考虑封装一个线程类,这个类和普通的类没有区别,只是必须有一个静态函数作为这个类的入口函数,通过线程传入的参数可以方便的提供必要的信息来告知使用的那个实例,这样就实际上就完全把整个线程管理和类的处理有机的结合起来了
2010-07-15 09:21:00
361
原创 static_cast和reinterpret_cast
<br />static_cast<type>(expression) <br /> <br /> 例如,假设你想把一个int转换成double,以便让包含int类型变量的表达式产生出浮点数值的结果。如果用C风格的类型转换,你能这样写: <br /> <br /> int firstNumber, secondNumber; <br /> ... <br /> double result = ((double)firstNumber)/secondNumber
2010-06-24 21:16:00
297
原创 高精度计时函数QueryPerformanceCounter
<br />如果在多处理器的电脑上使用这个函数需要,需要指定调用的处理器。在不同的处理器上会得到不同的结果。<br />指定处理器要用到SetThreadAffinityMask。
2010-06-24 17:35:00
409
原创 对模板新的理解 ----- 模板和虚函数结合使用的新发现
<br />c++中模板占整个c++编程的半壁江山(另一半是面向对象编程)。其实两者不存在矛盾,面向对象编程是对具体对象的的操作;模板是对类的更高级别的抽象。两者相辅相成,一般是具体的对象通过继承、构造来实现具体的方法,模板类来管理这些对象。这是标准的stl模型。<br />其实这绝对不是模板的全部,对模板的使用我们还可以再更高的层次,stl和一般的模板的使用一般都是一个模板类管理长长的一串对象,比如排序、添加、删除等等。<br />这时候如果我们在看的更高些:这个模板类只包含一个对象,这时候也许就会有疑问
2010-06-23 10:15:00
747
原创 虚函数应用的新发现---匕首
<br />当把模板和虚函数结合起来后,会发现非常的灵活。模板用来提供不同类型,插入到模板类的某个函数中的虚函数,在子类中对模板指定类型的成员赋值,调用它的方法,而运行起来后,就像是一个普通的类一样,太完美了!<br />不亚于动态模板,而且比动态模板灵活!好东西
2010-06-22 16:28:00
371
原创 struct构造函数
最近才知道struct和class的静态构造函数的触发规则是不同的,不像class在第一次使用类的时候触发静态构造函数。如果只访问struct实例的字段是不会触发静态构造函数调用的。通过测试发现当访问静态字段,struct本身的函数(静态和实例)和带参数的构造函数就会引起静态构造函数的执行。而调用默认构造和未覆写的基类虚函数是不会的。为什么呢? 让我们先来看看class和struct在调用构造函数时的区别。class使用newobj指令而struct使用initobj指令来构造对象。newobj在堆上
2010-06-11 08:43:00
5532
1
原创 malloc原理
<br />http://apps.hi.baidu.com/share/detail/4205536<br />malloc原理 <br />malloc函数的一种简单的原理性实现 C language 实现 【转】2009年01月16日 星期五 00:01<br />malloc函数的一种简单的原理性实现<br />malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地
2010-06-11 08:29:00
652
原创 (转) Placement New的使用
(转) Placement New的使用已有 160 次阅读 2010-01-20 22:58三星Bada开发者聚会报名中<br /> 今天看STL源码遇到一个问题: template <class _T1, class _T2><br />inline void _Construct(_T1* __p, const _T2& __value) {<br /> new ((void*) __p) _T1(__value);<br />} 上网搜到了一些文章,分享了: 原帖地址: http://www.k
2010-06-10 13:30:00
400
原创 wtl 安装
<br />http://hi.baidu.com/torkit/blog/item/c4d0b681150d27debc3e1e19.html<br />WTL全称为Window Template Library,一个构架于ATL之上的C++类库,它包装了大多数的窗口控制.从网上<br />看的,也只是个大概的了解.先安装了弄个Hello World试试吧,呵呵<br />1,安装<br /> 1.1 下个WTL安装包,其实上个压缩包.现在最新的是8.0版,默认解压目录为C:/WTL80,其中80为版
2010-06-09 21:44:00
452
原创 tab控件贴图
<br /> http://www.codeproject.com/KB/tabs/TabCtrl.aspx<br /> <br />TabCtrlEx<tabctrlstyle_vs2003_client /> m_TabCtrl;<br /> CListCtrl m_List1, m_List2, m_List3;<br /> <br /> ...<br /> ...<br /> <br /> // Creation and initialization of TabCtrl.<br />
2010-06-09 13:17:00
520
原创 api 创建工具栏
<br />TBBUTTON tbButtons[] = <br />{<br /> { MAKELONG(STD_FILEOPEN, 0), IDM_FILE_OPEN, TBSTATE_ENABLED, 0, {0}, 0, 0},<br /> { MAKELONG(STD_FILESAVE, 0), IDM_FILE_CLOSE, TBSTATE_ENABLED, 0, {0}, 0, 0}<br />};<br /><br />#define BUTTON_COUNT sizeof(t
2010-06-09 12:56:00
548
原创 编程风格的认识
<br />现在认为编程风格有以下几个方面:<br />1错误值逐层返回<br />2.在用户调用层,对错误码解析,并提供错误信息返回函数,以便用户获取<br />3.成员、变量命名规范但不死板<br />4.函数、类的划分合理<br />5.类之间的关系明确,合理的使用继承、包含等关系<br />6.对于高于类的抽象必要时使用模板,但在底层一般不使用<br />7.每个函数、每个类的功能要有详细的介绍
2010-06-03 08:42:00
295
原创 一年了,该总结下了
<br />开始写日志已经一年了,渐渐的养成了一个习惯:发现好的资料、有些新的想法、新的理解,情不自禁的想写下来,慢慢的积累了这些日志。呵呵,现在回头看还是挺有成就感的。<br />只是现在我比过去更茫然了,原来还有目标:成为一个合格的c++程序员,可是现在突然发现,过去一年的努力只是增长了经验,使编程风格更完善,也增加了对c++的理解,另外比如:宏、各种类库也能在必要的时候自然的去用。可是越是这样越是茫然,我的下一步这么走呢?怎么才能走向更高的高峰呢?我心里真的没底。<br />可以说我已经基本完成了c+
2010-06-01 13:15:00
246
原创 宏编译 时间
<br />char date[12] = {0};<br />sprintf(date,<br /> "%02d %s",<br />"/x5/x0/x8/x0/x6/x0/x7/x3/x1/xa/x4/x0/x0/x0/x0/x0/x0/xc/xb/x9/x2"[(__DATE__[0]+__DATE__[1]-__DATE__[2]-53)%24],__DATE__+4);<br />printf("%s/n",date);
2010-06-01 08:48:00
615
原创 Samba实现Linux和Windows文件共享
http://linux.chinaunix.net/techdoc/net/2007/05/28/958930.shtml tar -I或者bunzip2命令都可以解压.bz2文件 tar xvfj example.tar.bz2 tar xvfz example.tar.gz tar xvfz example.tgz tar xvf example.tar unzip examp
2010-05-30 13:34:00
788
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人