Gokong Space | 行空空间
type: channel
link: https://gokong.space/
description: 在自由的原野上奔跑，于璀璨的星河里穿行。
items: 『操作系统』期末复习
items: Good First Issue 指南
items: 再见深圳
items: Weekly Snippets · Vol.01
items: 【记录】博客的备份与恢复
items: 一杯美式，少冰
items: Verilog 学习笔记（14）：More Circuits
items: Verilog 学习笔记（13）：Shift Registers
items: Verilog 学习笔记（12）：Counters
items: Verilog 学习笔记（11）：Latches and Flip-Flops

『操作系统』期末复习
type: item
date: 2026-05-25T17:10:00+08:00
description: 本文页码均指课件页码操作系统概述一、核心主线操作系统是位于硬件之上、其他软件之下的系统软件，它负责管理计算机软硬件资源，并为用户和应用程序提供方便、安全、高效的服务。也就是说，操作系统既是：资源管理者：管理 CPU、内存、设备、文件等资源。 用户接口：提供命令行、图形界面、系统调用等使用方式。 虚拟机：把复杂硬件包装成更易用的逻辑资源，比如虚拟 CPU、虚拟内存、虚拟设备。 控制程序：通过中断、调度、保护机制控制程序运行。二、操作系统的概念1. 操作系统的地位课件中强调：操作系统位于 硬件层 HAL 之上，位于 其他系统软件和应用软件之下。可以理解成：应用软件 系统软件 / 系统库 操作系统 硬件 / HAL应用程序通常不会直接操作硬件，而是通过 库函数 或 系统调用 请求操作系统完成底层工作。例如：printf("Hello");表面上是 C 语言函数，实际上最终要通过操作系统完成显示设备或终端输出。2. 操作系统的作用主要有两类：第一，管理资源：资源操作系统做什么CPU调度多个程序运行内存分配、保护、共享、扩充设备分配设备、驱动设备、管理 I/O文件组织文件系统，支持读写、目录、权限第二，提供服务接口：包括 API、GUI、命令行、作业控制语言 JCL 等。3. 操作系统定义课件中的定义可以背下来：操作系统是位于硬件层之上、所有其他软件层之下的系统软件，通过它管理系统中各种软硬件资源，使它们被充分利用，并方便用户使用计算机系统。考试中如果问“什么是操作系统”，答这个定义基本够用。三、操作系统的发展历史这一部分容易考“发展阶段”和“各阶段特点”。1. 手工操作阶段时间大约是 20 世纪 40 年代，无操作系统。特点：程序员手工操作机器； 使用纸带、卡片、开关、接线板； CPU 经常等待人操作，效率极低； 资源被一个作业独占。重点理解：机器越来越快后，人工操作时间反而成了主要瓶颈。2. 批处理阶段为了解决人工干预太多的问题，出现批处理。分为：联机批处理：作业从读卡机进入计算机，按批处理执行。优点是减少人工干预，缺点是 I/O 慢，主机等待时间长。脱机批处理：使用卫星机完成输入输出转换，主机专心计算。优点是减少主机等待 I/O，缺点是需要人工搬磁带和额外设备。3. 执行系统阶段出现了 通道 和 中断 技术。通道可以理解为专门负责 I/O 的处理机，它接受 CPU 委托执行 I/O 操作。这样 CPU 和 I/O 可以并行工作。这一阶段出现了 SPOOLing 假脱机技术。4. 多道批处理系统这是操作系统走向成熟的重要标志。核心思想：内存中同时放入多个作业，当一个作业等待 I/O 时，CPU 可以去执行另一个作业。优点：提高 CPU 利用率； 提高系统吞吐量； 适合大型科学计算任务。但它也带来了一系列新问题：互斥、同步、通信、死锁、饥饿等。这些正是后面几章重点内容。5. 分时系统分时系统面向交互式用户。特点：多用户通过终端连接主机； 系统轮流给每个用户分配 CPU 时间片； 用户感觉自己独占一台机器。典型系统：CTSS、Multics、UNIX。6. 实时系统实时系统强调 及时响应 和 高可靠性。应用场景：工业控制、军事控制、医疗控制、航班订票、联机检索等。重点：实时系统不是单纯追求“快”，而是要求 在规定时间内完成响应。7. 通用操作系统通用操作系统把批处理、分时、实时等功能结合起来。常见模式：前台分时 + 后台批处理； 前台实时 + 后台批处理。四、操作系统的四大特性这部分常考简答题。1. 并发性多个程序在宏观上同时向前推进。注意区分：概念含义并发宏观同时，微观交替并行真正同时，需要多个处理器或多个核心单 CPU 上可以有并发，但不能真正并行执行多个程序。2. 共享性多个程序共同使用系统资源。例如：多个程序共享 CPU； 多个进程共享内存中的某些区域； 多个用户共享打印机； 多个进程共享文件。共享必须由操作系统协调，否则会产生冲突。3. 异步性程序推进速度不可预知。原因是：多个程序交替运行； 中断随机发生； 调度时机不确定。所以程序执行顺序并不完全由程序员控制，而受中断、调度、资源状态影响。4. 虚拟性通过某种技术把一个物理实体变成多个逻辑实体。例子：物理实体虚拟效果一个 CPU多个虚拟 CPU内存 + 外存更大的虚拟存储空间独占设备可共享的虚拟设备这一点非常重要，后面虚拟存储、虚拟设备都会继续展开。五、操作系统的主要类型1. 多道批处理系统关键词：多道、成批、吞吐量、资源利用率。适合非交互、大批量计算任务。重点概念：SPOOLing。SPOOLing 又叫假脱机技术或排队转储技术，由输入井、输出井和常驻 I/O 进程组成。它可以把独占设备改造成共享设备，实现虚拟设备功能。2. 分时操作系统关键词：多路性、交互性、独占性。多路…

