- 博客(327)
- 收藏
- 关注
原创 数字IC秋招-基础/SOC/计算机体系结构
这个感觉总是会问到,最常用的就是AHB和AXI,最好能把有哪几个模块、有哪些信号,读写数据几种模式(单次、突发)的时序图简单叙述出来,以及这两种总线各自的特点。
2022-07-24 12:00:26 2202 2
原创 数字IC秋招---手撕代码
`timescale 1ns / 1ps//异步复位,同步释放module arst_srel( input clk, input rst_n, input a, output reg b ); reg rst_n_dy1,sys_rst_n; always @(posedge clk or negedge rst_n) begin if(!rst_n)begin rs
2022-05-10 21:36:58 2704
原创 数字IC秋招---笔试记录
1、如果在多个initial里面并行的在同一时刻对同一个变量进行赋值,当#数量相同时,就是下面的initial块起作用,否则就是#数量多的起作用。例如:左图在20时刻,b = 10;右图在20时刻,b = 20。2、写一个N倍频的仿真模型。............
2022-04-09 15:44:52 3081 5
原创 待整理笔记
一、对FPGA以太网传输的理解就以ZYNQ开发板为例,板子上有一个PHY芯片,它相当于物理层,我们的MAC模块需要和该芯片连接。MAC和PHY之间的连接有一定的接口标准,比如MII接口。后者会将从MAC模块接受到的信号做一定的转换,然后通过如RJ45设备接口将信号发送到接收端。接收端的RJ45接口也会将接收到的数据做一定转换,然后发送到自己端的PHY芯片,然后PHY将信号再通过MII接口发送给自己端的MAC芯片。MAC芯片会对接收到的信号进行解析,获取发送端想要传输的信号!!!其实这两端是对称的,数
2021-04-01 21:04:31 1763 1
转载 握手信号valid/ready的打拍技巧
valid和ready信号,尤其是ready信号的时序一般很差,因为它通常是接收端通过组合逻辑输出的。当流水线的级数较多时,ready反压信号一级一级往前传递,时序将会变得更差。为了优化时序,通常需要对valid和ready信号进行打拍处理。但是由于握手信号的特点,使得这两个信号直接打拍时会发生协议错误,此时就需要使用一些技巧来解决这个问题。Forward Register Slice:仅处理valid和data信号的打拍Backward Register Slice:仅处理ready信号的打拍。
2023-07-06 21:07:11 3189 2
原创 电路中视频图像的缓存方式
以3x3的窗口为例,因为它跨越了多行,所以要想在同一时刻得到窗口内的所有9个像素值,必须对前两行的像素进行缓存,当第三行的像素开始输入时,缓存在line_buffer中的前两行的像素也跟着输出,这样就实现了在同一时刻得到分布存在于三个行的像素数据。像素缓存适用于算法只涉及到同一行中的前后两个像素或者多个像素的情况,那么此时可以直接使用寄存器对输入的数据进行打拍,当需要使用的最后一个像素有效时,就可以按照算法执行相应的计算了。
2023-04-02 14:46:04 994
原创 那些你必须知道的屏幕像素排列方式
屏幕的显示与我们的生活息息相关,日常生活中使用到的各类电子产品,如手机、电脑等的屏幕显示效果都直接影响到了使用体验。我们通常使用的屏幕分为两种类型,一种是LCD屏,即有背光板的液晶屏,一种是OLED屏,每个像素点自发光。LCD与OLED屏相比,相同分辨率同尺寸的LCD屏会比OLED屏更清晰,锯齿感更弱,这取决于OLED屏幕的排列方式。在观看手机或者电脑的测评视频时你可能会经常听到博主说某个产品的屏幕采用的是“钻石排列”、“周冬雨排列”等,这就是上述的屏幕像素排列方式,它会直接影响屏幕的显示效果。
2023-04-01 12:23:17 13773
原创 毕设学习笔记之CABAC
不止如此,上下文存储器更新模块也是,读写存储器的逻辑是并行的,但是一旦各bin之间有关系,需要使用电路中的mux,就也是增加了上下文模型更新的级联逻辑,会降低系统时钟频率。严谨点就是,这两种编码模式可以使用LU和MU,但是rLPS更新级需要改变,那个查表肯定不能是pstate和range所有相乘结果的表,而应该根据具体的编码模式,将表中所有的数据修改成2或者0。①这只是不同作者自己设计的级联结构,目前作者的设计情况是相邻的两三个U是完全并行的,但是相连的三组U,是级联的,所以严格来说并不是完全的并行结构。
2022-10-12 16:02:40 1602 4
原创 不同相频关系时钟的跨时钟域问题
本文摘自:硬件架构的艺术 57-63页如果多个时钟都起源于同一时钟,并且它们的相位和频率关系是已知的,那么这些时钟可以看成是跨同步时钟域的时钟。按照相位和频率的关系,可以将这些时钟分成以下类型:同频零相位差时钟同频恒定相位差时钟非同频可变相位差时钟-整数倍时钟-有理数倍时钟假定两个时钟之间的相位和时钟抖动相同,并假定它们之间的路径已经按同样的时钟延迟和偏移参数进行了平衡。除此之外,还假设这两个时钟起始处的相位差为零,而且触发器的“时钟到Q端”的延时也为零。1 同频零相位差时钟在此种情
2022-01-21 21:58:03 5862
原创 系统如何进行面积优化和速度优化?
一、面积优化系统进行面积优化其实就是进行资源优化,主要有以下三种方向:串行化逻辑优化资源共享二、速度优化系统进行速度优化其实就是提高系统的运行速度,主要有以下几种方向:使用流水线寄存器配平关键路径优化并行化消除代码的优先级具体的内容可以参考以下文章:数字电路基础:系统设计优化...
2021-12-23 19:31:28 3055
原创 ROM/PROM/EPROM/EEPROM/RAM/SRAM/DRAM/SDRAM/FLASH
一、ROM只读存储器(Read-Only Memory,ROM)以非破坏性读出方式工作,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。ROM所存数据通常是装入整机前写入的,整机工作过程中只能读出,不像随机存储器能快速方便地改写存储内容。ROM所存数据稳定 ,断电后所存数据也不会改变,并且结构较简单,使用方便,因而常用于存储各种固定程序和数据。二、https://jingyan.baidu.com/article/656db9189de36ee3
2021-12-23 18:40:29 5172
原创 时序违例的原因及其解决办法
有关数据传输模型的知识请参考之前的文章:数据传输模型。一、时序违例的原因时序违例的主要原因是建立时间和保持时间不满足要求,那么什么情况下会出现建立时间和保持时间不满足要求呢?建立时间不满足要求通常是因为组合逻辑处理时间太长!保持时间不满足要求通常是因为组合逻辑处理时间太短!建立时间和保持时间都不满足往往出现在异步时钟域中!二、时序违例的解决办法解决建立时间不满足的方法有如下∶加强约束,重新进行综合,对违规的路径进行进一步的优化,但是一般效果可能不是很明显降低时钟的频率,但是
2021-12-21 20:04:39 15964 1
原创 异步FIFO格雷码及同步相关问题?
零、前言关于异步FIFO如何设计请参考之前的一篇文章:手写异步FIFO。关于异步FIFO的空满现象可以参考:你真的理解异步FIFO读写中的空满现象吗?一、格雷码的作用格雷码的每两个相邻码字只有1bit的变化,将多bit的地址转换成对应的格雷码然后进行跨时钟域的传递,就可以直接使用两级flop进行同步。并且由于只有一个bit变化,那么即使采样错误也只有一种错误的可能,也即1变成了0或者0变成了1,不会出现其他各种不稳定的状态。而且应用到异步FIFO的地址指针中,采样到的只有一个bit不同的错误
2021-12-20 15:38:59 3307
转载 FIFO的深度你会计算吗?
作者:星雨夜澈出处:http://www.cnblogs.com/dxs959229640/数字IC设计中我们经常会遇到这种场景,工作在不同时钟域的两个模块,它们之间需要进行数据传递,为了避免数据丢失,我们会使用到FIFO。当读数据的速率小于写数据的速率时,我们就不得不将那些还没有被读走的数据缓存下来,那么我们需要开多大的空间去缓存这些数据呢?缓存开大了会浪费资源,开小了会丢失数据,如何去计算最小FIFO深度是我们讨论的重点。数据突发长度(burst length)在讲解如何去计算FIFO深.
2021-12-19 20:09:55 1886
原创 你真的理解异步FIFO读写中的空满现象吗?
一、为什么在wclk时钟域判断是否满,而在rclk时钟域判断是否空?首先需要知道的是,rptr同步到wclk时钟域是需要时间的,也就是读地址的变化不能立刻在wclk时钟域被感知到。1、假设我们在wclk时钟域判断是否满当FIFO满后,如果此时又发生了读操作,rptr更新,并且FIFO由满变不满了;当wclk和rclk频率比较接近或者wclk频率比较低时,此时在写时钟域可能不能及时采样到新的rptr,那么就会还认为FIFO是满的。其实这种情况就是我们说的 假满 ,也即明明不满却满信号有效。假满是不影
2021-12-18 19:39:32 6173
原创 FIFO设计中与深度depth相关的问题
一、前言关于异步FIFO的知识请参考之前的一篇文章:手写异步FIFO二、问题描述如果FIFO的深度不是2的幂次,那么格雷码其实是不连续的,也即在最大值跳变到最小值时不止一个bit发生了变化。当然你也可以设计一个深度略大的,并且是2的幂次的FIFO,但是这样其实是浪费资源的。例如我们需要一个深度为10的FIFO,此时我们可以设计一个深度为16的FIFO,但是这样会浪费资源。那么我们应该怎么办呢?三、问题解决其实我们可以换一个思路,通过观察下表不难发现,格雷码具有对称性。0-15这16个格雷码,如果
2021-12-16 12:05:12 3041
原创 动态和静态时序模拟的优缺点
一、动态时序模拟动态时序模拟是在验证功能的同时验证时序,需要输入向量作为激励。随着规模增大,所需要的向量数量以指数增长,验证所需时间占到整个设计周期的50%,且这种方法难以保证足够的覆盖率。动态时序模拟的优点是比较精确,而且同静态时序模拟相比较,它适用于更多的设计类型。但是它也存在着比较明显的缺点:首先是分析的速度比较慢;其次是它需要使用输入矢量,这使得它在分析的过程中有可能会遗漏一些关键路径,因为输入矢量未必是对所有相关的路径都敏感的。二、静态时序模拟静态时序分析技术是一种穷尽分
2021-12-10 20:20:15 3245
原创 时钟抖动(Jitter)和时钟偏斜(Skew)
在进行时序分析时,经常会遇到两个比较容易混淆的概念,那就是时钟抖动(Clock Jitter)和时钟偏移(Clock Skew)。下面就解释下两者的区别:一、Jitter由于晶振本身稳定性,电源以及温度变化等原因造成了时钟频率的变化,指的是时钟周期的变化。也即相对于理想时钟沿产生的不随时间积累的、时而超前、时而滞后的偏移。它指两个时钟周期之间存在的差值,这个误差是在时钟发生器内部产生的,和晶振或者PLL内部电路有关,布线对其没有影响。由于跟晶振本身的工艺有关,所以在设计中无法避免它能带来的影响,通产只
2021-12-10 11:35:43 4927
原创 Verilog 流水线设计
一、什么是流水线流水线设计就是将组合逻辑系统地分割,并在各个部分(分级)之间插入寄存器,并暂存中间数据的方法。 目的是将一个大操作分解成若干的小操作,每一步小操作的时间较小,所以能提高频率,各小操作能并行执行,所以能提高数据吞吐率(提高处理速度)。二、什么时候用流水线设计使用流水线一般是时序比较紧张,对电路工作频率较高的时候。典型情况如下:1)功能模块之间的流水线,用乒乓 buffer 来交互数据。代价是增加了 memory 的数量,但是和获得的巨大性能提升相比,可以忽略不计。2) I/O 瓶
2021-12-09 11:53:27 3613
转载 Verilog RTL 级低功耗设计
下表显示了在数字设计的各个层次上可减少功耗的百分比。RTL 级之后,功耗的减少量已经非常有限。作为一个编写 Verilog 的伪码农,系统级减少功耗的工作也可参与一些,但重点应该放在 RTL 级来减少功耗。一、并行与流水对于一个功能模块,可以通过并行的方式实现,也可以通过流水线的方式实现,这两种方法都是用资源换速度。在一定的场合下灵活的使用这两种方法,可以降低功耗。并行处理并行处理,可以同时处理多条执行语句,使执行效率变高。所以在满足工作需求的条件下,采用并行处理,可降低系统工作频率,减少功
2021-11-22 10:52:24 2478
原创 跨时钟域同步3---多bit信号同步(延迟采样法/慢到快)
一、有din_en信号假设两个异步时钟频率比为 5, 我们可以先用延迟打拍的方法对数据使能信号进行 2 级打拍缓存,然后再在快时钟域对慢时钟域的数据信号进行采集。该方法的基本思想就是选择合适的时刻(例如数据的中间时刻)去采集信号,而不用同步多位宽的数据信号,可节省硬件资源。module delay_sample( input rstn, input clk1, input [7:0] din, in
2021-10-29 22:28:55 2811
原创 基于Vivado MIG IP核的DDR3读写实验(top_rom_ddr/ddr_top)
一、前言关于Vivado MIG IP核详细配置可以参考我之前的文章:基于Vivado MIG IP核的DDR3控制器(DDR3_CONTROL)关于MIG IP核的用户端的接口时序可以参考这篇文章:XILINX 的 MIG IP(非AXI4)接口时序以及控制二、实验内容本次实验的内容主要是通过MIG IP核向DDR3读写数据,DDR3的接口时序由ddr_top模块提供:ddr_top模块的数据来源是wr_fifo,wr_fifo的数据实际来自top_sd_photo模块(本实验仿真
2021-10-27 12:11:09 2624 4
原创 SPI协议的数据读写实现(spi_slave)
一、SPI协议介绍SPI协议详解二、程序设计该模块接收8路16bit的数据信号ave1---ave8,以及标志数据有效的信号ave_valid;该模块作为SPI的slave端,可以通过spi_miso将ave数据发送出去;也可以通过spi_mosi接收master端发送来的数据,并将数据再通过godata发送出去;该模块采用的是模式0:CPOL = 0,CPHA = 0;该模块可以接收两种命令:读命令COMMAND_READ = 8'hA5、写命令COMMAND_WRITE = 8'H5A;
2021-10-19 22:06:19 5701
原创 Verilog 图像数据时序生成(timing_gen/output)
一、要求图像输出时序如下图所示,其中VSYNC_OUT为场同步信号,HSYNC_OUT为行同步信号,DATA_OUT为16bit图像信号,单个通道进行数据传输,输出格式为4096行*4096列*16bit。时钟为60MHZ,HBLANK为512CLK,HSIZE为4096CLK,VSIZE为(4096+512)*4096+512=18874880CLK,VBLANK为14458453CLKDATA_OUT为16bit,一次传输4096个数据。二、程序设计//此工程为EMCCD增益控
2021-10-16 20:43:59 1992
原创 跨时钟域同步2---单bit信号同步实战(快到慢+慢到快)
一、快时钟域>>>慢时钟域我们假定有两个时钟,CLK1 和 CLK2,还有一个信号叫 READ,CLK1 时钟频率快于 CLK2,现在我们需要将READ 信号同步到CLK2时钟域下。1、方法一:展宽+打拍同步READ_DLY1 信号是 READ 信号相对于 CLK1 时钟打一拍产生的,READ_DLY2 信号是 READ 信号相对于 CLK1 时钟打两拍产生的,由于单纯的 READ 信号宽度根本不够 CLK2 采样,所以需要展宽 READ 的信号宽度, READ_OR 信号是由 RE
2021-10-08 17:16:49 2124 3
原创 Vivado HLS 学习笔记
Vivado HLS(High-level Synthesis)笔记一:HLS基本流程Vivado HLS(High-level Synthesis)笔记二:数据类型及其初始化、复合数据类型、HLS中的C++基本运算Vivado HLS(High-level Synthesis)笔记三:Test benchVivado HLS(High-level Synthesis)笔记四:接口综合Vivado HLS(High-level Synthesis)笔记五:for循环优化Vivado HLS(Hig
2021-10-04 22:46:03 1109
原创 chisel相比verilog优势之二:高级参数化---diplomacy机制
一、Dipomacy 概论diplomacy是一个chisel开发团队开发的chisel库,主要实现两个功能:1)实现模块之间的参数协商。参数在模块之间传递时可以根据需求协商与检查,更加灵活且不容易出错。2)快速实现设计拓扑的参数化。使用verilog实现设计拓扑的参数化是非常困难的一件事,往往包含着大量的define,容易出错,且写起来困难。dipomacy是怎么做的呢?它是将模块之间的组织关系抽象成一张有向无环图。模块具有结点,相互之间的连接关系是边。如下图所示:将模块A与模块B的bundle
2021-10-02 16:56:32 2448
原创 线性反馈移位寄存器LFSR verilog实现
一、什么是LFSR?线性反馈移位寄存器(linear feedback shift register, LFSR)是指,给定前一状态的输出,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位(百度百科定义)。线性反馈移位寄存器反馈分为两种,一种是IE型的LFSR,即异或门内接的线性反馈移位寄存器:另一种是异或门外接的线性反馈移位寄存器,简称EE型LFSR:gi表示接不接入反馈,只能为0或1,为1即为
2021-09-27 12:06:44 3618
原创 verilog 串并转换电路
module serial2parallel( input clk, input rst_n, input en, input data_in, //一位输入 output reg [7:0] data_out //8位并行输出 );always @(posedge clk or negedge rst_n) begin if (rst_n == 1'b0) da
2021-09-24 19:59:22 2241
原创 基于Vivado MIG IP核的DDR3控制器(DDR3_CONTROL)
一、前言由于DDR3的控制时序相当复杂,为了方便用户开发DDR3的读写应用程序,Xilinx官方就提供了一个MIG(Memory Interface Generator) IP核,它可以为用户生成一个DDR3控制器。该控制器结构如下:它提供了用户接口(左侧),内部会将用户接口接收到的时序转换成DDR3所需的真正时序,并通过物理端(右侧)的接口连接到DDR3。由于用户接口的时序比较简单,因此该控制器就隐藏了极其复杂的DDR3的控制时序,让用户只需要按照用户端的时序来操作就可以对DDR3进行相应的读写。
2021-09-20 16:54:45 8016 3
原创 FPGA 16bit 串口发送程序设计
一、前言在之前的一篇文章—FPGA UART串口通信实现 中,已经介绍过了串口通信的基础知识。你可能会发现,串口发送的一帧中数据位只能为5、6、7、8 位,也就是一次最多发送8bit的数据。最近在做一个项目,需要将图像数据保存到本地。想法是先将到来的图像数据写入RAM中,然后再读出来并用串口发送出去,串口调试助手一般都可以保存接收的数据到本地,这样就可以将图像数据保存到本地了。但是我的图像数据是16位的,我需要保存全部bit,不能截断后直接使用8bit串口发送的程序,所以就干脆利用状态机设计一个16bi
2021-09-10 12:19:37 1768 1
原创 RISC-V 指令集的模块化和寄存器结构
0 前言RISC-V 指令集架构是加州大学伯克利分校研发的第五代精简指令集架构,先后经历了四代精简指令集的发展,旨在设计一个完全开放、免费的和性能强大的指令集架构。它和X86/ARM相比,一大优势就是支持模块化,下面我们就来介绍一下RISC-V指令集的模块化结构,顺便再介绍下其寄存器结构。一、模块化结构RISC-V 指令集架构一改传统增量 ISA 模式,采用模块化 ISA 模式,它被定义为基本的整数指令集架构,以及几个标准的扩展子集,可以自定义指令扩展,如下表所示。它的核心为RV32I的基础整数指
2021-09-07 19:15:09 5049
原创 RISC-V 指令格式和6种基本整数指令
指令格式是指令使用二进制编码表示的结构形式,一般一条指令分为操作码和地址码两部分:一、操作码操作码表示指令的属性功能和执行的指令类型。操作数对应的二进制位数决定了计算机能够实现的最大指令数目。例如,操作码是 7 位的二进制码,计算机能够实现的最大指令数目是 128(2^7)。操作码根据二进制位数是否具有可变性将其细分为固定长度和可变长度两种。固定长度操作码就是保持二进制位数不变,所有指令的操作码长度都等于某一固定值,并且它们必须在一个字段中。它的优点主要有:规整的指令格式,简化的底层硬件设计
2021-09-07 16:38:06 40706 10
原创 RISC-V SoC生成器---Rocket Chip介绍
一、Rocket Chip 基本结构Rocket Chip是基于Chisel开发的一款开源SoC生成器(Generator),也即它自己其实并不是一款处理器。它根据不同的配置参数可以产生不同的处理器的RTL代码,当配置参数确定之后,生成的才是一个真正的“处理器”。从图中可以看出,Rocket Chip有六个组成部分:A为Core Generator,用于生成处理器核,支持Rocket-core和BOOM两种B为Cache,包括L1 Cache和L2 CacheC为RoCC,即Rocket的用户
2021-09-06 20:34:36 4103
转载 chisel(Rocket Chip)中如何参数化芯片系统
2021.9.5 有些地方添加了一点自己的理解!!!0 绪论前面已经介绍了chisel的初级和高级参数化。如何把这些东西有效的在系统中组织起来呢?如何在系统中快捷的使用他们?这篇文章主要解决这个问题。主要涉及到几个东西,一一介绍吧。原理:trait和cake pattern原理:参数的++级联应用:使用trait和cake pattern构造模块,使用++级联参数作为trait的开关注意的是此处介绍的应用形式只是trait pattern中rocket chip推荐的一种参数组织办法.
2021-09-05 14:20:19 2169 2
原创 scala面向对象基础---类继承和特质
一、特质介绍因为Scala没有多重继承,为了提高代码复用率提出了特质的概念,在定义上它主要有以下几个特点(结合单例对象):特质用关键字“trait”为开头来定义的,它与单例对象很像,两者都不能有入参。但是,单例对象天生就是具体的,特质天生就是抽象的,不过不需要用“abstract”来说明。因为特质是抽象的,所以可以包含抽象成员(成员可以全是抽象,或者全是具体,或者有抽象也有具体),而单例对象却不行。两者都不能用new来实例化,因为特质是抽象的,而单例对象已经是具体的对象。类、单例对象和特质三者一
2021-07-30 09:49:52 1135
原创 scala访问修饰符
一、访问修饰符 private,protected,publicScala 访问修饰符有:private,protected,public;如果没有指定访问修饰符,默认情况下,Scala 对象的访问级别都是 public。1、私有(Private)成员用 private 关键字修饰,带有此标记的成员仅在包含了成员定义的class、object或者package内部可见,同样的规则还适用内部类。类的例子package p1{ class A{ private val clas
2021-07-26 22:21:56 997
原创 Scala面向对象基础--类和对象
一、类的定义与对象创建在Scala里,类是用关键字“class”开头的代码定义,它是用于创建对象的蓝图。一个类就是一个类型,不同的类就是不同的类型,一个对象的类型就是创建它用的那个类。在类里可以定义val或var类型的变量,它们被称为“字段”;还可以定义函数,它们被称为“方法”;此外还可以定义:常量、类型、对象、特质、类等等,这些在类里定义的东西统称为“成员”。外部想要访问对象的成员时,可以使用句点符号“ . ”,通过“对象.成员”的形式来访问。此外,用new构造出来的对象可以赋给变量,让变量名成为该
2021-07-25 20:57:02 1325
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人