FPGA流水线设计的策略(翻译)
FPGA流水线设计的策略
发现一篇非常好的讲FPGA中流水线设计的文章,搬运并翻译一下。
本文是https://zipcpu.com/blog/2017/08/14/strategies-for-pipelining.html的中文翻译。
学习FPGA的学生常常面临一个棘手的问题,FPGA中所有而事情都是并行发生的。
许多同学来自计算机科学专业,他们理解算法如何工作,一个操作需要在另一个操作之后顺序执行。他们很难理解算法中的每一步都对应着一块逻辑电路,需要在相应的时钟周期执行——无论是否使用。
解决操作顺序的一个方法是创建一个巨大的状态机。FPGA往往会同时创建所有状态的逻辑,并且仅在每个时周期结束的时候选择正确的答案。因此,状态机可以非常想我们讨论过的简单的多ALU(算术逻辑单元)。
另一方面,如果FPGA无论如何都会实现操作的所有逻辑,那么为什么不讲这些操作安排成一个序列,每个阶段都做一些有用的事情呢?这种方法将算法重新排列为流水线。流水线往往比状态机方法更快速完成相同的算法,甚至在资源利用方面有时也更高效,尽管这不一定。
数字逻辑流水线的难点在于,即使流水线的输入尚未有效,流水线 ...
线性空间到底是什么?能不能用一句话定义线性空间?为什么线性空间一定有基?
线性空间到底是什么?
我们在学习线性代数的时候,通常见到的线性空间是由以下八个条件共同定义的:
设KKK是一个数域,VVV是一个非空集合,同时还定义了:
向量加法:+:V×V→V+: V \times V \rightarrow V+:V×V→V
标量乘法:⋅:K×V→V\cdot: K \times V \rightarrow V⋅:K×V→V(⋅\cdot⋅也可省略)
且两种运算满足以下八条:
则成VVV是定义在KKK上的线性空间,又称向量空间。
向量加法单位元存在:存在θ∈K\theta \in Kθ∈K使得α+θ=α,α∈V\alpha + \theta = \alpha, \quad \alpha \in Vα+θ=α,α∈V,称θ\thetaθ为KKK的零元素,即向量加法的单位元。
向量加法逆元存在:存在∀α∈V,∃β∈V\forall \alpha \in V, \exists \beta \in V∀α∈V,∃β∈V使得α+β=θ\alpha + \beta = \thetaα+β=θ,称β\betaβ为VVV的负元素,即向量加法的逆元。
向量加法结合律:(α+β ...
Linux下解压各种格式的压缩文件
dtrx: Do The Right eXtraction
时代变了家人们,现在你再也不用记住各种压缩文件格式的解压命令了,只需要dtrx即可一键解压,dtrx就是为此而生。
12pip install dtrxdtrx -v archive.tar.gz # v代表显示详细信息
目前,dtrx支持解压的格式有这么多:
1234dtrx extracts archives in a number of different formats; it currentlysupports tar, zip (including self-extracting .exe files), cpio, rpm, deb,gem, 7z, cab, rar, lzh, arj, and InstallShield files. It can also decompressfiles compressed with gzip, bzip2, lzma, xz, lrzip, lzip, or compress.
伟大,无需多言!
dtrx会自动识别压缩文件的格式,并调用正确的解压程序进行解压。
基于FPGA的魔塔游戏
这是浙江大学2024春夏数字逻辑设计的课程设计,我们小组基于FPGA制作了一个魔塔游戏。视频演示:
https://www.bilibili.com/video/BV1i9gkeAEEk/
其中,本人主要负责代码的编写,包括时钟控制模块、VGA模块、地图渲染、数字渲染、地图交互、COE文件生成脚本、地图编辑器、Vivado TCL脚本等。
开发环境使用Vivado,利用Vivado TCL脚本 + git来管理和协作开发。
VGA模块我编写的时候使用了一个RAM映射到VGA输出,这样其他模块可以通过写RAM来渲染,实现解耦合和其他的一些好处。没有采用给的参考代码里输出x, y输入color的方法。
主要的逻辑并不复杂,当相应的移动按键被按下之后,会生成一个预移动信号,检测移动目标位置是否符合特定规则(如目标为门且钥匙足够,目标为怪物且生命值足够等),如果符合规则,则会生成一个移动信号,更新人物坐标,否则保持原地不动。
开发过程中发现自己对时序逻辑的理解还不够深,经常出现仿真/下板结果和预期不符合,需要反复下板验证,由于项目到后期之后生成比特流的速度变得非常慢,制约了开发的速度。(该死 ...
Diffie–Hellman密钥交换以及OpenSSL中相关源码解析
什么是 Diffie–Hellman 密钥交换?
Diffie-Hellman是一种密钥交换方法,可以让双方从不安全信道中建立一个共同的密钥来加密通讯内容。
DH方法本身很简单,但它却是许多现代安全协议的基础,如TLS安全传输层协议,安全外壳协议以及IPSec互联网安全协议,都部分使用到了DH算法。
Diffie–Hellman 密钥交换的过程
Diffie-Hellman密钥交换的过程如下:
双方协定一个质数ppp和基数ggg。这两个数无需保密,可以随意协商或传输。
Alice生成一个随机数aaa,并计算 A=gamod pA=g^a \mod{p}A=gamodp 。
Bob生成一个随机数bbb,并计算B=gb(modp)B=g^b\pmod{p}B=gb(modp)。
Alice发送AAA给Bob。
Bob发送BBB给Alice。
Alice计算s=Ba(modp)s=B^a\pmod{p}s=Ba(modp)
Bob计算s=Ab(modp)s=A^b\pmod{p}s=Ab(modp)
由于 (ga)b≡gab≡(gb)a{(g^a)}^b \equiv g^{ab} ...
一种计算纯电阻网络等效电阻的算法
引入
我们早就学过了计算串并联电阻的等效电阻的公式:
针对混合的电阻网络,有些时候我们依然可以反复运用这两个公式来计算等效电阻。在有些电阻网络中,这样是无法得到答案的:
如果你熟悉星三角变换,你应该能很快算出答案。(或者你能看出这就是一个平衡桥,那就能口算了)
星三角变换固然是一种手工计算等效电阻的很好方法,但是对于计算机而言,利用这个方法计算电阻会很麻烦。下面,我将使用高斯消元法来计算两点之间的等效电阻。
建模
我们可以把两点之间的纯电阻网络看作是一张有向图,节点表示导线,边表示电阻,边权表示电阻的大小。要求源点和汇点之间的等效电阻大小。
为什么要建成有向边呢,因为虽然电阻是无向的,但是电流是有向的,我们一开始并不知道电流的方向,但是可以任意地假定一个方向,然后给每一条边赋上一个电流IiI_iIi,当IiI_iIi为正,表示电流方向与箭头同向,当IiI_iIi为负,表示电流方向与箭头反向。然后我们再假定汇点的电势为000,其余每个节点赋上一个电势φi\varphi_iφi。
若要求源点到汇点的等效电阻,只需要知道源点的电势φs\varphi_sφs和汇点的电势φt\ ...
CS231n/EECS598 学习笔记(二)
尚未完成,持续更新中…
Lecture 5
Neural Network
线性分类器的局限
Linear Classifier能做的其实很有限,从Lecture 3的“几何视角”中,我们知道了线性分类相当于画了一个超平面来将超空间分类。然而并非所有情况下样本点都可以被一个平面简单的分割。
一种方法是对原有数据集做一些变换,使得线性分类器能够分割变换后的数据。
这种方法的确能取得不错的结果,只需要人工提取出数据集的一些特征,然后用这些特征来训练线性分类器。比如,对于图像分类,可以设计算法来提取图像的边缘、颜色、纹理等特征,然后用这些特征来训练线性分类器。同时,也有一些data-driven的方法可以用来提取特征。
但是这种方法的缺点也很明显,就是研究者必须知道哪一些特征变换对于分类是有效的。而神经网络解决了这个问题。
或许,神经网络只是将特征提取的步骤和训练的步骤融合在了一起。
从线性分类器到神经网络
神经网络其实只是线性分类器的叠加
Linear Score Function: f=Wxf=\boldsymbol{W}xf=Wx
2-layer Neural Network: ...
微分形式不变性以及dy,△y和f'(x)的区别和联系
初学微积分的时候,看到课本上证明所谓的“一阶微分形式不变性”看得云里雾里,想着“d𝑦=𝑓′(𝑥)d𝑥竟然也需要证?”.但当我仔细看了看微积分中导数𝑓′(𝑥),微分d𝑥的定义,明晰了以前一直混淆的概念,发现这确实需要证明.不禁又一次感叹微积分的严谨(上一次是理解𝜀 − 𝛿语言时)."
logrus库同时将日志输出到文件和stderr,并设置不同的formatter
背景
在Web项目开发中,日志记录是维护和调试程序的重要手段。logrus 是一个流行的Go语言日志库,提供了丰富的日志级别和格式定制能力。logrus它支持 JSONFormatter 和 TextFormatter 两种格式化器,允许开发人员根据不同的场景,选择最合适的日志输出格式。
JSONFormatter
JSONFormatter 将日志信息输出为JSON格式,这被称为"结构化日志"。结构化日志易于程序解析,非常适合于传输到日志分析系统,如ELK Stack(Elasticsearch、Logstash、Kibana),以便进行集中管理和分析。
JSONFormatter的输出示例:
1{"level":"info","msg":"Server started.","time":"2024-04-07T16:14:36+08:00"}
TextFormatter
与JSON相对,TextFormatter 输出的日志 ...
CS231n/EECS598 学习笔记(一) Lecture 1-4
课程介绍
Deep Learning for Computer Vision是一门介绍深度学习在计算机视觉中的应用的课程,本课程中介绍了如何实现、训练和调试自己的神经网络,并详细展示了计算机视觉的前沿研究。课程中还包括一些训练和微调视觉识别任务网络的实用工程技巧。CS231n是斯坦福大学的版本,由于这门课程在网络上最新的版本是2017年比较早,因此我选择了教学大纲基本相同,但有额外扩充内容的另一门课程,密歇根大学的EECS498/598,这门课在网上公开的最新版本是FA2019。
课程相关链接:
https://web.archive.org/web/20230328031120/https://web.eecs.umich.edu/~justincj/teaching/eecs498/FA2020/
http://cs231n.stanford.edu/schedule.html
课后作业答案
下面是我的作业解答链接
https://github.com/cyrus28214/EECS598-solutions
Lecture 1
对计算机视觉做了简单的引入,主要介绍了计算机视觉的 ...