Good First Issue 指南
type: item
date: 2026-05-11T22:00:00+08:00
description: Good First IssueGood = 友好的、适合新手的 First = 给第一次做开源贡献的人 good-first-issue ： 适合新手第一次贡献的优质入门任务。它是开源社区吸引新成员、降低入门门槛的重要机制，也是开启开源贡献之旅的最佳起点。声明这里首先演示 HTTPS 方式master / main 请根据实际情况选择不同环境或系统的命令不一定相同，本文仅作为参考。基础准备环境配置# 安装 git、vim sudo dnf install -y git vim git-lfs # 配置Git全局信息（与 AtomGit/GitHub 账号一致） git config --global user.name "用户名" git config --global user.email "注册邮箱" # 查看配置是否生效 git config --list 访问令牌在个人设置→安全设置之类的地方找到访问令牌，生成新令牌（勾选 repo 权限），复制并保存生成的令牌字符串（该字符串只显示一次，务必保存好）ForkFork 相当于「把官方仓库复制一份到自己的账号下」，是参与项目的第一步。 页面右上角的 Fork 按钮，选择 Fork 到自己的账号下。Clone克隆 = 「把远程仓库下载到本地」，必须克隆「自己 Fork 后的仓库」，而非官方仓库。打开本地终端；进入想存放代码的文件夹（比如 cd ~/code，表示进入用户目录下的 code 文件夹）；执行克隆命令（替换成自己 Fork 后的仓库地址）git clone https://******.git 进入克隆后的仓库目录cd 仓库名配置上游官方仓库（该动作仅需 1 次）目的是让本地仓库「知道官方仓库的地址」，方便后续同步。确保终端在仓库目录下（已执行 cd 仓库名 ）；执行添加命令git remote add upstream 官方仓库地址验证是否添加成功git remote -v 正常的输出大概是： origin https://***.com/我的账号/***.git (fetch) origin https://***.com/我的账号/***.git (push) upstream https://***.com/官方账号/***.git (fetch) upstream https://***.com/官方账号/***.git (push)同步官方仓库的最新代码官方仓库会不断更新，每次本地开发前，先同步上游代码，避免本地的修改和官方代码冲突。确保当前在仓库根目录；拉取官方仓库的最新代码（只下载，不修改本地文件）git fetch upstream 切换到本地主分支（master/main）git checkout master合并官方最新代码到本地主分支（最终同步）git merge upstream/master验证同步成功git log --oneline # 同步上游代码后，验证本地是否是官方最新版 创建并切换到开发分支严禁在主分支（master/main）修改代码，因为这会导致代码混乱。 所以需要新建一个专属分支用来修改/更新，任务完成后直接提交这个分支即可。分支命名规范格式：issue-编号-简单描述示例：修复文档：issue-1234-fix-docs修复错别字：issue-5678-fix-typo完善注释：issue-9012-add-commentIssue 数字编号方便之后关联任务创建 + 切换分支git checkout -b issue-1234-fix-docs checkout：切换分支-b：create branch（创建新分支）自定义分支名# 分开的命令 git branch 分支名 # 创建分支 git checkout 分支名 # 切换分支验证分支切换成功 执行命令查看当前所在分支：git branch 示例效果：* issue-1234-fix-docs # 前面带*的分支，就是当前正在使用的开发分支 master 开发# 打开需要修改的文件（根据Issue要求，例：修改README.md） vim README.md # Vim 基础操作（新手必看） # 按 i → 进入编辑模式 # 修改内容（修复错别字、补全注释、调整格式等） # 按 Esc → 退出编辑模式 # 输入 :wq → 保存并退出 # 输入 :q! → 不保存退出（放弃修改） # 查看修改内容（确认修改正确） git diff 提交与推送当我们完成本地开发后，需要把修改推到自己 Fork 的仓库（ origin 仓库）。# 1. 添加修改的文件到暂存区 git add 文件名 # 例：git add README.md # 或 git add . （添加…

再见深圳
type: item
date: 2026-03-19T21:20:00+08:00
description: 这次寒假我又来到了深圳，而上一次来深圳是三年前。 三年前，随着乘坐的大巴车缓缓驶入市中心，一座座高楼大厦鳞次栉比，若非抬头仰望极致，便无法看到楼顶。如同走进一片大森林，只不过这里的树木是从钢筋混凝土中生长出来的，身披耀眼夺目、闪闪发光的时装，巍然挺立，直至云霄。听说，在多云的天气里，平安金融中心的中国第二高楼能够在飞云之上，如果这时能在顶楼观赏一番天庭的风起云涌，那将是多么奇妙的体验啊。 灰青色西装的颜色，在我眼中就是这个城市的主题色。这种颜色，带着理性的冷静，让着南方的炙烤不再那样令人焦灼。灰青色不像黑色那样单调，但又比天青色更多一些沉稳，手提公文包的青年，步履迅捷，目光如炬，在快节奏的世界中保持着自在的节奏与从容。 三年前的我看到此般景象，兴奋极了。这就是我想要的生活，能在时代的潮流与科技的前沿行走，本身就是件令人兴奋的事情。那次的游览，就像一道光，照亮那段充满焦灼与挣扎却又无法选择的路。 上次是直接乘坐大巴车进了市中心，而这次我选择从高铁站缓缓走进这座城市。街边的手机店让我想起千禧年盛行的小灵通；上世纪八十年代的居民楼虽然已经有了明显的历史痕迹，但仍然宣示着它的摩登与骄傲；小吃和饭店传承着广州和佛山的烟火气，又有着现代的快捷和工整。 纵然已经有了心理预期，但是当我再次站在摩天大楼的脚下，仍然感受得到震撼与惊叹。一座座连绵的巨厦连接成钢铁城墙，每当走过一幢高楼，以为其后仅为平坦的空旷时，没想到又一幢更高的楼宇闪现而出，于是更加觉得自己的渺小以及在楼宇间穿行的畅快。在一处连红绿灯都没有的小小的十字路口，四周却矗立着不知几百米高的壮阔玻璃巨柱，在这种对比下，形成了强烈的视觉冲击。 再登莲花山，我阴差阳错地选择了与上次相反的路，从下山的路上山，从上山的路下山。这颇有一番寓意，刚好可以与三年前的自己在山顶迎面相遇，那时，他一定想不到我会在这个时间再次来这里。1从山顶眺望，整个深圳的高楼像一幅对称的画卷徐徐展开。山顶才一百米左右，可是从这里看五百多米的高楼，感觉也没比自己高多少，只能说这个观景台的设计恰到好处，精妙绝伦！我们还遇到了一位伯伯，想要让我帮他拍照，我拍完之后，他又在旁边等人流过去帮我们拍照。他还非常细心地提醒旁边的游客避让一下，以便镜头中没有其它的人。这对于我这个深度社恐来说简直是壮举，真的不胜感激。这是这次旅行为数不多的与陌生人交流的体验，愈发感觉到，人与人之间的善意真的很珍贵，更有一种奇妙的魔力。 从山顶眺望 欣赏过后山顶的景色，我们返程下山。刚好走到一片树荫下，积蓄已久的乌云突然下起了大雨，春雨贵如油，停留片刻，再次走出树荫时，这春雨便停了，甚至连雨伞都没有派上用场。我赞叹，这春雨来得刚刚好，只需“嘭嘣”两滴，就滋润了这片神州大地，趁着回南天还没有到来，顿觉雨后的空气清爽宜人，万物澄澈明净，毓秀园的树木🌳更加绿意盎然。 下山后，我们去了梅拉尼亚特色街区。这里的墙壁五彩斑斓，宛若童话世界，是个“出片”的好去处。看到了盛大的喷泉有花团锦簇围绕，小蜜蜂也来观赏啦~（还看到有一家外国人来玩，父母带着四个小孩，两个大点的八九岁，两个小点的一两岁，看着都有点累啊😅） 世界之窗 花丛中的小蜜蜂 回来时，恰逢蓝调时刻，拍下这壮观的楼群。 蓝调时刻的楼群 看到动作敏捷的城市美容师在深圳的通道间穿行。高楼在身后生长，把平凡日子走成向上的模样。2 邓小平同志塑像 城市美容师 蓝调浸透了整片钢铁森林，皎白的灯光次第亮起。怀揣着这座城的温柔与热烈，相信来日再见，后会有期。 为什么博主喜欢这么「玄幻」的解释啊喂！😑 ↩ 这篇文章的图片排版也是值得以后复用的！😛 ↩

Weekly Snippets · Vol.01
type: item
date: 2026-03-15T22:35:00+08:00
description: 嗨嗨嗨~时间过得真快，已经开学一周了。欧布，根据多年经验，开学的前两周和后两周是过得最慢的，前者是因为状态的改变和新的课表，后者当然是因为要考试了。而中间的几周是过得最快的，因为身心已经麻木，这学期，我将尝试对抗一下这种麻木感，看看在学期中还能不能感觉到自己仍是个“活人”。升级的教学楼某个教学楼曾经以奢华的厕所系统，带领四季温水和吹干机占有一席之地，却因破败与古老的座椅无人问津，偶尔也只能用来作为考古的感慨。没想到在寒假期间竟然默默发力，以独立桌面供电的强大攻势席卷而来，而且量大管饱。再配备上还能用的热水器，如今，这个教学楼已经成为我的首要栖息地了。事项List我总是喜欢给自己列一些待办事项List之类的，比如： 完成打✔读书 读博客 看“稍后再看” 打卡背单词 练习听力 课内网课 备考竞赛 投简历 写作业 然后，我就会忘记一些我要做的事情，尽管这些事情是相当重要的。最怕在做一件事的时候，突然想起来忘记的那件事，然后“失控感”、“焦虑感”、“迷茫感”席卷而来。在这种无序中，我的时间效率低下，精力分配不协调。接下来我将尝试按照紧急和重要分类，设定更加具体的项目，并且添加预期完成时间，希望有所改善。之前在找Obsidian插件的时候，发现了一位宝藏作者，也许能够从其中找到一些灵感：我的2025效率工具全景图：从知识管理到内容创作一些青春疼痛闲话长大后，觉得时间过得好快啊，一抬头，两个月过去了，一转眼，一个学期过去了，一恍惚，一年就过去了。 与我个人而言，高能量时间仅占有十分之一。在大部分的时间里，都类似于荒原上枯黄的野草，病怏怏地野蛮生长。 当我不再幻想未来，那我该怎样面对过去。 突然意识到，我已知的知识已经无法用来缓解内心的焦虑了。

