在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两种寄存器的使能的更多相关文章

  1. C语言访问MCU寄存器的两种方式

    转自http://blog.csdn.net/liming0931/article/details/7752248 单片机的特殊功能寄存器SFR,是SRAM地址已经确定的SRAM单元,在C语言环境下对 ...

  2. Arduino下LCD1602综合探究(上)——1602的两种驱动方式,如何使LCD的控制编程变得更简单

    一.前言: LCD ( Liquid Crystal Display 的简称)液晶显示器,已经逐渐替代CRT成为主流的显示设备之一,因此也成为了单片机发烧友绕不过的话题之一:而LCD1602更是很多单 ...

  3. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  4. MSP430单片机的两种SPI总线实现方式

    MSP430单片机上的SPI总线的实现方式分为两种:硬件实现和软件实现. 二者的抽象层次不同,硬件实现方式下程序员只需要完成总线协议的寄存器层,即一字节(char,8位二进制)数据,而软件实现方式下程 ...

  5. 传递引用类型参数的两种方式(转自 MSDN)

    引用类型的变量不直接包含其数据:它包含的是对其数据的引用.当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值(更改属性的值),但是无法更改引用本身的值:也就是说,不能使用相同的引 ...

  6. Linux 下操作GPIO(两种方法,驱动和mmap)(转载)

    目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...

  7. 认识OD的两种断点

    OllyDBG从原理上来区分,有两种不同的断点:软件断点和硬件断点. 也许会有朋友说那不是还有内存断点吗? 内存断点严格来说是属于一种特殊的软件断点. 内存断点: 内存断点每次只能设置一个,假如你设置 ...

  8. Linux 下操作gpio(两种方法,驱动和mmap)

    目前我所知道的在linux下操作GPIO有两种方法: 1.  编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...

  9. 从51跳新唐cortex学习3——细说新唐两种定时器

    的定时器我们已经是相当熟悉啦.但是,对于第一次接触新唐,第一次接触cortex的定时器一样,都是加1计数,但是功能和容量变大了),包括4个32位定时器(里面放24位的数据),还有分频功能.TMER0到 ...

随机推荐

  1. JavaScript基础学习(五)—其他引用类型

         JavaScript定义了两个内置对象: Global和Math. 一.Global对象 1.URI编码方法      Global对象的encodeURI()和encodeURICompo ...

  2. Andorid开发中如何去除标题栏title

    有两种方法可以去除标题栏的title. 1.在代码中实现 在setContentView()方法之前加上这一句 requestWindowFeature(Window.FEATURE_NO_TITLE ...

  3. mpusher 源码编译 for windows X64

    mpusher 源码编译 for windows X64 对于java我是小白,通过一步步的摸索,将经验总结下来,给更多码友提供入门的帮助.一个人的摸索是很困难的,本教程感谢 [MPush开源消息推送 ...

  4. ZOJ 3195 Design the city 题解

    这个题目大意是: 有N个城市,编号为0~N-1,给定N-1条无向带权边,Q个询问,每个询问求三个城市连起来的最小权值. 多组数据 每组数据  1 < N < 50000  1 < Q ...

  5. BeautifulSoup库children(),descendants()方法的使用

    BeautifulSoup库children(),descendants()方法的使用 示例网站:http://www.pythonscraping.com/pages/page3.html 网站内容 ...

  6. 用eclipes 添加jboss tools中的hibernate tool进行反向工程生成数据库对应的BOJO(Javabean)

    用eclipes 添加jboss tools中的hibernate tool进行反向工程生成数据库对应的BOJO(Javabean) 安装: 在help中eclise marksplace中查询JBo ...

  7. 子集构造法实现NFA的确定化

    功能: 采用子集构造算法实现NFA的确定化 输入:读取NFA的文件(文件名test.txt),  文件格式: 第一列表示状态名,第二列和第三列分别表示输入字符a和b到达的状态 输出:确定化后的DFA( ...

  8. wcf发布的服务在前端调用时,遇到跨域问题的解决方案

    我是使用IIS作为服务的宿主,因此需要在web.config中增加如下配置节: <bindings> <webHttpBinding> <binding name=&qu ...

  9. 蓝桥杯-四平方和-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  10. poj1159二维树状数组

    Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows ...