<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[学渣的博客]]></title><description><![CDATA[成长之路。github地址：https://github.com/wangbohy123/]]></description><link>https://blog.youkuaiyun.com/wangbowj123</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wangbowj123]]></copyright><item><title><![CDATA[一文带你深入理解电路中的亚稳态现象与跨时钟域信号处理]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/118251485</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/118251485</guid><author>wangbowj123</author><pubDate>Sat, 26 Jun 2021 21:19:40 +0800</pubDate><description><![CDATA[前言
亚稳态是一种现象，可以导致数字设备（包括FPGA）出现系统故障。当一个信号在不相关或异步时钟域的电路之间传输时，亚稳态现象较容易出现。本文描述了亚稳性，解释了为什么会出现这种现象，并讨论了它是如何导致设计失败的。由亚稳态引起的平均无故障时间（MTBF）的计算表明设计者是否应该减少此类失败机会的步骤。
亚稳态
数字设备（如FPGA）中的所有寄存器都定义了信号时序要求，允许每个寄存器在其输入端正确捕获数据并产生输出信号。为确保可靠运行，寄存器的输入必须在时钟边沿之前的最短时间（寄存器的建立时间tSUt_{]]></description><category></category></item><item><title><![CDATA[同步FIFO和异步FIFO的实现]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/117778591</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/117778591</guid><author>wangbowj123</author><pubDate>Thu, 10 Jun 2021 17:32:55 +0800</pubDate><description><![CDATA[同步FIFO的实现
首先是同步的实现，只需要一个时钟用来控制读写。
同步 FIFO 实现较为直接，如下图所示，一个 FIFO 内部实现了 RAM 和一个控制读写的控制端，和普通的随机存储器不一样的是，FIFO 内部需要自动产生读写地址。
控制端产生空、满信号。因此如何实现控制端去产生空满信号是主要需要考虑的地方。通常空满的判断是通过读、写地址进行的。

第一种思路，利用读写地址的大小来判断空、满
方法很简单，设置一个信号量 factor 来表识空满，每次读一个数据则令 factor - 1，写一个数据则令其]]></description><category></category></item><item><title><![CDATA[使用 Verilog 实现排序]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/117624834</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/117624834</guid><author>wangbowj123</author><pubDate>Sun, 06 Jun 2021 17:01:22 +0800</pubDate><description><![CDATA[使用Verilog编写电路，实现排序操作。]]></description><category></category></item><item><title><![CDATA[c++和Java数组内存空间申请]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/109791117</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/109791117</guid><author>wangbowj123</author><pubDate>Thu, 19 Nov 2020 00:05:12 +0800</pubDate><description><![CDATA[c++中由于数组导致的内存溢出处理
之前实现图论算法的时候碰到过超大的整型数组，用c++去实现着实会碰到一些莫名其妙的内存溢出问题。
例如：我们想定义一个 2000*2000 的 2d 数组，甚至是这样大小的 2d 的 vector，如果是直接定义成局部变量，那么将会直接报内存溢出错（大家可以计算一下这样大小的数组会占据多少内存空间）。
那么为什么定义成局部变量会导致内存溢出呢？笔者认为是因为程序中函数的调用或者说是运行其实是在栈中执行的，而栈的空间是很有限的，所以说定义过大的局部变量必然导致栈溢出（Sta]]></description><category></category></item><item><title><![CDATA[zynq sdk 开发之通过 BRAM 进行 PL 与 PS 的数据交互]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/108939141</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/108939141</guid><author>wangbowj123</author><pubDate>Tue, 06 Oct 2020 15:54:19 +0800</pubDate><description><![CDATA[如何在 zynq 中进行 PL 端与 PS 端的数据交互？
在zynq的使用中，高效的进行 BRAM 与 zynq 硬核的数据交换至关重要，当我们需要进行小批量的数据交换时，可以考虑采用 BRAM 作为数据交换的媒介，在 PS 端，将数据通过 AXI 总线写入 PL端的 BRAM 里面去，并且再读出来。整体的设计图如下所示：

PL 端硬件的设计
在 vivado 2017.4 下，可以通过 block design 快速进行模块的添加与设计。设计出来的架构如图所示：

注意事项：

BRAM 使用真实双端]]></description><category></category></item><item><title><![CDATA[FPGA 可编程性与布局布线原理探究]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/108923271</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/108923271</guid><author>wangbowj123</author><pubDate>Sun, 04 Oct 2020 22:34:18 +0800</pubDate><description><![CDATA[学习 FPGA 也有了一段时间，在不断 coding 的过程中，对综合、布局布线等操作感到一丝丝的困惑，特将一些个人感悟总结如下：
为什么说 FPGA 是可编程的？
以基于 SRAM 的 FPGA 举例，由于 FPGA 是极其细粒度的架构，无论是怎样的电路，综合到片上之后都将以 LUT 、触发器和 MUX 的结构组成，而一个 k 输入的 LUT 又是由 2k2^k2k 个 SRAM bit 位作为选择输出，从而一个 k 输入的查找表可以配置实现任意 k 输入1输出的组合逻辑，如下图所示。
之所以说 FPGA]]></description><category></category></item><item><title><![CDATA[《计算机体系结构：量化研究方法》读书笔记]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/108922656</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/108922656</guid><author>wangbowj123</author><pubDate>Sun, 04 Oct 2020 21:50:16 +0800</pubDate><description><![CDATA[Lecture 1: Quantitative Approach
1.计算机体系结构与计算机组成原理有什么区别？
计算机的实现包括两个方面：组成和硬件。组成一词包含了计算机设计的高阶内容，例如存储器系统，存储器互连，设计内部处理器 CPU （中央处理器——算术、逻辑、分支和数据传送功能都在内部实现）。有时也用微体系结构一词来代替“组成”。例如AMD Operon和Intel Core I7是两个指令集体系结构相同但组成不同的处理器。这两种处理器都实现X86指令集，但它们的流水线和缓存组成有很大的不同。硬件指]]></description><category></category></item><item><title><![CDATA[verilog实现简单的三级加法流水线]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/107213477</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/107213477</guid><author>wangbowj123</author><pubDate>Wed, 08 Jul 2020 20:24:02 +0800</pubDate><description><![CDATA[pipeline流水线设计是一种典型的面积换性能的设计。一方面通过对长功能路径的合理划分，在同一时间内同时并行多个该功能请求，大大提高了某个功能的吞吐率；另一方面由于长功能路径被切割成短路径，可以达到更高的工作频率，如果不需要提高工作频率，多出来的提频空间可以用于降压降功耗，进可攻退可守。今天这篇文章将小小总结一下流水线设计的一些关键点。]]></description><category></category></item><item><title><![CDATA[基于 PYNQ 的 AXI 总线主从控制编写（ddr3的读写）]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/106084452</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/106084452</guid><author>wangbowj123</author><pubDate>Tue, 12 May 2020 21:34:23 +0800</pubDate><description><![CDATA[菜鸟一枚，最近也学习了关于 AXI 总线的相关知识。基于 PYNQ 编写了一个简单的 AXI 主从控制（牵涉到 DDR3 的读写）。
设计目的
设计出以下一个通过 AXI 总线连接的简单片上系统。包含以下部分：
PL 端逻辑
PL 端实现四个模块包括：


寄存器堆
寄存器堆主要是对指令等控制信息进行片上存储。具体的指令将由 PS 端写入。对于寄存器堆来说，其相当于 slave，而 PS 端的 jupyter 服务器相当于 master。使用的总线是 AXI Lite 总线（棕色的大箭头）。


控制端
控]]></description><category></category></item><item><title><![CDATA[如何实现一个带双边沿检测的触发器]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/105801633</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/105801633</guid><author>wangbowj123</author><pubDate>Mon, 27 Apr 2020 22:51:11 +0800</pubDate><description><![CDATA[这是一道 HDLBits 上面的题目（Probelm 97 Dual-edge triggered flip-flop）。
目的是实现一个带双边沿检测的触发器。我们知道，FPGA上是没有带双边沿检测的触发器的，即不存在这样的写法：

always @(posedge clk or negedge clk)

哪怕写了，没有这样的资源也实现不了，无法综合。那么我们怎么通过硬件电路设计去实现下面的时序...]]></description><category></category></item><item><title><![CDATA[hdlbits 练习汇总]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/105677327</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/105677327</guid><author>wangbowj123</author><pubDate>Wed, 22 Apr 2020 11:25:31 +0800</pubDate><description><![CDATA[最近发现一个很有意思的网站，可以在线提交 verilog 代码以完成一些任务，并且还能得到仿真结果对比。可以利用零碎时间提交一些代码，练习verilog基础知识。
网址如下：
https://hdlbits.01xz.net/wiki/

从 basics 开始对提交的答案进行汇总。（本博客会不断更新）
//03_Wire.v
module top_module( input in, output...]]></description><category></category></item><item><title><![CDATA[单时钟同步 FIFO 和二时钟异步 FIFO 的基本原理和实现]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/105628153</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/105628153</guid><author>wangbowj123</author><pubDate>Mon, 20 Apr 2020 11:05:46 +0800</pubDate><description><![CDATA[学习目的：

1.给大家介绍FIFO的基本原理和组成。
2.学习同步单时钟FIFO、二时钟异步FIFO的分析以及编写。
3.以实例体验如何将实际需求分析转换成代码。

FIFO（First In First Out)队列通常在数字系统中实现两个模块间数据的暂存，达到减少两模块之间的速度依赖，使得两个模块能够相互相对独立的运行。
FIFO是FPGA设计的一个非常基本的单元。FIFO一般用一个双口RAM和分别指示...]]></description><category></category></item><item><title><![CDATA[基于FPGA的卷积加速]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/105607708</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/105607708</guid><author>wangbowj123</author><pubDate>Sat, 18 Apr 2020 23:32:46 +0800</pubDate><description><![CDATA[基于FPGA的卷积并行加速其实有很多方法，例如脉动阵列、加法树等操作。本篇博客将介绍一下基于加法树的并行化设计。
其实总体原理也是很简单的。如下图所示，九个叶子节点是乘法器节点，分别代表九次乘法运算（卷积核是3*3的）。在得到乘法运算结果之后，将结果传送给加法节点。

为了进一步增加并行性，加法树结构采用三叉树。即，对每三个子节点进行求和。最终得到一个部分和。
实现方式是写一个加法器模块，再写一个...]]></description><category></category></item><item><title><![CDATA[CUDA 并行加速基础之 Reduce 和 Scan 的实现]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/105521175</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/105521175</guid><author>wangbowj123</author><pubDate>Tue, 14 Apr 2020 21:28:19 +0800</pubDate><description><![CDATA[前言
我们知道硬件拥有其独特的并行性，为了发挥这一特色。我们要将平时串行执行的程序用并行性算法重新改写才能充分发挥 GPU 的优势。

实例：做求和：1+2+3+4+···

为了做这样一个累加和的加速，有两种简单的实现方法，分别是 Redece 进行归约（二分），或者是用 Scan 通过控制步长进行扫描求和。
Reduce

如上图所示为了并行执行累加，我们要构造出一些线程，每个线程并行工作，从...]]></description><category></category></item><item><title><![CDATA[CUDA之三种访存模式与代码测试]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/105516416</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/105516416</guid><author>wangbowj123</author><pubDate>Tue, 14 Apr 2020 17:26:38 +0800</pubDate><description><![CDATA[GPU 硬件架构具有三层的存储结构，分别是：**线程私有存储、线程块共享存储、全局存储**。访问速度自然是由快到慢。CUDA 程序编写的一个重要理念也是尽可能少的访问全局缓存。本博客将编写代码分别对三种访存模式进行相应的简单测试。]]></description><category></category></item><item><title><![CDATA[CUDA 编程之对原子操作与并行性的理解]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/105514893</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/105514893</guid><author>wangbowj123</author><pubDate>Tue, 14 Apr 2020 16:44:24 +0800</pubDate><description><![CDATA[相关概念
CUDA 的原子操作可以理解为对一个变量进行“读取-修改-写入”这三个操作的一个最小单位的执行过程，这个执行过程不能够再分解为更小的部分，在它执行过程中，不允许其他并行线程对该变量进行读取和写入的操作。基于这个机制，原子操作实现了对在多个线程间共享的变量的互斥保护，确保任何一次对变量的操作的结果的正确性。
原子操作确保了在多个并行线程间共享的内存的读写保护，每次只能有一个线程对该变量进行...]]></description><category></category></item><item><title><![CDATA[第一行 CUDA 代码之GPU架构理解与代码编写]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/105514084</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/105514084</guid><author>wangbowj123</author><pubDate>Tue, 14 Apr 2020 16:25:34 +0800</pubDate><description><![CDATA[CUDA 编程之软硬件结构的相关概念
首先是对 CUDA 编程中可能会遇到的各种概念进行简单总结。如对 Kernel、Grid、Device、Host、Thread、Thread Block、SM 等部件进行梳理并且阐明相互之间的关系，并且牵涉到CUDA编程的基本理念与基本方法。最后写下CUDA的并行计算的简单入门代码。]]></description><category></category></item><item><title><![CDATA[字符串高级操作——利用链表进行文本单词频率统计]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/88082748</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/88082748</guid><author>wangbowj123</author><pubDate>Mon, 13 Apr 2020 13:32:54 +0800</pubDate><description><![CDATA[现有一片英语短文，要求用c语言实现对该文章的词频统计，即利用文件读写方法，提取文本中的每一个单词之后通过算法统计其出现频率，并输出到另外的文件中。
短文如下：

Of all the changes that have taken place in English-language newspapers during the past quarter-century, perhaps the mo...]]></description><category></category></item><item><title><![CDATA[I2C 总线操纵 EEPROM]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/104921058</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/104921058</guid><author>wangbowj123</author><pubDate>Tue, 17 Mar 2020 15:27:27 +0800</pubDate><description><![CDATA[现如今对 FPGA 的基础已经有了一定的了解，并且进入到了总线操纵的学习中来。近一段时间打算更几篇关于总线操作的博文，首先从简单的 I2C 接口对 EEPROM 的操作开始。
何为总线？

总线（Bus）是计算机各种功能部件之间传送信息的公共通信干线，它是由导线组成的传输线束，按照计算机所传输的信息种类，计算机的总线可以划分为数据总线、地址总线和控制总线，分别用来传输数据、数据地址和控制信号。总线...]]></description><category></category></item><item><title><![CDATA[如何去设计一个深度学习加速器？]]></title><link>https://blog.youkuaiyun.com/wangbowj123/article/details/104592129</link><guid>https://blog.youkuaiyun.com/wangbowj123/article/details/104592129</guid><author>wangbowj123</author><pubDate>Sun, 01 Mar 2020 15:02:22 +0800</pubDate><description><![CDATA[How to make your own deep learning accelerator chip!
Currently, there are more than 100 companies all over the world building ASICs (Application Specific Integrated Circuit) or SOC’s (System on Chip) ...]]></description><category></category></item></channel></rss>