耐心的小黑
七月份就上班了,比较忙!
展开
-
Verilog 流水线设计
一、什么是流水线流水线设计就是将组合逻辑系统地分割,并在各个部分(分级)之间插入寄存器,并暂存中间数据的方法。 目的是将一个大操作分解成若干的小操作,每一步小操作的时间较小,所以能提高频率,各小操作能并行执行,所以能提高数据吞吐率(提高处理速度)。二、什么时候用流水线设计使用流水线一般是时序比较紧张,对电路工作频率较高的时候。典型情况如下:1)功能模块之间的流水线,用乒乓 buffer 来交互数据。代价是增加了 memory 的数量,但是和获得的巨大性能提升相比,可以忽略不计。2) I/O 瓶原创 2021-12-09 11:53:27 · 3588 阅读 · 0 评论 -
跨时钟域同步3---多bit信号同步(延迟采样法/慢到快)
一、有din_en信号假设两个异步时钟频率比为 5, 我们可以先用延迟打拍的方法对数据使能信号进行 2 级打拍缓存,然后再在快时钟域对慢时钟域的数据信号进行采集。该方法的基本思想就是选择合适的时刻(例如数据的中间时刻)去采集信号,而不用同步多位宽的数据信号,可节省硬件资源。module delay_sample( input rstn, input clk1, input [7:0] din, in原创 2021-10-29 22:28:55 · 2787 阅读 · 0 评论 -
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 · 1939 阅读 · 0 评论 -
跨时钟域同步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 · 2106 阅读 · 3 评论 -
线性反馈移位寄存器LFSR verilog实现
一、什么是LFSR?线性反馈移位寄存器(linear feedback shift register, LFSR)是指,给定前一状态的输出,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位(百度百科定义)。线性反馈移位寄存器反馈分为两种,一种是IE型的LFSR,即异或门内接的线性反馈移位寄存器:另一种是异或门外接的线性反馈移位寄存器,简称EE型LFSR:gi表示接不接入反馈,只能为0或1,为1即为原创 2021-09-27 12:06:44 · 3574 阅读 · 0 评论 -
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 · 2222 阅读 · 0 评论 -
平等仲裁之循环优先级控制器
一、功能描述利用循环优先级算法,每次从不同的起点开始,采用轮询方式查看各个通道是否有请求,优先响应先查到的设备。由于起点是依次变化的,所以每个设备总体来说具有相同的优先级。具体算法可用下面的图表示。二、设计方法定义一个轮询起点(CHK)的计数器。CHK在每次s_drq(表示请求有效)有效期结束(设计了一个下降沿捕获器count_en=!s_drq&&s_drq_delay作为CHK的计数使能,其中s_drq_delay为s_drq延迟一个周期的信号)时加1,加到7后返回0继续加。定原创 2021-06-12 18:25:14 · 1477 阅读 · 0 评论 -
Xilinx伪双口RAM实现同步FIFO(解决读写冲突)
一、伪双端口RAM配置关于创建和配置IP,可以参考我的另一篇文章:Vivado 双口RAM IP核的使用。这里需要注意的是,如果想要解决读写冲突,也就是当同时读写同一地址时,能读出之前存在该地址的旧数据,也能将要写的新数据正确写入到该地址,那写端口的操作模式一定要选择READ_FIRST或者NO_CHANGE。如果选择WRITE_FIRST,那么当读写冲突时,读出的数据是此时准备写入的数据,并不是之前存储的数据,这显然不符合逻辑。二、读写地址变化方式1、关于写地址的变化,只需考虑we有效的情况:原创 2021-06-06 23:05:13 · 3375 阅读 · 0 评论 -
整数倍与非整数倍位宽转换电路
以下内容摘自:《正点原子逻辑设计指南》位宽转换在项目开发中会经常用到,比如两个模块对接,一个模块是 8bit 信号位宽,另外一个模块是16bit 信号位宽,那么两个模块实现对接就需要一个位宽转换电路,把 8bit 信号位宽转换为 16bit 信号位宽。一、位宽转换简介位宽转换包括两种,一种是整数倍位宽转换,一种是非整数倍位宽转换,整数倍的位宽转换相对简单,非整数倍的位宽转换比较复杂。我们先来看下整数倍的位宽转换,如下图所示,一个是 A 模块,一个是 B 模块,一般模块的接口由数据信号和数据有效指示转载 2021-03-10 19:57:58 · 1765 阅读 · 1 评论 -
二进制与格雷码互相转换
以下内容摘自:《正点原子逻辑设计指南》格雷码,是一种二进制循环码。格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进制编码计数组合电路中出现的亚稳态。格雷码常用于通信,异步 FIFO或者 RAM 地址寻址计数器中。一、格雷码简介格雷码是一个叫弗兰克*格雷的人在 1953 年发明的,最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进制编码计数组合电路中出现的原创 2021-03-10 19:43:35 · 24503 阅读 · 5 评论 -
pwm信号生成电路
一、实验原理本实验我们将通过脉宽调制技术来实现“呼吸灯”,实现LED的亮度由最暗逐渐增加到最亮,再逐渐变暗的过程。 脉冲宽度调制(PWM:Pulse Width Modulation),简称脉宽调制。它是利用微控制器的数字输出调制实现,是对模拟电路进行控制的一种非常有效的技术,广泛应用于测量、通信、功率控制与变换等众多领域。我们使用12MHz的系统时钟作为高频信号做分频处理,调整占空比实现PWM。实现原理如上图所示,脉冲信号的周期为T,高电平脉冲宽度为t,占空比为t/T。为了实现PWM脉宽调制,我们原创 2020-10-31 20:35:50 · 6627 阅读 · 0 评论 -
按键消抖的三种方案
首先,做两个假定,以方便后面的描述:假定按键的默认状态为0,被按下后为1假定按键抖动时长小于20ms,也即使用20ms的消抖时间方案1:在按键电平稳定的情况下,当第一次检测到键位电平变化,开始20ms计时,计时时间到后将按键电平更新为当前电平方案2:在20ms计时的过程中,有任何的电平变化都立即复位计时方案3:在有电平变化时立即改变按键输出电平,并开始20ms计时,忽略这其中抖动1、方案1代码:module debounce( input wire clk, nrst, i转载 2020-09-24 11:32:57 · 22522 阅读 · 2 评论 -
组合逻辑毛刺消除(竞争冒险)
以下内容摘自:《正点原子逻辑设计指南》一、毛刺产生的原因信号在 IC/FPGA 器件中通过逻辑单元连线时,是存在延时的。延时的大小不仅和连线的长短和逻辑单元的数目有关,而且也和器件的制造工艺、工作环境等有关。因此,信号在器件中传输的时候,所需要的时间是不能精确估计的,当多路信号同时发生跳变的瞬间,就产生了“竞争冒险”。这时,往往会出现一些不正确的尖峰信号,这些尖峰信号就是“毛刺”。毛刺是数字电路设计中的棘手问题,它的出现会影响电路工作的稳定性、可靠性,严重时会导致整个数字系统的误动作和逻辑紊乱。首先原创 2021-03-09 09:43:20 · 4338 阅读 · 0 评论 -
手写同步FIFO
以下内容摘自:《正点原子逻辑设计指南》一、 FIFO简介FIFO 是一种先进先出的数据缓存器,在逻辑设计里面用的非常多,FIFO 设计可以说是逻辑设计人员必须掌握的常识性设计。FIFO 一般用在隔离两边读写带宽不一致,或者位宽不一样的地方。在逻辑设计的时候,尤其是 FPGA 设计,使用 FIFO 一般有两个方法,第一个方法是直接调用官方的FIFO IP,另外一个方法是自己设计 FIFO 。直接调用 FIFO IP使用非常简单,也不需要知道FIFO 内部的控制逻辑。但是在 IC 开发中,往往需要我们自己转载 2021-03-09 12:33:05 · 2794 阅读 · 2 评论 -
跨时钟域同步1---亚稳态的产生和解决方案
以下内容摘自:《正点原子逻辑设计指南》逻辑设计中一般存在多个时钟,那么信号在多个时钟之间如何切换呢?这个就涉及到了异步电路设计,异步电路设计也是逻辑设计中非常重要的设计,可以说异步处理不好,逻辑出问题的可能性非常大。一、亚稳态简介在介绍异步设计方法之前,我们先了解下亚稳定的概念,为什么要先了解亚稳态呢?因为异步电路如果直接使用寄存器采样会出现问题,最常见的就是出现亚稳态。寄存器采样需要满足一定的建立时间(setup)和保持时间(holdup),而异步电路没有办法保证建立时间(setup)和保持时间(h原创 2021-03-08 21:51:22 · 2428 阅读 · 0 评论 -
手写RAM(单端口、伪双端口、真双端口)
一、单端口RAM介绍单端口 RAM 指的是只有一个读写口,就是只有一组数据线和地址线,就是读和写都是通过这个口来访问 RAM,但是同一个时刻只能访问一个,要么是读,要么是写。单端口 RAM 读写要控制的主要信号就是写使能、总使能、写数据、写地址和读数据。RAM 还有一个重要的特性是 RAM 读延迟,就是 RAM 发起读,然后读数据有效的周期数。这个延迟一般是 1,如果 RAM 输出再因为改善时序寄存一拍,那么 RAM 的读延迟就是 2。如下所示,在读使能为 1且地址有效的情况下(WEA 为 0,E原创 2021-03-07 11:13:01 · 3811 阅读 · 0 评论 -
复位电路设计(异步复位、同步释放)
以下内容摘自正点原子的:《逻辑设计开发指南》复位电路是数字逻辑设计中非常常用的电路,不管是 FPGA 还是 ASIC 设计,都会涉及到复位,一般 FPGA或者 ASIC 的复位需要我们自己设计复位方案。复位指的是将寄存器恢复到默认值。一般复位功能包括同步复位和异步复位。复位一般由硬件开关触发引起,也可以由复位逻辑控制引起。相信大家在学习 FPGA 或者 ASIC 的时候都有如下的疑问:1、 数字逻辑为什么需要复位?2、 FPGA 板上面没有复位按键怎么办?3、 复位只有通过按键复位一个控制方式吗?转载 2021-03-06 22:55:26 · 8119 阅读 · 8 评论 -
边沿检测电路设计
一、RTL代码module edge_detect( input clk , // system clock input rst_n, // system rst, low active input a , output y1 , // output signal output y2 , // output signal output y3 // output signal原创 2021-03-06 19:26:36 · 967 阅读 · 0 评论 -
verilog 交通灯实验(使用状态机)
一、实验要求包含一个counter与一个state转换模块当reset为1时,则count为0,state=S0当reset为0时,则开始数数,state切到绿灯每过clk一周期则counter+1绿灯时,当过25周期,则切到黄灯黄灯时,当过2周期,则切到红灯红灯时,每过15周期,则切到绿灯以此循环。二、状态机三、程序实现1、RTL代码module traffic_light_ctl( clk, reset, state ); inp原创 2020-11-01 23:51:27 · 8213 阅读 · 2 评论 -
verilog 4位无符号BCD码加法器实现
一、前言BCD码(Binary-Coded Decimal)用4位二进制数来表示十进制数中的0~9这10个数码。4位二进制正常情况下是在值为15之后产生进位,但如果是BCD码加法器,那么应该是在值为9之后就要产生进位。为了实现4位二进制在值为9之后就要产生进位,那么就可以在值大于9的时候,在该值的基础上加6,使其自动产生进位。因为加上6之后,此时的4位二进制的值刚好是大于15产生进位的情况。二、verilog实现1、RTL代码module adder_4bit( a, b,原创 2020-10-09 18:23:16 · 6983 阅读 · 0 评论 -
verilog 24进制+60进制 模拟时钟计数器
1、RTL代码module clock_24_60( clk, rst, hour_h, hour_l, minute_h, minute_l ); input clk,rst;output[3:0] hour_h,hour_l,minute_h,minute_l;reg[3:0] hour_h,hour_l,minute_h,minute_l;wire cout; //6原创 2020-10-03 23:40:38 · 6887 阅读 · 0 评论 -
verilog 实现8位有符号加法器
一、有符号加法器对于同一个加法器来说,其实输入无论是有符号数还是无符号数都是可以的。以我之前写的8位二进制加法器:传送门 为例,第一张图我们选radix是unsigned,表示无符号加法,第二张图我们选radix是signed,表示有符号数,从图中可知结果都是正确的。假设二进制数是n位,则对于无符号数来说,表示范围是(0,2 ^ n -1),对于有符号数,表示的范围是(-2 ^ (n-1),2^(n-1) - 1)。二、添加溢出标志的8位有符号加法器1、RTL代码module adder_1原创 2020-10-03 22:29:27 · 9386 阅读 · 0 评论 -
verilog 实现8位无符号除法器
一、算法(非原创)参考链接:https://www.cnblogs.com/lyc-seu/p/12507760.html在Verilog HDL语言中虽然有除的运算指令,但是除运算符中的除数必须是2的幂,因此无法实现除数为任意整数的除法,很大程度上限制了它的使用领域。并且多数综合工具对于除运算指令不能综合出令人满意的结果,有些甚至不能给予综合。即使可以综合,也需要比较多的资源。最简单的方法就是减法实现除法器(比如十进制中的a/b,可先比较a与b的大小,如果a>b,则商加1,a<=a-b,转载 2020-10-03 13:51:05 · 8688 阅读 · 0 评论 -
verilog 实现8位无符号乘法器
一、功能概述:先行进位加法器是对普通的全加器进行改良而设计成的并行加法器,主要是针对普通全加器串联时互相进位产生的延迟进行了改良。超前进位加法器是通过增加了一个不是十分复杂的逻辑电路来做到这点的。设二进制加法器第i位为Ai,Bi,输出为Si,进位输入为Ci,进位输出为Ci+1,则有:Si=Ai⊕Bi⊕Ci(1-1)Ci+1 =Ai * Bi+ Ai Ci+ BiCi =Ai * Bi+(Ai+Bi)* Ci(1-2)令Gi = Ai * Bi, Pi = Ai+Bi,则Ci+1= Gi原创 2020-09-29 21:51:26 · 5196 阅读 · 0 评论 -
verilog 实现9位有符号乘法器
一、移位相加乘法器移位相加的原理从被乘数的最低位开始判断,若为1,则乘数左移i(i=0,1(width-1))位后,与上一次和进行相加,若为0,则乘数左移i位后,以0相加。直到被乘数的最高位。实际是由移位运算和加法运算构成。比较高速。优点:占用资源较少,主要在低速信号处理中缺点:串行乘法器的速度比较慢,一个结果输出需要更多的时钟周期。在高位宽的乘法运算中非常明显。所以可以采用改进的流水线形式来实现移位相加。1、串行形式,使用状态机来实现module multiply(clk, x, y,原创 2020-09-28 09:31:28 · 4645 阅读 · 1 评论 -
verilog 实现8位无符号加法器(串行进位)
一、首先定义一个1位全加器module add_1bit(a,b,cin,sum,cout); input a,b,cin; output sum,cout; sum sum1(a,b,cin,sum); carry carry1(a,b,cin,cout);endmodule由于上述模块使用到了我们自己定义的求和以及求进位模块,所以下面实现以下。这也是为了练习一下模块例化,增加结构化概念。module sum(a,b,cin,sum); input a,b,cin; output原创 2020-09-27 10:11:19 · 9430 阅读 · 2 评论 -
verilog 分频器设计(奇偶分频、半整数分频、任意分频、任意占空比)
分频器是指使输出信号频率为输入信号频率整数分之一的电子电路。在许多电子设备中如电子钟、频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种频率成分,分频器是一种主要变换手段。早期的分频器多为正弦分频器,随着数字集成电路的发展,脉冲分频器(又称数字分频器)逐渐取代了正弦分频器。一、占空比为50%的分频器。1、偶分频:偶分频电路指的是分频系数为 2、4、6、8 … 等偶数整数的分频电路,我们可以直接进行分频。例如下面 divider.v 中,转载 2020-09-24 10:10:05 · 20720 阅读 · 16 评论