- 博客(61)
- 收藏
- 关注
原创 【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计
本文介绍了Verilog语法在FPGA设计中的学习与应用,重点展示了位操作和参数化设计方法。首先通过计数器实验升级实现8个LED灯循环闪烁,提供了移位法、循环移位和3-8译码器三种实现方案。文章详细讲解了各版本的代码实现、功能仿真及板级调试要点。在参数化设计部分,演示了如何通过parameter定义常量和defparam参数传递,实现了4个LED不同频率闪烁的设计。实验过程中还分享了调试经验,如仿真时间调整和注意事项。最后展示了多LED不同频率控制的具体实现代码。
2023-08-25 15:35:50
1949
1
原创 【FPGA】计数器 —— 时序逻辑
本文介绍了使用Verilog设计一个每1秒闪烁一次的LED灯(亮灭各500毫秒)的实现过程。首先解释了时序逻辑概念和D触发器的记忆特性,然后详细设计了计数器模块,计算得出50MHz时钟下需要25×10^6次计数。代码实现分为两部分:计数器逻辑和LED状态切换逻辑,采用非阻塞赋值和复位控制。通过功能仿真验证设计正确性,最终生成比特流文件用于板级调试。文中还分享了Verilog的时序逻辑语法要点和调试经验。
2023-08-25 15:24:30
944
原创 【FPGA】 3-8译码器 —— 组合逻辑 | 熟悉语法及开发环境
本文介绍了基于Vivado的FPGA开发流程,重点讲解了3-8译码器的设计与实现。主要内容包括:1) 创建工程和设计输入,通过Verilog编写3-8译码器模块,介绍了always块、case语句和位拼接等语法;2) 分析综合与功能仿真,使用测试文件验证设计正确性;3) 板级调试,包括IO引脚分配、布局布线及最终烧录。文章还特别强调了reg类型在always块中的必要性,以及多种数值表示方法的选择标准。整个流程展示了从代码编写到实际硬件实现的完整FPGA开发过程。
2023-08-25 15:13:31
1053
原创 【FPGA】FPGA入门 —— 基本开发流程
本文介绍了FPGA入门的基本开发流程和实例。主要内容包括:1)FPGA基础知识,如Verilog语法、状态机设计和常见接口;2)完整开发流程:设计定义、代码编写、综合、功能仿真、布局布线、性能分析和板级调试;3)以二选一多路器为例,演示从代码编写、仿真验证到板卡下载的全过程。文章重点强调了仿真在FPGA开发中的重要性,指出设计人员超过50%的时间用于仿真调试。通过具体实例展示了如何使用EDA工具完成FPGA设计,包括测试激励编写、时序仿真和硬件调试等关键环节。
2023-08-25 14:55:50
5422
3
原创 【FPGA】从计数器到可控线性序列机
本文介绍了LED实验的六个进化阶段:从简单的周期性亮灭控制,到多LED独立亮灭模式控制。每个阶段逐步提升难度,展示了如何通过Verilog实现不同LED控制功能。文章详细给出了前三个阶段的Verilog代码实现和仿真结果,包括单周期亮灭控制、复杂时序控制以及用户自定义模式控制。实验采用计数器实现精确时序控制,并通过仿真验证了设计正确性。该实验有助于理解数字电路设计和Verilog编程。
2022-09-22 21:59:56
760
原创 【C++】多态 —— 条件 | 虚函数重写 | 抽象类 | 多态的原理
多态是面向对象编程的重要特性,分为静态多态(函数重载)和动态多态(虚函数重写)。动态多态需要满足两个条件:通过基类指针/引用调用虚函数,且子类对父类虚函数进行重写(函数名、参数、返回值相同)。文中通过买票示例演示多态实现,并详细探讨了虚函数重写的特殊情况(协变和析构函数重写),指出动态申请子类对象时父类指针需要虚析构函数以确保正确释放资源。此外还分析了只有父类带virtual的语法现象,并介绍了C++11的final和override关键字。多态机制实现了"同一接口,不同行为"的编程思想
2022-07-02 16:11:52
2316
22
原创 【Linux】基础IO —— 系统文件IO | 文件描述符fd | inode | 重定向原理 | 缓冲区 | 软硬链接
本文摘要:探讨基础IO操作的系统级实现。从C/C++语言层面的文件操作回顾入手,重点分析系统调用接口open/close的实现原理。通过对比fopen与open函数的参数设计,解释Linux文件权限管理和标志位传递机制(如O_CREAT与O_WRONLY的位运算组合)。指出语言层面的文件操作最终都需通过操作系统系统调用访问硬件资源,体现"Linux一切皆文件"的设计哲学。文章还涉及文件描述符、inode和软硬链接等核心概念,为深入理解文件系统奠定基础。(150字)
2022-05-22 11:24:05
1599
18
原创 【C++】继承 —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承
本文介绍了C++继承的基本概念和使用规则。继承是面向对象程序设计实现代码复用的重要手段,允许派生类在保持基类特性的基础上进行功能扩展。文章讲解了继承的访问限定规则,指出通常采用public继承方式。重点分析了继承中的成员访问权限变化,强调父类private成员在子类不可见。通过赋值兼容规则说明子类对象可以赋值给父类对象/指针/引用(称为切片),但反向赋值需要强制类型转换且存在风险。最后阐述了继承作用域中的隐藏现象,即子类与父类同名成员会优先访问子类成员,需通过作用域指定才能访问父类成员。
2022-04-21 07:45:00
2923
35
原创 【C++】模板进阶 —— 非类型模板参数 | 特化 | 模板的分离编译
本文主要介绍了C++模板的进阶用法,包括非类型模板参数和模板特化。非类型模板参数允许使用整型常量作为模板参数,实现静态栈等场景下的灵活控制。模板特化分为函数模板特化和类模板特化,其中类模板特化又包含全特化和偏特化两种形式。全特化针对所有模板参数进行特殊处理,而偏特化可以是对部分参数特化或对参数类型进一步限制(如指针/引用类型)。特化机制可以有效解决模板在特定类型下处理不当的问题,为不同数据类型提供定制化实现。
2022-04-16 11:45:00
4257
34
原创 【C++】优先级队列 priority_queue的使用及模拟实现@STL —— 仿函数
本文介绍了优先级队列(priority_queue)的使用与模拟实现。优先级队列是一种容器适配器,默认基于vector实现大堆结构(通过less仿函数控制)。文章详细讲解了优先级队列的常见操作(push、pop、top等)及其时间复杂度,并通过LeetCode例题展示了不同解法(排序、大堆、小堆)。同时深入剖析了优先级队列的底层实现机制,包括仿函数的使用(Less/Greater)以及堆调整算法(向上/向下调整)。最后提供了优先级队列的完整模拟实现代码,帮助读者理解其内部工作原理。
2022-04-12 16:09:45
934
25
原创 【Linux】进程控制 —— 进程创建 | 进程退出 | 进程等待 | 进程程序替换 | 实现简易shell
本文介绍了进程控制相关内容,包括进程创建、退出和等待机制。在进程创建部分,详细讲解了fork函数的实现原理和写时拷贝机制,分析了fork的使用场景和失败原因。进程退出部分阐述了三种退出场景及退出码意义,对比了return、exit和_exit三种退出方式的区别。进程等待部分说明了父进程通过wait/waitpid获取子进程状态的必要性,并演示了wait函数清除僵尸进程的过程。最后指出这些知识有助于理解shell的工作原理,为后续实现简易shell打下基础。
2022-04-10 22:13:06
3899
39
原创 【C++】stack和queue的经典题目&模拟实现@STL
本文介绍了栈(stack)和队列(queue)的基本概念,并通过三个经典题目展示了栈的实际应用。首先说明了stack是先进后出的容器适配器,不支持迭代器。然后详细讲解了: 最小栈问题 - 通过辅助栈在O(1)时间内获取最小值 栈的压入弹出序列 - 使用栈模拟给定的出入栈顺序 逆波兰表达式求值 - 利用栈计算后缀表达式 每个问题都给出了示例图解和对应的C++代码实现,体现了栈"后进先出"的特性在算法中的灵活运用。
2022-04-07 07:00:00
1582
23
原创 【C++】list的模拟实现@STL —— 迭代器
本文模拟实现C++中的list数据结构,重点讲解了迭代器的设计原理。list采用带头双向循环链表结构,支持O(1)时间复杂度的任意位置插入删除。文章详细剖析了迭代器的实现方式:通过封装节点指针并重载运算符(如解引用*、箭头->、自增++等)来模拟指针行为。对于const迭代器,巧妙利用模板参数避免代码冗余。同时展示了如何实现begin()/end()等接口,以及处理内置类型与自定义类型的不同访问方式。测试代码验证了迭代器的读写功能,体现了通过运算符重载实现类型抽象的思想。
2022-04-03 16:40:51
3509
41
原创 【Linux】环境变量
本文介绍了环境变量的概念及其在Linux系统中的重要作用。环境变量是操作系统运行环境的关键参数,如PATH指定命令搜索路径,HOME指定用户主目录。通过echo、export等命令可以查看和设置环境变量。本地变量则仅对当前会话有效。文章还解释了命令行参数argc和argv的作用,展示了如何通过代码获取环境变量,以及环境变量在程序中的组织方式(字符指针数组)。最后对比了环境变量与本地变量的区别,并演示了如何通过选项参数实现程序的不同功能。
2022-03-27 08:00:00
1663
23
原创 【C++】vector的使用及经典题目解题报告@STL
只出现一次的数字i,ii,iii, 删除有序数组中的重复项,杨辉三角,电话号码组合
2022-03-25 15:33:26
3349
24
原创 【C++】vector的模拟实现@STL —— 迭代器失效问题
本文模拟实现STL中的vector容器,重点解析迭代器失效问题。首先介绍了vector的成员变量_start、_finish和_endofstorage的作用,等同于传统顺序表的_a、_size和_capacity。随后详细讲解了构造函数、析构函数、基本接口(size/capacity/[]/迭代器)、尾插尾删(push_back/pop_back)以及reserve/resize的实现要点,特别强调了深拷贝问题和扩容时的注意事项。最后给出了迭代器区间构造、拷贝构造等方法的实现,并提醒使用函数模板时要注意迭
2022-03-22 15:43:35
1695
27
原创 【C++】string类的模拟实现@STL —— 深浅拷贝
本文介绍了C++中string类的模拟实现,重点探讨了深浅拷贝问题。主要包括构造/拷贝构造/赋值重载/析构函数的传统与现代两种写法:传统写法需手动管理内存,现代写法通过复用构造实现简洁代码。文章还详细讲解了size/capacity、c_str、[]重载、迭代器等基础接口的实现,以及reserve/resize扩容机制。通过代码示例和内存图例,清晰展示了string类核心功能的实现要点与注意事项。
2022-03-16 21:43:35
2184
28
原创 【Linux】进程概念 —— 冯诺依曼体系结构 | 操作系统 | 进程
本文主要介绍了计算机系统中的进程概念及相关知识。 首先从冯诺依曼体系结构出发,说明CPU与内存的关系,指出内存是体系结构的核心设备。 然后介绍操作系统的定位和作用:管理软硬件资源,为用户提供稳定高效的运行环境。通过"先描述,再组织"的理念进行管理。 重点讲解进程的概念:操作系统通过进程控制块(PCB)描述进程,在Linux中表现为task_struct结构体,包含进程状态、优先级、内存指针等属性。 说明进程的组织方式:用双向链表将PCB组织起来,使进程管理变为对数据结构的操作。 提供查看
2022-03-14 15:53:13
4942
31
原创 【C++】string类@STL
这篇文章主要介绍了C++ STL中的string类,内容涵盖以下几个方面: string类的本质是basic_string类模板的实例化,底层采用类似顺序表的结构实现 解释了字符串编码差异(ASCII与Unicode),说明类模板存在的必要性 重点讲解了string类的构造函数、析构函数和赋值重载操作 详细说明容量相关操作: size()和length()的区别及使用建议 capacity()的含义 resize()和reserve()的功能差异 强调学习STL时要勤查文档(推荐cplusplus.com网
2022-03-06 10:18:07
1070
24
原创 【C++】C/C++ 内存管理 —— new和delete底层实现原理
C/C++内存管理主要分为内存分布和动态内存管理方式。内存分布包括栈、堆、内存映射段等区域,其中栈存储局部变量,堆用于动态内存分配。动态内存管理在C语言中使用malloc/free等函数,而C++使用new/delete操作符。对于内置类型,两者功能类似;对于自定义类型,new/delete会自动调用构造函数和析构函数,比malloc/free更高效。内存分配时需注意类型匹配,如new对应delete,new[]对应delete[]。C++的new还支持初始化动态内存空间,改善了C语言内存管理的不足。
2022-03-02 11:43:12
2916
17
原创 【C++】模板初阶 —— 泛型编程
本文介绍了C++模板的基础知识,主要包括泛型编程的概念、函数模板和类模板的使用方法。泛型编程编写与类型无关的通用代码,模板是其基础。函数模板通过编译器根据实参类型自动生成特定版本的函数,支持隐式和显式实例化。类模板解决了数据类型多样化的问题,实例化时必须显式指定类型。文章还探讨了模板参数匹配规则,当普通函数与模板函数同名时优先调用普通函数,但模板能更好匹配时会选择模板。模板技术提高了代码复用率和可维护性,是C++编程的重要工具。
2022-03-01 20:34:07
1262
17
原创 【Linux】Linux环境基础开发工具使用 —— yum | vim | gcc & g++ | gdb | make & makefile | 进度条 | git
本文介绍Linux环境下两种基础开发工具的使用方法。第一部分讲解软件包管理器yum,包括查看软件包(yum list)、安装软件(yum install)和卸载软件(yum remove)的基本操作,并推荐了一些实用软件如sl小火车、cowsay和lrzsz。第二部分详细说明vim编辑器,介绍其三种模式(命令模式、插入模式和底行模式)的切换方法,以及命令模式下光标移动、文本操作(复制/删除/修改)、撤销恢复等常用指令。文章还补充了vim双屏操作等实用技巧,为Linux环境下的开发工作提供基础工具指导。
2022-02-27 21:58:52
15614
29
原创 【C++】类和对象(下)—— 再谈构造函数 | static成员 | C++11初始化补丁 | 友元
本文探讨了C++构造函数中的初始化列表和explicit关键字。主要内容包括: 初始化列表的必要性 - 针对const成员、引用成员和没有默认构造的自定义类型成员必须使用初始化列表; 初始化列表的优势 - 对自定义类型成员更高效; 初始化顺序规则 - 由成员声明顺序决定; explicit关键字的作用 - 禁止单参数构造函数的隐式类型转换。 通过代码示例展示了不同初始化方式的效率差异,并分析了类成员初始化时的顺序问题。文章建议尽量使用初始化列表,保持声明与初始化顺序一致,合理使用explicit避免潜在问题
2022-02-25 19:28:17
1474
18
原创 【典例】二叉树递归结构经典题目合集@二叉树
二叉树经典题目解析 本文总结了5道经典的二叉树递归遍历题目: 单值二叉树 - 判断所有节点值是否相同,通过比较根与左右子树的值 相同二叉树 - 比较两棵树的结构和节点值是否完全一致 镜像二叉树 - 判断是否为对称二叉树,实际上是相同二叉树的变形 另一棵树的子树 - 通过递归比较root的每个子树与subTree是否相同 翻转二叉树 - 递归交换左右子树的位置 这些题目都体现了递归的核心思想:处理当前节点,递归处理左子树和右子树。解题关键在于: 明确递归终止条件 拆分问题为当前节点处理和子问题递归 合理利用辅
2022-02-13 20:06:41
1398
11
原创 【DS】树&二叉树链式结构及实现@二叉树 —— 前中后序遍历 | 求节点个数高度等 | 层序遍历&判断是否是完全二叉树
本文介绍了树和二叉树的基本概念与结构。树是一种非线性递归数据结构,由根节点和子树构成,具有层次关系。文章详细讲解了节点的度、父节点、子节点、兄弟节点等概念,并比较了不同树的表示方法,重点推荐了左孩子右兄弟表示法。二叉树是度为2的有序树,文章区分了满二叉树与完全二叉树,并推导了相关性质公式。在存储结构方面,顺序存储适合完全二叉树,而非完全二叉树更适合链式存储。堆等特殊二叉树将另文详述。
2022-02-12 10:23:00
954
19
原创 设计循环队列@Leetcode —— 栈和队列
本文介绍了循环队列的两种实现方式:循环链表和数组。循环队列能够重复利用空间,常用于生产者-消费者模型等场景。无论哪种实现,都需要额外开辟一个空间来区分队列空和满的状态。 循环链表实现时,需注意节点连接和判空判满条件。数组实现的关键在于下标控制,通过模运算确保下标有效。两种实现都需要处理队尾元素的获取逻辑,数组实现还需特别注意判满条件的判断。 代码示例展示了两种实现的具体操作,包括创建、入队、出队、获取队头队尾元素以及判空判满等功能。两种方式各有特点,循环链表实现更直观,数组实现则更注重下标控制。
2022-02-09 19:29:55
830
14
原创 【DS】两个队列实现栈&两个栈实现队列@Leetcode —— 栈和队列
本文探讨了如何用栈和队列相互实现对方的数据结构特性。通过两个队列实现栈时,关键在于将前n-1个元素转移到另一个队列,最后弹出剩余元素;而用两个栈实现队列时,则需要将一个栈的元素全部转移到另一个栈以实现先进先出。文章详细分析了两种实现方式的思路,并提供了完整的代码实现,同时强调了内存管理和函数接口设计中的注意事项。这些经典题目展示了数据结构之间的相互转换关系,有助于加深对栈和队列特性的理解。
2022-02-08 17:57:55
6364
13
原创 括号匹配问题@Leetcode —— 栈和队列
本文介绍了括号匹配问题的解决方案。通过使用栈结构实现:遇到左括号入栈,遇到右括号则与栈顶元素匹配。需要考虑两种特殊情况:栈不为空时说明存在未匹配的左括号;遇到右括号时栈为空说明没有匹配的左括号。文中提供了完整的C语言实现代码,包括栈的基本操作和括号匹配的核心逻辑,最终返回匹配结果并在退出前释放栈内存。该算法有效解决了括号匹配问题。
2022-02-07 20:49:42
8948
6
原创 【Linux】Linux权限管理 —— shell运行原理 | 权限 | 目录权限 | 粘滞位 | 权限掩码umask
怎么就累了,倦了,相忘了
2022-02-01 15:12:41
4487
18
原创 【Linux】Linux基本操作指令
本文介绍了Linux系统中常用的基本操作指令,主要包括: ls指令:列出目录内容,常用选项包括-l(详细信息)、-a(显示隐藏文件)、-d(显示目录属性)等。 pwd指令:显示当前工作目录路径。 cd指令:切换目录,支持绝对路径和相对路径,还能使用"cd -"返回最近访问目录,"cd ~"进入用户家目录。 touch指令:创建普通文件。 文章以实际命令示例配合截图,直观展示了各指令的使用方法和效果。这些指令是Linux系统操作的基础,掌握它们对日常的文件管理和目录操作
2022-01-26 18:54:43
22202
39
原创 【C++】类和对象(上)—— this指针
本文介绍了C++中类和对象的基本概念,主要从以下几个方面展开: 面向过程和面向对象的区别 C语言是面向过程,关注函数调用过程 C++基于面向对象,关注类对象及其关系 类的定义与访问限定符 使用class/struct定义类 通过访问限定符(public/protected/private)实现封装 默认访问权限:class为private,struct为public 类的对象存储方式 对象只存储成员变量 成员函数存放在公共代码段 空类占用1字节空间 类对象大小计算 遵循内存对齐原则 与C语言结构体内存对齐规
2022-01-17 07:22:58
1187
21
原创 【C++】C++入门 --- 命名空间 | 输入输出 | 缺省函数 | 函数重载 | 引用 | 内联函数 | auto关键字 | 基于范围的for循环 | 指针空值
本文摘要: C++基于C语言扩展,针对其命名冲突等问题引入命名空间(namespace)机制。命名空间允许定义隔离的变量、函数和类型,通过域作用限定符(::)访问,支持嵌套和合并。文中还介绍了C++输入输出示例,如cout和endl的使用,并对比了三种命名空间使用方式:指定访问(::)、部分展开(using)和全部展开(using namespace)。命名空间有效解决了代码复用中的标识符冲突问题,是C++的重要特性之一。
2022-01-15 21:55:28
1198
27
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人