- 浏览: 25960 次
- 性别:
- 来自: 深圳
最新评论
文章列表
乘法器的Verilog HDL实现
- 博客分类:
- FPGA
1. 串行乘法器
两个N位二进制数x、y的乘积用简单的方法计算就是利用移位操作来实现。
对应的HDL代码为:
module multi_CX(clk, x, y, result);
input clk;
input [7:0] x, y;
output [15:0] result;
reg [15:0] result;
parameter s0 = 0, s1 = 1, s2 = 2;
r ...
在实时信号处理中,常常要用到多位数字量的加法运算,但串行加法器速度较慢,超前进位加法器则能满足要求,且结构并不复杂。现在普遍使用的并行加法器是超前进位加法器,只是在几个全加器的基础上增加了一个超前进位形成逻辑,以减少由于逐步进位信号的传递所造成的时延。
具体的算法为:
S_i = x_i ^ y_i ^ C_i;
C_i = G_i-1 + P_i-1 * C_i-1;
其中: G_i = x_i * y_i
P_i = x_i + y_i
对应的HDL代码为:
module adder_4bits_parallel(a,b,c_in,sum,c_ou ...
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行。这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时间无关。这样,在理想的流水操作状态下,其运行效率很高。
如果某个设计的处理流程分为若干步骤,而且整个数据处理是单流向的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法来提高系统的工作频率。
下面用8位全加器作为实例,分别列举了非流水线方法、2级流水线方法和4级流水线方法。
(1)非流水线实现方式module adder_8bits(din_1, clk ...
三态缓冲器也称三态门,其典型应用是双向端口,常用于双向数据总线的构建。
在Verilog HDL中,inout型双向端口信号不能被定义成reg型变量,因此在always块内不能被直接赋值使用。
由于现在FPGA设计和外部存储器或CPU数据交 ...
此抢答器用异步时序电路实现。异步时序电路,顾名思义就是电路的工作节奏不一致,不存在单一的主控时钟,主要是用于产生地址译码器、FIFO和异步RAM的读写控制信号脉冲。除可以使用带时钟的触发器外,还可以使用不带时钟的触发器和延迟元件作为存储元件;电路状态的改变由外部输入的变化直接引起。由于异步电路没有统一的时钟,状态变化的时刻是不稳定的,通常输入信号只在电路处于稳定状态时才发生变化。也就是说一个时刻允许一个输入发生变化,以避免输入信号之间造成的竞争冒险。
对应的verilog代码为:
module QiangDaQi(emcee, actor_1, actor_2, actor_3, actor_ ...
4位串行进位加法器:
全加器的算法为:
S = X ^ Y ^ C_in ;
C_out = X*Y + X*C_in + Y*C_in ;
对应的verilog代码为:
module adder_4bits(A, B, C_in, S_out, C_out);
input [3:0] A;
input [3:0] B;
input C_in;
output [3:0] S_out;
output C_out;
reg [3:0] S_out;
reg C_out;
reg [1:0] T1, T2, ...
1. sizeof操作符 与 strlen()函数的区别:
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int p1[5] = {1,2,3,4,5};
char p2[20] = "hello world!";
cout << sizeof(p1) << endl;
cout << sizeof(p2) << '\t' << strlen(p2) < ...
CPLD/FPGA同步电路具备最稳定的工作状态和工作性能,因此经常需要将外部输入的异步信号进行同步处理(与系统时钟同步)和整形(将输入信号由不规则波形提取为具备一个时钟周期长的脉冲信号)
同步整形的基本方法就是通过时钟对异步信号连续采样得到同步信号,然后由前后两次的同步采样进行逻辑组合得到整形输出。
以下是一个利用上升沿完成信号同步整形的设计:
module syn_posedge_2WideClk(clk, rst_n, din, dout);
input clk;
input rst_n;
input din;
output dout;
...
奇数倍分频有多种实现方法,下面介绍常用的错位异或法的原理:
以下是一个3分频电路的verilog代码:
module clk_div_3(clk_in, rst_n, clk_out);
input clk_in;
input rst_n;
output clk_out;
reg [1:0] cnt_p, cnt_n;
reg clk_out_p, clk_out_n;
always @(posedge clk_in) begin
if(!rst_n) begin
cnt_p <= 0;
clk_o ...
抛开一些不好的情绪,放下一些不应该的念头,今天下午到图书馆,学习了《微电子概论》一书的第六章——《集成电路设计》,这里做一个小小的总结。
1. 集成电路设计的最终输出结果是掩模板图。通过制版和工艺流片 ...
今天回顾了一下和项目有关的一些TCP知识,熟悉这些时候后再去看ns的源码,发现事半功倍...这里,总结一下这些TCP的知识点:
1. 流交付服务
TCP是一种面向流的协议,它允许进程以字节流的形式来传递数据,而接收进程也把数 ...
今天开始沉下心来好好搞项目,我们小组的任务是完成利用网络编码技术改进传统TCP协议,我主要是负责进行ns仿真。今天上午回顾了一下以前进行的工作,下午试验在ns2中植入了一个小协议Bing(其实就是Ping协议,由于在现有ns源代码中已经有了Ping协议,故改名为Bing协议)。以下是植入的过程:
First Step: 编写bing.h文件
#ifndef ns_bing_h
#define ns_bing_h
#include "agent.h"
#include "tclcl.h"
#include "packet.h ...
今天开始自己学习java后第一个小项目的编写——“一个小型的聊天窗口互动小模型”,从昨天晚上开始看有关内容,今天早晨继续,算是完成了最初步的一些工作...现在来做一个小小的总结:
Chat0.1版本: 仅仅是new出来一个Frame ...
1. Container 和 Component是AWT中的两个核心类。
2. 两种常用的Container: Window 和 Panel。 其中对于panel来说,其对象可以作为容纳其他Component对象,但不能独立存在,必须被添加到其他Container中(如window或Applet)。
3. 对于Frame,有如下小程序:
package com.java.TestFrame;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
...