FPGA两种寄存器的使能
在FPGA中,寄存器的使能设计一般有两种方式:
1.直接使用寄存器的使能端口。

2.使用一个数据选择器连接寄存器的D端口,通过数据选择器的sel端口做使能。如下图

这个方式与直接使用寄存器的CE端口有什么区别呢?
我们可以看出来,
1.在Q1为输出端口时,此时这个结构所具有的功能和普通的寄存器是一样的,当CE=1时,D经过数据选择器选通在经过一个时钟的延迟后到达Q1端口。CE=0时具有保存功能。是不是就是下面的写法。
always@(posedge clk)begin
if(CE)begin
Q1 <= D;
end
end
2.那在Q0为输出端口是呢?此时当CE=1时,数据直接被选通输出到Q0端口,没有延迟。而当CE=0时也具有保持功能。
我们这里就会思考,没有延迟,直接通过,那么我下面这样写是不是就是这种功能呢?
always@(posedge clk)begin
if(CE)begin
Q0 = D;
end
end
将 非阻塞赋值 <=变成 =阻塞赋值, 那这样行不行呢?下面就进行验证
这是综合后的电路,直接告诉我们这个写法和1寄存器的写法是一样的Q0与D同样存在一个时钟的延迟,并且下面这个仿真图也验证了我们的观点。
这样的写法并不会综合成2结构的电路,并且D端口与Q0端口存在一个时钟的延迟。


事实上我们应该写成以下形式:
module test
(
input clk,
input D,
input CE,
output Q0
); reg Qt=;
assign Q0 = CE ? D:Qt;
always@(posedge clk)begin
if(CE)begin
Qt <= D;
end
end endmodule
综合出来的电路如下图所示,这才是2结构的电路。

那讲到这里,BB了这么多,这个电路结构到低有什么用呢? 下面我就举个栗子
假设我们需要这样一个功能
1. 连续输入 x1 y1 x2 y2
2. 当 x1>0时 输出 x1 否则 -x1
3. 当 x1>0时 输出 y1 否则 -y1,即y1根据x1的符号进行输出
4. 当 x2>0时 输出 x2 否则 -x2
5. 当 x2>0时 输出 y2 否则 -y2,即y2根据x2的符号进行输出
那么我们就使用这样的结构保存x的符号值,供y使用。
FPGA两种寄存器的使能的更多相关文章
- C语言访问MCU寄存器的两种方式
转自http://blog.csdn.net/liming0931/article/details/7752248 单片机的特殊功能寄存器SFR,是SRAM地址已经确定的SRAM单元,在C语言环境下对 ...
- Arduino下LCD1602综合探究(上)——1602的两种驱动方式,如何使LCD的控制编程变得更简单
一.前言: LCD ( Liquid Crystal Display 的简称)液晶显示器,已经逐渐替代CRT成为主流的显示设备之一,因此也成为了单片机发烧友绕不过的话题之一:而LCD1602更是很多单 ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- MSP430单片机的两种SPI总线实现方式
MSP430单片机上的SPI总线的实现方式分为两种:硬件实现和软件实现. 二者的抽象层次不同,硬件实现方式下程序员只需要完成总线协议的寄存器层,即一字节(char,8位二进制)数据,而软件实现方式下程 ...
- 传递引用类型参数的两种方式(转自 MSDN)
引用类型的变量不直接包含其数据:它包含的是对其数据的引用.当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值(更改属性的值),但是无法更改引用本身的值:也就是说,不能使用相同的引 ...
- Linux 下操作GPIO(两种方法,驱动和mmap)(转载)
目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...
- 认识OD的两种断点
OllyDBG从原理上来区分,有两种不同的断点:软件断点和硬件断点. 也许会有朋友说那不是还有内存断点吗? 内存断点严格来说是属于一种特殊的软件断点. 内存断点: 内存断点每次只能设置一个,假如你设置 ...
- Linux 下操作gpio(两种方法,驱动和mmap)
目前我所知道的在linux下操作GPIO有两种方法: 1. 编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...
- 从51跳新唐cortex学习3——细说新唐两种定时器
的定时器我们已经是相当熟悉啦.但是,对于第一次接触新唐,第一次接触cortex的定时器一样,都是加1计数,但是功能和容量变大了),包括4个32位定时器(里面放24位的数据),还有分频功能.TMER0到 ...
随机推荐
- 对象的创建过程(chapter5.7.3)
总结一下对象的创建过程,假设有一个名为Dog的类: 1. 即使没有显示地使用static关键字,构造器实际上也是静态的方法,因此,当首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类 ...
- ajax 大洋与小样的第二步
一.Ajax的对象 XMLHttpRequest的方法 方法 描述 abort() 停止当前请求 getAllResponseHeaders() 把 HTTP请求的所有响应首部作为健/值对返回 get ...
- 鼠标滚动:mousewheel事件在Firefox采用DOMMouseScroll事件的统一处理
这是一个小事件,但当下的WEB应用交互非常丰富,判断鼠标的滚动来执行相应的操作是比较常见的.我用Chrome/IE/Firefox/Opera 4种浏览器做测试,发现只有firefox的处理方法有很大 ...
- Centos7部署Zabbix
转载于http://www.cnblogs.com/xqzt/p/5124894.html,更正了部分错误,并增加了个别问题处理办法. 一.Zabbix简介 zabbix是一个基于WEB界面的提供分布 ...
- iOS图片填充UIImageView(contentMode)
本文主要形象的介绍一下UIView的contentMode属性: 核心代码 [self.prp_imageView setContentMode:UIViewContentModeScaleAspec ...
- ios runtime部分事例方法说明
一.场景--动态改变变量 unsigned ; Ivar *ivar = class_copyIvarList([self.person class], &count); ; i<cou ...
- css伪类的组合用法
利用伪类组合,可以用css代替js以达到目的,少些一下js .textarea:empty:before { display: block; content: '请输入'; color: #ababa ...
- 【转载】stm32定时器-----珍藏版
今天看到一个讲解定时器特别细致入微的文章,真是难得... 原文地址:http://www.cnblogs.com/zjvskn/p/5751591.html 一.STM32通用定时器原理 STM32 ...
- js 时间时间戳互换
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- redis multi exec
multi(),返回一个redis对象,并进入multi-mode模式,一旦进入multi-mode模式,以后调用的所有方法都会返回相同的对象,直到exec()方法被调用. phpredis是php的 ...