【记录】博客的备份与恢复
type: item
date: 2026-03-09T20:30:00+08:00
description: 终于把博客给复活了！ 上学期期末的时候，突然觉得满目灰暗、世事苍凉、寰宇沉郁，然后我就删库跑路了…… 不幸中的万幸，删库之前，从宝塔面板中备份了“文件”-“域名”和“数据库”的内容，下文将记录一下怎么用这两个备份恢复整个网站。购买服务器，选择宝塔面板镜像，登录进宝塔面板。网站-添加站点，在传统项目下填写“域名”，“备注”和“根目录”会自动生成，FTP可以选择“不创建”，数据库选择“创建”，PHP版本选择7.4+（若仅显示“纯静态”，不用担心，稍后需要安装PHP）。然后点击确定。进入数据库，导入之前备份的数据库。进入文件，导入之前备份的文件。注意：将“config.inc.php”中的数据库的名字和密码更新。来到域名提供商，将域名解析到服务器的IP地址。（如果购买了其它平台的云解析DNS，记得更新一下）至此，网站应该已经恢复了。 我在此过程中也遇到了一些问题，记录一下。 完成上述步骤之后，输入域名之后，会自动下载.bin文件，而不是进入网页。原因大概是“当 Web 服务器 (Nginx/Apache) 无法识别 PHP 文件并将其传递给 PHP-FPM 处理时，会默认返回application/octet-stream(二进制流) 类型，浏览器因此触发下载。” 解决方法：将PHP从“纯静态”切换至“7.4+”。 其实，我这次本想换个域名（换个便宜的），但因为我之间设置过伪静态，给予了每篇文章唯一的永久链接，所以当我用新的域名之后，出现了无法正常打开某些页面的情况。只能继续用这个域名了，刚好这也是一个劝说自己继续使用本域名的一个“借口”吧。 经历了这次失而复得，希望自己更懂得珍惜。往后好好写、好好更，好好守护这片小小的自留地。 这里是 Gokong Space，装的不只是文章和代码，更是走过的思绪、留下的痕迹。

一杯美式，少冰
type: item
date: 2025-10-02T20:00:00+08:00
description: 我喜欢这一刻的美好。 今天逛了巴洛克式的街区，十一国庆，哪怕是在早上，也处处洋溢着欢快的空气。 一整个上午，简简单单地缓缓散步，顺便买了城市文旅局新出的一款限量文创帆布包，很幸运买到了。 接近中午，去往了一处室内的小吃街。食物很朴素，吃着很畅快舒服。 出了商场，太阳逐渐升起，但是风还是清爽的，就像这里的人们和农作物，不急不躁，不卑不亢，就这样悠闲地在空气中流动。 我又回到了巴洛克式的街区，在老式的建筑群里充满现代的浪漫主义与简约的抽象艺术，尽管这种“街区”式的商业风格在全国已经流行甚至同质化，但是我在那段困顿，不知何以解答难题的时光里第一次遇见了你，也只有你，能消化我那复杂和无目的的心思。我喜欢这里，不仅是回忆，也是期望，更是新的开始。所以我想一整天都闲散地、漫无目的地在这附近散步。 我想找一家咖啡店，坐下来敲敲日记，梳理一下这一段时间的思绪和生活。找了几处，不是过于喧嚣，就是地方狭小，或者桌椅低矮，都不适宜停留。当然我也并没有焦急，因为在这清爽的秋风里，任何焦躁的人都能被轻松安闲直爽畅快的风浸透。正打算返回时，意外在随意的一个拐角处，遇见了一家三楼靠窗，室内静谧，也能透过窗户听闻街区上的热闹的咖啡馆。我点了一杯少冰美式咖啡，找了一处靠窗的位置坐下，拿出笔记本电脑，开始写这段流水账式没有什么目的的日记。 室内有声音，但是很安静。有咖啡机的声音和人们不紧不燥的轻声交谈，也许是因为这里没有广播喇叭式地播放流行歌曲，所以显得很安静吧。室外有街头乐队的古典摇滚，有小孩子的吵闹，有人们的兴奋和放松的笑。室外的热闹与室内的安静并不会产生矛盾和冲突，就像番茄炒蛋的糖和盐一般调和中道，更显鲜美。这里是盛世，所以有欢声笑语，所以也有安静和悠然。 我选择一个人来这里。本来在这热闹的节日里，与亲人朋友逛街是一件非常快活的事，但是我一个人来也挺好。有些记忆，只属于一个人，有些感受，只属于一个人，有些追寻，亦只属于一个人。追寻那些未完成的梦想，追寻那些没有正确答案的记忆，追寻曾经的幻想中的遗憾，追寻少年时的风和阳光，然后学会放下，轻松的去面对过去也好、未来也罢。追寻曾经的幻象，并不一定需要达成，而是仅仅声明：我来过，我知道。我轻轻地走过，我向往美好，但我并不留恋。 一缕阳光洒在咖啡杯与笔记本电脑的夹缝中，清爽跳跃的秋风阵阵从穿过窗户，悠闲缓慢的古典摇滚轻柔的填满每一处的空气，树影斑驳，丛林摇曳。过去有不甘，过去有遗憾，过于有不如意和许多的不完美。 再看看当下吧。至少这一刻的风景和阳光是真实的，咖啡的回甘是真实的，时间的悠闲也是真实的，今天我坐在一处椅子上，什么都不想，什么都不打算，什么都不担忧，就这样静静地坐着。听风呢喃，观光影灿烂，阅壮丽河山，行走从容稳健。喧嚣过耳，仅留乐音。我在一处喧闹的城市深处，找到了安静。 今天的天气真好呀。在十一的快乐节日里，晴朗微云，温和的风，还有可爱的人。 萨克斯，循环明亮的艺术走廊，红砖青瓦，壁画，几处拐角，阳光和秋风的打闹，咖啡的芳香和奶油的清甜，稀疏的人流，相机咔嚓定格的瞬间，就是这里的风景。那么，最后，让我带着从容释然的笑说：一杯美式，少冰。

