- 博客(31)
- 收藏
- 关注
原创 同步FIFO与异步FIFO设计
设计一个深度为512,位宽是10bit的同步FIFO输入端口:CLK,RSTN, RD_EN, WRT_EN, DATA_WRT[9:0]输出端口:FULL, EMPTY, DATA_ED[9:0]fifo其实就是基于ram做的一些扩展,区别一:顺序读写,区别二:防止ram写满溢出以及读空。
2024-07-23 15:23:45
491
原创 8. 建立时间和保持时间
1.建立时间tsu,保持时间thold,传播延时tcq2.建立时间与时钟频率的约束,保持时间与建立时间和传播延时的约束3.添加buffer的情况
2024-07-21 23:28:24
218
原创 7. 乘法器
求无符号数MUL[15:0] = A[9:0] * B[5:0]的结果通过写乘法器了解乘法器原理,了解如何优化乘法器的时序。理论上,对于一个普通的乘法器,我们直接使用a*b就可以得出。但它的时钟频率会很低。
2024-07-20 15:21:09
396
原创 6. 加法器——半加器,全加器,超前进位(CLA)
1. 半加器1.1 原理1.2 代码2. 全加器2.1 原理2.2 代码3. 超前进位加法器3.1 原理3.2 代码
2024-07-19 20:54:30
401
原创 5. 流水线设计
设计要求:输入为两个64bit位宽的操作数(PLUS_A和PLUS_B)。为了达到较快的时钟频率,每两级触发器之间只能实现16bit位宽的加法。该如何实现这个加法。要求每个时钟周期都有一个操作数输入,一个操作数输出。题目意思是:比如我当前的时钟频率为500M(2ns),支持2ns时钟频率的最大位宽加法为16bit(位宽越大,组合逻辑越多,消耗时间越多),而目前有两个64bit位宽的操作数需要相加,所以我需要设计一个流水线,在保证500M时钟频率的情况下实现数据相加。
2024-07-19 11:20:58
345
原创 4. 双端口ram设计
设计一个位宽8bit,地址深度为128,可以同时读写的双端口RAM要求:模块名字为RAM_DUAL输入端口:ADDR_W,ADDR_RCLK_R,CLK_W,RSTnADDR_R[6:0],ADDR_W[6:0]DATA_WRT[7:0]RD_EN,WRT_EN输出端口:DATA_RD[7:0]一般大容量的RAM由专门的IP厂商提供,有单口RAM(读写不能同时进行),双口RAM等各种样式。IP厂商会提供behavior model,综合以及后端库文件小容量的RAM可以自己用触发器阵列搭建。属于双口RAM(读
2024-07-18 21:08:22
562
原创 2.有限状态机——售货机,序列检测
1.一段代表当前状态赋值;2.一段代表下一个状态如何跳变3.一段代表输出控制一定要带上复位前两段模板集合一样,第三段取决于具体需求。
2024-07-14 20:57:44
343
原创 1. 基础设计流程(以时钟分频器的设计为例)
1. 写有vcs编译命令的run_vcs.csh的shell脚本2. 装有timescale,设计文件以及仿真文件的flish.f(filelist文件,用于VCS直接读取)
2024-06-21 21:16:20
548
原创 18 19 SPI接口的74HC595驱动数码管实验
1. 通过移位寄存器实现串转并:一个数据输入端口可得到四位并行数据。通过给data输送0101数据,那么在经过四个时钟周期后,与data相连的四个寄存器的输出端口得到了0101这样的数据,然后我们将latch信号拉高,在下一个时钟周期,D0, D1, D2, D3同时分别获得了这四个数据1010。(其中DFF指D触发器,LATCH信号也可连接锁存器来控制输出)2. 级联级联:数据输出端口作为另外的移位寄存器数据端的输入。
2024-02-14 23:06:41
2576
1
原创 16 亚稳态原理和解决方案
按键未按下时为高电平,按下后为低电平,我们需要通过检测下降沿来判断按键是否按下,但由于亚稳态的存在,异步信号有可能检测不到,因此此处将分情况进行讨论。2. 如果外部信号转变发生在建立保持时间之内,出现了亚稳态现象,则在亚稳态结束后最终输入与输出有两种情况,输出不确定的0或1。1. 如果外部信号转变发生在建立保持时间之外(非时间上升沿处),则在外部信号变化的下一个时钟沿处,下降沿信号能被正常检测到。1. 由于亚稳态持续时间小于一个时钟周期,使用一级同步后便可检测到下降沿,比原先的下降沿晚了一个时钟周期。
2024-02-12 20:28:24
1605
1
原创 15 ABC基于状态机的按键消抖原理与状态转移图
从按键结构图10-1可知,按键按下时,接点(端子)与导线接通,松开时,由于弹簧的反作用力,接点(端子)与导线断开。从原理图10-2可知,按键按下时为低电平,未按下为高电平。
2024-02-12 00:33:10
1524
1
原创 13. 串口接收模块的项目应用案例
2.修改了uart_byte_rx1串口接收模块代码,修改了rx_data八位数据接收条件,原先是发送了在出现tx_done信号后得到输出八位数据,这样会导致我们在后续模块通过tx_done信号接收数据时接收的是前一个八位数据。LED灯的工作状态:让LED灯按指定的亮灭模式亮灭,亮灭模式未知,由用户指定,8个变化状态为一个循环,每个变化状态的时间值可以根据不同的应用场景来选择。使用串口发送指令到FPGA开发板,来控制第7课中第4个实验的开发板上的LED灯的工作状态。
2024-02-10 21:06:01
1681
1
原创 12 ABC串口接收原理与思路
基本原理:通过数据起始位判断要是否要开始接收的数据,通过采样的方式确定每一位数据是0还是1。如何判断数据起始位到来:通过边沿检测电路检测起始信号的下降沿如何采样:一位数据采多次,统计得到高电平出现的次数,次数多的就是该位的电平值。
2024-02-09 20:13:56
967
1
原创 11 串口发送应用之使用状态机实现多字节数据发送
uart协议规定,发送的数据位只能是6,7,8位,如果数据位不符合,接收者接收不到数据。所以我们需要将40位数据data分为5个字节数据分别发送,那么接收者就能通过uart协议接收到数据了。
2024-02-08 16:59:21
1842
原创 09 AB 10串口通信发送原理
通用异步收发传输器( Universal Asynchronous Receiver/Transmitter, UART)是一种异步收发传输器,其在数据发送时将并行数据转换成串行数据来传输, 在数据接收时将接收到的串行数据转换成并行数据, 可以实现全双工传输和接收。它包括了 RS232、 RS449、 RS423、RS422 和 RS485 等接口标准规范和总线标准规范。 换句话说, UART 是异步串行通信的总称。而 RS232、 RS449、 RS423、 RS422 和 RS485 等
2024-02-07 21:40:02
2493
1
原创 07 A B 从计数器到可控线性序列机
总结:计数器不仅仅是一个计量整个时间的一个计数器,而且这个计数器里面的每一个计数值,他都可以作为整个这一段时间里面的一个刻度标尺,都可以拿来用。有一个指定亮灭状态的输入端口,控制八种状态的亮灭,如果把亮灭看成1和0,那么就可以设计一个八位的控制亮灭状态的端口。使用case语句时,每种情况的值必须是一个确定值,在这种情况下,我们必须修改代码,使各个状态由确定值来给定,而不是不确定的时间。总结:通过控制en的状态就能控制计数器的计数,通过计数器的计数,来产生不同的序列,即从计数器到可控状态序列机。
2024-02-05 21:45:19
1324
1
原创 05 06 (代码布置引脚,修改参数)Verilog基础语法与应用讲解
计数器实验升级,设计8个LED灯以每个0.5s的速率循环闪烁(跑马灯)
2024-02-04 22:54:43
1000
1
原创 04 时序逻辑计数器设计与相关语法
1.组合逻辑电路:输出只与输入有关,比如二选一多路器,三八译码器。2.时序逻辑电路:输出不仅与输入有关,也与时钟有关(只在时钟边沿发生信号的变化),即使输入D中途跳变为了低电平,但由于不在时间边沿处触发,输出Q仍然为高电平,说明时序逻辑电路具有存储特性。
2024-01-17 16:53:05
552
原创 SV结构体学习
module tb;} pixel_tprint_pixel(pixel_b)//通过索引赋值,数组里也有这个用法end//%x是十六进制endmodule利用typedef将struct定义为一个类型pixel_t后,在函数里就可以引入该类型的形式参数了。
2024-01-01 12:23:12
938
原创 UVM实验5
对于状态寄存器stat_reg,刚开始由于是初始阶段reset,desired和mirrored均为默认值,但硬件实际值可能不同,如果此时reg做一个读操作,即reg.read(),那么在前门访问过程中,mirrored监测到硬件实际值与mirrored值不一样,于是更新了mirrored和desired值。在利用寄存器模型对寄存器进行读/写访问时,往往对整个寄存器进行读写的机会不多,更多的是修改某些单独的域,或获得某些域的值。只有继承于uvm类的子类,可以用factory去注册,去创建。
2023-12-30 09:50:12
1036
1
原创 UVM实验4
将generatordriver与test的关系最终移植为sequencesequencerdriver和test的关系,聚焦于sequence和sequencer的使用。
2023-12-20 19:44:06
1354
1
原创 UVM实验3
1.在之前的monitor到checker的通信,以及checker与l之间的通信,都是通过mailbox以及在上层进行其句柄的传递实现的。我们在接下来的实验要求中,需要大家使用TLM端口进行通信,做逐步的通信元素和方法的替换2.涉及到通信的有各个agent里的monitor和的mailbox的通信;以及和里的之间的通信。3.为了熟悉多项通信和通信管道的用法,对于monitor和mailbox,实验里用到的是单向/多向通信;对于refmod和,实验里用到的是通信管道。
2023-12-16 08:50:02
1179
1
原创 DVT学习与使用
3.1在项目编译时(build,可自动增量式触发),会在“problems”窗口出现多处提示(warning/error)在选择某处提示后可快速链接到源代码处,在代码编辑左侧可根据“感叹号”或者“叉号”提示符,选中对应代码,右键——Sorurce——Quick Fix,或者按“Ctrl+13.2为模块添加参数或者端口添加敏感列表给design添加敏感列表,比如always里面有的信号不在敏感列表里,它会给出提示为interface句柄添加virtual关键词。
2023-12-15 20:39:52
2069
原创 UVM实验2
req是通过uvm的type_id::create创建的,在创建时做了域的自动化的声明,所以可以直接用核心基类里的方法,比如clong。但需要注意的是,,所以赋值给子类rsp时需要转化,同时转化可以成功。:调用clong方法会新创建一个对象,复制req到新创建的对象中,并返回新创建对象的句柄)。许多函数都有返回值,比如$cast( ),在进行类型转化的同时会返回1,或者0,表示转化成功或者失败,此时使用void’( )可以把转化值变为空,告诉编译器不用理会返回值;
2023-12-03 22:37:17
1366
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人