0%

视 C++ 为一个语言联邦

尽量以 const, enum, inline 代替 #define

  • 对于单纯常量,最好以 const 对象或 enums 替换 #define
  • 对于形似函数的宏,最好改用 inline 函数替换 #define

尽可能使用 const

const 允许我们指定一个 语义约束,编译器会强制实施这项约束。

const 可修饰常量 及 static 对象。
可修改 classes 内部的 static 或 non-static 成员变量。

阅读全文 »

Effective C++ 的目录。

1. 让自己习惯 C++

01 视 C++ 为一个语言联邦

02 尽量以 const, enum, inline 代替 #define

03 尽可能使用 const

04 确定对象被使用前已先被初始化


阅读全文 »

非整数倍的数据位宽转换,和上一篇比较类似,但是由于转换宽度非整数倍,会产生更多的状态,但又不复杂到需要使用状态机来解决。

原题链接:VL32 非整数倍数据位宽转换24to128

通常的做法是 寻转转换前后位宽的最小公倍数。用计数器记录状态,计数器的值和最小公倍数相关。在这个例子中,转换前宽度 A = 24,转换后宽度 B = 128,最小公倍数为 24 * 16 = 128 * 3,所以:

  • 一共有 16 个状态。
  • 计数器 应该最大计数到 16 - 1 = 15
  • 其中有 3 个状态需要输出 data_out,且标明 valid_out
阅读全文 »

和上一篇类似,不过这次上下游握手协议均是 valid-ready。

原题链接:数据累加输出

数据通路的处理比较清晰,关键是上下游的控制信号传递。

这是核心:

1
2
3
4
// valid_b == 1b'1 ---> 数据输出有效,此时停止读入新的数据
// ready_b == 1'b1 ---> 下游可以接收数据,此时可以读取新的数据
assign ready_a = ~valid_b || ready_b;
assign valid_in = ready_a && valid_a;
阅读全文 »

数据串并转换的练习。这里做了许多简化,不用考虑阻塞的情况:即上游使用 valid-ready,下游使用 valid-only 的握手机制,因此不会出现阻塞。如果上下游均使用 valid-ready 握手机制,那么需要处理阻塞的情况,这个问题会在后续有所考虑。

原题链接:VL30 数据串并转换电路

阅读全文 »

关于 git-flow 的简单介绍,是时候来好好管理我们的项目了,一条 main 交到底的方式并不合适。

参考:

git-flow介绍及开发过程演示

基本的分支类型

分支名称 说明 命名
master 发布分支 master 或者 main
develop 开发分支 develop
feature 功能分支 feature/FOO-1
bugfix 修复分支 bugfix/FOO-2
hotfix 紧急修复分支 hotfix/FOO-3
release 发布前的准备工作 release/1.0.3

额外的老版本的维护分支,一般使用 supportsupport/1.0.x

阅读全文 »

牛客上 Verilog 练习题的答案合集。我对这些题目的评价是比较坑,练习的快感不如 HDLbits,而且测试非常不专业,但还是值得一做的。

verilog题目集

  • VL25 输入序列连续的序列检测
  • VL26 含无关项的序列检测
  • VL27 不重叠序列检测
  • VL28 输入序列不连续的序列检测
阅读全文 »

一个用 Python 实现的邮件自动发送器,代码不长,这再次展现了 Python 这个胶水语言的简洁。

网上有很多基于 Python 的邮件发送器实现,这里使用的是基于 smtplib 的方式:

阅读全文 »

如果还不知道最简单的 Makefile 应该怎么写,可以参考 Makefile 基本用法

参考链接:多目录makefile

简单的 Makefile 很好写,但是一旦复杂起来,尤其是多文件和多目录的 Makefile 就不是那么好写了。参考上面列出的文章,记录一个 cheatlist。


赋值

  • = 是最基本的赋值
  • := 是覆盖之前的值
  • ?= 是如果没有被赋值过就赋予等号后面的值
  • += 是添加等号后面的值
阅读全文 »