Verilog 学习笔记（14）：More Circuits
type: item
date: 2025-07-26T23:50:00+08:00
description: Rule 90.数组的异或规则是对应分量两两异或，得到一个新的数组。 Solutionmodule top_module( input clk, input load, input [511:0] data, output [511:0] q ); always @(posedge clk) begin if (load) //别忘了先加载 q <= data; else q <= {1'b0,q[511:1]} ^ {q[510:0],1'b0}; end endmodule Rule 110将左、中、右状态组合为 3 位索引，查表（Rule 110 的转移表）得到下一状态。将左、中、右分别作为三个变量（含有512个分量的数组），作卡诺图：L\C R000111100011110101于是，$C^{(n+1)} = \bar{C}R +\bar{L}C+C\bar{R}$ Solutionmodule top_module( input clk, input load, input [511:0] data, output [511:0] q ); wire [511:0] L,C,R; assign L = {1'b0,q[511:1]}; assign C = q; assign R = {q[510:0],1'b0}; always @(posedge clk) begin if(load) q <= data; else q <= (~C & R) | (~L & C) | (C & ~R); end endmodule Conway's Game of Life 16x16题意生命游戏是二维元胞自动机，每个细胞（cell）状态为1（活）或0（死），下一状态由8 个邻居的存活数决定：邻居存活数细胞下一状态0-1 个死亡（变 0）2 个保持当前状态3 个复活（变 1，即使之前是死的）≥4 个死亡（变 0）索引转换由一维索引转换到二维索引：行号 i：用idx 除以 16取整（舍去余数）；等效于： idx >> 4（右移 4 位 = 除以 2⁴）。列号 j：j = idx % 16（取模运算，即余数）；等效于按位与：idx & 15（15 的二进制是 1111，按位与之后达到保留低 4 位（即余数）的效果）。由二维索引转换到一维索引： (i, j) 的一维索引为 i * 16 + j.右移位运算符>> 是 右移位运算符：逻辑右移（>>）将二进制数向右移动，左侧空出的位用 0 填充，不考虑符号位。 语法：A >> N（将 A 右移 N 位）。算术右移（>>>）将二进制数向右移动，左侧空出的位用符号位填充（即保持负数的符号）。 语法：A >>> N（将 A 右移 N 位）。Solutionmodule top_module( input clk, input load, input [255:0] data, output [255:0] q ); reg [255:0] q_reg; // 模块级寄存器存储当前状态 assign q = q_reg; // 输出直接映射到寄存器 always @(posedge clk) begin // ------- 步骤1：声明过程块内的变量（必须放在块的开头）--------- reg [255:0] next_q; //存储下一状态（局部reg） integer idx; //当前细胞的一维索引 integer dr; //相对于当前细胞的行偏移（Delta Row） integer dc; //相对于当前细胞的列偏移（Delta Column） integer i; //当前细胞的二维行索引 integer j; //当前细胞的二维列索引 integer r; //邻居的绝对坐标的行索引 integer c; //邻居的绝对坐标的列索引 integer neighbor_idx; //邻居的一维索引 integer cnt; //邻居的存活数目 if (load) begin // 加载模式：直接赋值 q_reg <= data; end else begin // --------- 步骤2：遍历每个细胞，计算下一状态 ------------ for (idx = 0; idx < 256; idx = idx + 1) begin i = idx >> 4; // 计算当前细胞的行号（0~15） j = idx & 15; // 计算当前细胞的列号（0~15） cnt = 0; // 邻居存活数初始化 // 遍历8个邻居（dr, dc ∈ {-1, 0, 1}，左右位移只能取1或-1，所以待会需要跳过自身） for (dr = -1; dr <= 1; dr = dr + …

