基于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-7
Lecture 5
Neural Network
线性分类器的局限
Linear Classifier能做的其实很有限,从Lecture 3的“几何视角”中,我们知道了线性分类相当于画了一个超平面来将超空间分类。然而并非所有情况下样本点都可以被一个平面简单的分割。
一种方法是对原有数据集做一些变换,使得线性分类器能够分割变换后的数据。
这种方法的确能取得不错的结果,只需要人工提取出数据集的一些特征,然后用这些特征来训练线性分类器。比如,对于图像分类,可以设计算法来提取图像的边缘、颜色、纹理等特征,然后用这些特征来训练线性分类器。同时,也有一些data-driven的方法可以用来提取特征。
但是这种方法的缺点也很明显,就是研究者必须知道哪一些特征变换对于分类是有效的。而神经网络解决了这个问题。
或许,神经网络只是将特征提取的步骤和训练的步骤融合在了一起。
从线性分类器到神经网络
神经网络其实只是线性分类器的叠加
Linear Score Function: f=Wxf=\boldsymbol{W}xf=Wx
2-layer Neural Network: f=W2σ(W1x)f= ...
微分形式不变性以及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
对计算机视觉做了简单的引入,主要介绍了计算机视觉的 ...
学会Emmet语法,告别手打HTML和CSS
前言
有时候,写前端代码更像是一种体力活。在前端的世界,你经常需要写出重复嵌套的HTML元素,冗长的CSS样式。俗话说:不会偷懒的程序员不是好程序员,如果你还在手写HTML和CSS代码,那你必须要知道Emmet,这个可以显著加快你的代码速度的插件。
介绍
Emmet是一个可以极大加速web开发工作流的工具。Emmet为HTML/XML和CSS设计了一套便于记忆和使用的缩写,你只需要键入这些缩写,就可以自动展开成相应的代码。
安装
Emmet支持几乎所有的编辑器。包括VSCode、Sublime、Atom、WebStorm、Vim、Emacs等等。
如果你是用的是宇宙第一编辑器——VSCode,那么你不需要做任何事,因为VSCode默认集成了Emmet,不需要安装任何VSCode扩展。Emmet功能会在html、xml、css、sass、php等类型的文件中启用。详见https://code.visualstudio.com/docs/editor/emmet#_how-to-expand-emmet-abbreviations-and-snippets
如果你是其他编辑器的用户,这 ...
用Java中的Record(记录类)简化代码
简介
Record是从Java 14开始引入的新特性,Record提供了一种简洁高效的方式来创建不可变类。
引入
使用Java进行开发的时候,程序员经常会创建一些不可变类专门用于承载数据(也就是MVC模型中的model),这些类可能涉及大量的样板代码,包括:
大量的private、final、public关键字
每个字段的getter
重写equals()、hashCode()、toString()方法
例如以下代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657package example;import java.util.Objects;public final class Person { private final Long id; private final String name; private final Integer age; // 构造函数 public ...
OSI七层网络模型
概念
OSI模型(Open Systems Interconnection model)是由国际标准化组织(ISO)制定的一种用将各个计算机连接成网络的标准框架。
OSI模型将通信系统中的数据流划分成8层,从上至下分别是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。每一层都在下一层的基础上构建,为其上一层提供功能。从一台计算机发送信息到另一台计算机时,这些信息会从N层开始,向N-1层传递,直到物理层,使用物理的线路进行传输,传输到另一台计算机后,再从低至高解析数据,直到第N层,再交给某个应用程序处理。
OSI是一种概念模型,这意味着OSI并没有规定具体的实现,而只是描述了一些概念,用来为实际的标准制定和开发提供参考。也就是说,对于同一层可能有多种不同的协议来实现。
应用层(Application Layer)
应用层是最贴近用户的一层,应用程序通过网络传输数据,根据程序的功能,处理数据、为用户提供图形界面、发送数据等。直接为网络应用提供服务。
具体的应用举例:浏览器、QQ
应用层的网络协议有:HTTP(上网协议)、FTP(文件传输协议)、SMTP(电子邮件传输协议)等 ...