Verilog

verilog技巧之边沿检测

本文记录一下关于用移位寄存器实现边沿检测的技巧。要学会硬件思维式的“模块式”读写代码,那么请多看别人的代码,并用ISE或者VIVADO综合出来看看。

边沿检测
边沿检测,顾名思义,就是检查信号的边沿,当信号的上升沿或者下降沿到来时,获取一个脉冲信号,时序图如下所示:


上图的检测信号同时输出上升沿检测和下降沿检测。那么这个波形怎么来的呢,我们来看看下面几组波形:

可以发现:  
原始信号与延迟一拍的信号 d0 的反向信号相与,就是上升沿脉冲;

而原始信号取反,然后与延迟一拍信号d0相与就是下降沿脉冲。

verilog 实现IIC

verilog 实现IIC协议算是一个简单的IP核,本来是挂在AXI总线上,可以通过microblaze对其进行配置。最近在弄ADV7511,用到IIC来配置它.直接上代码:
module iic_drive(
input clk,
input reset_n,

// 与控制器通信信号
input [31:0] slv_reg0,
input [31:0] slv_reg1,
input [31:0] slv_reg2,
input [31:0] slv_reg3,
input [31:0] slv_reg4,
output reg [ 7:0] iic_rddb,
output iic_busy,

// 外部信号
output iic_scl,
input iic_sda_in,
output sda_dir,
output sda_r
);

// SCL 分频系数
// 产生IIC时钟 100M/20K = 5000
parameter SCL_SUM = 13'd5000;

// 仿真时

作者:圆宵,来源:FPGA那点事儿

最近在做一个设计用Vivado去综合时,碰到了一个很意外的Critical Error。由此牵扯出Verilog代码中使用异步置位和复位时,需留意的一个很隐蔽的小错误。

警告摘要如下:

[Netlist29-358] Reg ‘Counter[7]‘ of type ‘FDCPE’ cannot be timed accurately. Hardwarebehavior may be unpredicatable.

Resolution:Recode your design, so that you do not depend on both asynchronous set andreset for your desired functionality.

所对应得代码大概如下:

QDR SRAM接口FPGA 详细Verilog代码

QDR SRAM介绍

QDR 具有独立的读、写数据通路,均使用DDR,在每个时钟周期内会传输四个总线宽度的数据 (两个读和两个写),这就是QDR四倍数据速率的由来。

这里用到的是典型2字突发的QDR,对于4字突发的QDR操作类似,稍作改动就行。针对每个读或写请求,2 字突发器件传输两个字。DDR 地址总线用于在前半个时钟周期允许读请求,在后半个时钟周期允许写请求。

首先看接口的时序图

时序图,表明了 2 字突发 QDR II 存储器接口上的并发读 / 写操作。时钟有三组差分时钟,其中C时钟是发送寄存器的发送时钟,K时钟是目的寄存器用的采样时钟,CQ时钟是经过QDR器件延时,跟输出Q同步的时钟。

在K时钟的前半个周期,DDR 地址总线允许读地址传输给存储器;在时钟的后半个周期,DDR 地址总线允许写地址出现其中。因此,低有效的读控制 (/R) 和写控制 (/W) 控制可在同一时钟周期内有效。

FPGA滤波器几种舍入方式和误差分析及verilog实现

1. 舍入与截尾误差,补码截尾,会有负的直流偏置;

FPGA二进制几种截尾和舍入方法比较:
wire signed [15:0] scaletypeconvert1;
wire signed [37:0] scale1;
1. Round Mode: fix——filter_zero
scaletypeconvert1= $signed({scale1[37:22]} + (scale1[37] & |scale1[21:0]));
2. Round Mode : round——filter_Round
scaletypeconvert1 = (scale1[37:0] + {~scale1[37],{21{scale1[37]}}})>>>22;
3. Round Mode : convergent——filter_near_convergent
scaletypeconvert1 = (scale1[37:0] + {scale1[22],{21{~scale1[22]}}})>>>22;
4. Round Mode : nearest——filter_near
scaletypeconvert1 = (scale1[37:21] + 1)>>>1;

Zynq基础——verilog简易规则

命名规则
verilog 中文件及内容模块的命名方式也是依据面向对象的思想命名。

类型 命名方式 实例
顶层文件 对象+功能+top video_oneline_top
逻辑控制文件 对象+ctr ddr_ctr.v
驱动程序 对象+功能+dri

lcd_dri.v

uart_rxd_dri.v

作者: 圆宵 FPGA那点事儿

在Verilog代码开发时,我们可以把经常会用到的公共变量和参数,单独放在一个cfg.v文件中,然后在别的文件中include这个文件,这样便于代码的组织管理,可以使得代码结构更加清晰。

下面是在rapidio参考设计中摘出的一段代码,示例了这种用法:

那么在Vivado GUI中,该如何设置,可以使得代码可以准确找到这个include的文件呢?

UART通信逻辑协议设计(1)

数据传输的基本方式

  并行通信:利用多条数据线将各位数据同时传送。传输速度快,适用于短距离通信,且要求通讯速率较高的应用场合。串行通信:即用一条数据线数据一位位地顺序传送。通信线路简单,成本低。适用于远距离和传输速度慢的应用场合。常见的串行通信有UART,USB,I2C,CAN,SPI,RS485,RS232,RS422A等。

UART通信协议

1) UART(Universal Asynchronous Receive/Transmitter) 通用异步串行通信协议。可实现全双工传输和接收,经常被用于主机与外设之间的通信。同步串行通信是以数据块为单位进行传送,而异步串行通信则是以字符为单位传送。

2) UART通信传输格式
其传输方式都是以一个字符为单位发送,其中传输顺序为起始位、数据位、奇偶校验位、停止位、空闲位。其中起始位和停止位固定发送逻辑低电平’0’和’1’。数据位为5到8位串行数据,多以ASCII的格式传输。奇偶校验位即整个字符中逻辑值’1’的个数是奇数还是偶数位。若为偶数则此位为’0’若为奇数则此位为’1’。而在无数据传输是发送的是高电平’1’。

3) UART传输控制器的基本结构

ModelSim仿真入门

注:本文记录内容在ModelSim6.2b、ModelSim6.5、ModelSim10.1a中均做过。

本文以一个四分频的Verilog程序为例,记录一下自己学习的ModelSim的入门过程。除了帮自己加深记忆,希望对别人有一点帮助。

一,建立工程

点击”File”->”New”->”Project”,出现”Create Project”对话框,如图:

“30年---我与赛灵思FPGA的故事”:启程-踏上FPGA之路

自我介绍:
借这次博文大赛的东风,我也总结一下我的研究生2年的学习生活,当然是和Xilinx FPGA开发平台相关的。本人现在普通研二小硕一枚,90年生人,在一所普通的大学过着普通的研究生生活。

选择FPGA:
踏上FPGA这条路纯属机缘巧合,相信不论是过来人还是刚上研究生不久的学弟学妹们都曾思考过,研究生期间我要学些什么,以后我靠什么谋求一份工作(当然高富帅白富美的世界我不懂),反正这是我真是的想法。我的本科专业是电气工程及其自动化,研究生专业是众所周知的双控了,本科学的知识有些杂乱,数电、模电、单片机、PLC、工厂供电技术等等等。感觉学了一堆什么也没学会,到了研究生期间导师没什么具体的项目,让我们自己选择,现在看来这也挺好的,没人管挺好。

同步内容