Verilog 学习笔记（13）：Shift Registers
type: item
date: 2025-07-26T09:40:00+08:00
description: 4-bit shift register异步复位的优先级：areset为高时，立即复位（不管时钟和其他信号）。加载 vs 移位的优先级：若load为 1，无论和ena为何值，加载优先（先判断load）。右移操作的行为：右移时，q[3]补 0，q[0]被移出（例如：q=1010右移后变为0101）。Solutionmodule top_module( input clk, input areset, // async active-high reset to zero input load, input ena, input [3:0] data, output reg [3:0] q); always @(posedge clk or posedge areset) begin if (areset) begin q <= 4'b0000; end else begin if (load) begin q <= data; end else if(ena) begin q <= {1'b0,q[3:1]}; end end end endmodule Left/right rotatorSolutionmodule top_module( input clk, input load, input [1:0] ena, input [99:0] data, output reg [99:0] q); always @(posedge clk) begin if (load) // load q <= data; else if (ena) begin case(ena) 2'b00 : q <= q; // 其实这一行永远不会被执行！所以else分支可以被简化，见下方。 2'b01 : q <= {q[0],q[99:1]}; // 右旋转 （采用分块组合要比使用循环更简便） 2'b10 : q <= {q[98:0],q[99]};// 左旋转 2'b11 : q <= q; default q <= q; endcase end else begin // 当ena为0时执行 保持不变 q <= q; end end endmodule 简化else之后：always @(posedge clk) begin if (load) q <= data; else if (ena == 2'b01) q <= {q[0],q[99:1]}; // 右旋转 else if (ena == 2'b10) q <= {q[98:0],q[99]}; // 左旋转 // 其他情况（ena=2'b00或2'b11）保持不变 endLeft/right arithmetic shift by 1 or 8A 5-bit number 11000 arithmetic right-shifted by 1 is 11100, while a logical right shift would produce 01100. However, there is no difference between logical and arithmetic left shifts. Solutionmodule top_module( input clk, input load, input ena, input [1:0] amount, input [63:0] data, output reg [63:0] q); always @(posedge clk) begin if (load) begin q <= data; end else if (ena) begin case (amount) 2'b00: q <= {q[62:0],1'b0}; 2'b01: q <= {q[55:0],8'b0}; 2'b10: q <= {q[63],q[63:1]}; 2'b11: q <= {{8{q[63]}},q[63:8]}; //注意：位拼接语法 default: q <= q; endcase end end endmodule 5-bit LFSR线性反馈移位寄存器（LFSR） linear feedback shift register LFSR 是一种通过移位寄存器和反馈逻辑生成伪随机序列的电路。 Galois 型 LFSR 的特点：反馈逻辑通过 异或（XOR） 连接特定 “抽头”（tap）位，生成下一个状态的最低位（或最高位，依结构而定）。最大长度 LFSR（maximal-length）的抽头位置经过精心选择，可遍历 $2^n-1$ 个状态（n为位数，全零状态永远不会出现）。在本题中：位数：5 位（输出q[4:0]，q[4]是最高…

Verilog 学习笔记（12）：Counters
type: item
date: 2025-07-25T08:00:00+08:00
description: Four-bit binary counterSolutionmodule top_module ( input clk, input reset, // Synchronous active-high reset output [3:0] q); always @(posedge clk) begin if(reset == 1) q <= 4'b0000; else if(q == 4'b1111) q <= 4'b0000; else q <= q + 1; end endmodule Decade counterSolutionmodule top_module ( input clk, input reset, // Synchronous active-high reset output [3:0] q); always @(posedge clk) begin if(reset == 1) q <= 4'b0000; else if(q == 4'b1001) q <= 4'b0000; else q <= q + 1; end endmodule Decade counter againSolutionmodule top_module ( input clk, input reset, output [3:0] q); always @(posedge clk) begin if(reset == 1) q <= 4'b0001; else if(q == 4'b1010) q <= 4'b0001; else q <= q + 1; end endmodule Slow decade counter暂停功能：仅当 slowena 为高电平时，计数器才会在时钟上升沿递增；否则保持当前值。 Solutionmodule top_module ( input clk, input slowena, input reset, output [3:0] q); always @(posedge clk) begin if(reset == 1) q <= 4'd0; else if(slowena) begin if(q == 4'd9) q <= 4'd0; else q = q + 1; end else q <= q; end endmodule Counter 1-12同步复位：reset 高电平时，时钟上升沿将计数器同步复位到 1。使能控制：enable 高电平时，计数器运行（计数）；enable 低电平时，计数器保持当前值（暂停）。**load 的核心作用:- **立即覆盖当前值**：当 `load=1` 时，无论计数器当前状态如何，都会在下一个时钟上升沿将 `d` 端口的值加载到计数器输出 `Q`。 - **优先级高于 `enable`**：即使 `enable=0`（计数器暂停），只要 `load=1`，计数器仍会加载 `d` 的值。 计数器的四种状态：loadenable计数器行为1X加载 d 的值（例如复位到 1 或回绕到 1）01正常计数（Q = Q + 1）00保持当前值（暂停）10仍加载 d 的值（load 优先级更高）已知：module count4( input clk, input enable, input load, input [3:0] d, output reg [3:0] Q ); Solutionmodule top_module ( input clk, input reset, input enable, output [3:0] Q, output c_enable, output c_load, output [3:0] c_d ); assign c_enable = enable; assign c_load = reset | (Q == 4'd12 && enable); assign c_d = c_load ? 4'b1 : 4'b0; count4 the_counter ( .clk(clk), .enable(c_enable), .load(c_load), .d(c_d), .Q(Q) ); endmoduleCounter 1000题中给出了一个十进制的模块，所以需要使用三次以达到把1000Hz降到1Hz. 已知：module bcdcount ( input clk, input reset, input enable, output reg [3:0] Q );Solutionmodule top_module ( input clk, input reset, output OneHertz, output [2:0] c_enabl…

Verilog 学习笔记（11）：Latches and Flip-Flops
type: item
date: 2025-07-24T14:30:00+08:00
description: D flip-flopClocked always blocks should use non-blocking assignments: <=.Solutionmodule top_module ( input clk, // Clocks are used in sequential circuits input d, output reg q );// // Use a clocked always block // copy d to q at every positive edge of clk always @(posedge clk) begin q <= d; end endmodule D flip-flopsSolutionmodule top_module ( input clk, input [7:0] d, output [7:0] q ); always @(posedge clk) begin q <= d; end endmoduleDFF with resetSolutionmodule top_module ( input clk, input reset, // Synchronous reset input [7:0] d, output [7:0] q ); always @(posedge clk) begin if (reset) begin //复位 q <= 8'b0; end else begin q <= d; end end endmodule DFF with reset value正触发: posedge 负触发: negedgeSolutionmodule top_module ( input clk, input reset, input [7:0] d, output [7:0] q ); always @(negedge clk) begin if (reset) begin q <= 8'h34; end else begin q <= d; end end endmodule DDF with asynchronous reset异步复位The only difference in code between synchronous and asynchronous reset flip-flops is in the sensitivity list——将复位信号写入敏感列表中。 Solutionmodule top_module ( input clk, input areset, // active high asynchronous reset input [7:0] d, output [7:0] q ); always @(posedge clk, posedge areset) begin if (areset) q <= 0; else q <= d; end endmodule DFF with byte enablewire vs. reg特性wirereg存储功能无存储功能，数值由驱动源决定有存储功能，能保持当前值直至下一次赋值赋值方式只能使用连续赋值（如assign语句）只能在initial或always块内赋值使用场景用于连线、组合逻辑输出用于时序逻辑（如触发器）、组合逻辑中的中间变量默认初始值默认值为z（高阻态）默认值为x（未知状态）下面通过两段代码示例，直观展示wire和reg的使用差异：// wire的使用示例 module wire_example; reg a, b; // 输入信号定义为reg类型 wire out; // 输出信号定义为wire类型 // 连续赋值，out的值会随着a和b的变化而立即改变 assign out = a & b; initial begin a = 1'b0; b = 1'b0; #10 a = 1'b1; #10 b = 1'b1; end endmodule// reg的使用示例 module reg_example; reg clk, rst, in; reg out; // 输出信号定义为reg类型，因为在always块中被赋值 // 时序逻辑：在时钟上升沿更新out的值 always @(posedge clk or posedge rst) begin if (rst) begin out <= 1'b0; // 复位时将out置为0 end else begin out <= in; // 时钟上升沿时将in的值赋给out end end initial begin clk = 1'b0; forever #5 clk = ~clk; // 生成周期为10的时钟信号 end …