精华内容
下载资源
问答
  • 011 Verilog原语

    2020-10-08 17:09:38
    Verilog原语,UDP,User Defined Primitive,用户自定义原语

    原语

    是构成设计的最基本单元,通过真值表描述其功能,包括基本逻辑门在内有26个预定义功能模型

    n输入逻辑门

    在这里插入图片描述

    原语 描述 使用
    and 与门 and(yout, xin1, xin2, xin3)
    nand 与非 nand(yout, xin1, xin2, xin3)
    or 或门 or(yout, xin1, xin2, xin3)
    nor 或非 nor(yout, xin1, xin2, xin3)
    xor 异或 xor(yout, xin1, xin2, xin3)
    xnor 同或 nxor(yout, xin1, xin2, xin3)

    n输出组合门

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    UDP(User Defined Primitive,用户自定义原语)

    符号汇总

    符号 意义
    0,1,x 逻辑0,1,x为未知值,UDP中没有z
    ? 无关逻辑,可以是0,1,x
    b 逻辑0或1
    - 不变化
    (xy) 从x变为y,如(01)为上升沿
    * 输入信号的任何变化
    r 上升沿
    f 下降沿
    p 含x的上升沿,等同于(01)、(0x)、(x1)
    n 含x的下降沿,等同于(10)、(x0)、(1x)

    与门

    primitive and(y, x1, x2);
    	output y;
    	input x1, x2;
    
    	table
    	// x1 x2 : y
    	0 0 : 0;
    	0 1 : 0;
    	1 0 : 0;
    	1 1 : 1;
    	endtable
    endprimitive
    

    2输入多路复用器

    输入可以是0,1,x,所以考虑所有情况的2输入多路复用器如下:

    primitive mux_two(out, select, a, b);
    	output out;
    	input select, a, b;
    	// y = select ? a : b;
    
    	table
    	// select	a	b	:	out
    	   0		0	0	:	0;
    	   0		0	1	:	0;
    	   0		0	x	:	0;
    	   0		1	0	:	1;
    	   0		1	1	:	1;
    	   0		1	x	:	1;
    
    	   1		0	0	:	0;
    	   1		1	0	:	0;
    	   1		x	0	:	0;
    	   1		0	1	:	1;
    	   1		1	1	:	1;
    	   1		x	1	:	1;
    
    	   x		0	0	:	0;
    	   x		1	1	:	1;
    	endtable
    endprimitive
    

    使用助记符?简化,?=0,1,x

    primitive mux_two(out, select, a, b);
    	output out;
    	input select, a, b;
    	// y = select ? a : b;
    
    	table
    	// select	a	b	:	out
    	   0		0	?	:	0;
    	   0		1	?	:	1;
    
    	   1		?	0	:	0;
    	   1		?	1	:	1;
    
    	   ?		0	0	:	0;
    	   ?		1	1	:	1;
    	endtable
    endprimitive
    

    透明锁存器(电平敏感)

    其实就是带使能的锁存器

    primitive latch_with_enable(q_out, enable, data);
    	output q_out;
    	input enable, data;
    	reg q_out;
    	// q_out = enable ? data : q_out;
    	// - 表示保持
    
    	table
    	// 时序逻辑table格式
    	// input1	input2	state 	: 	output/next_state
    	// enable	data	state	:	q_out/next_state
    	   1		1			?	:	1;
    	   1		0			?	:	0;
    	   0		?			?	:	-;
    
    	   x		0			0	:	-;
    	   x		1			1	:	-;
    	endtable
    endprimitive
    

    D触发器(边沿敏感)

    primitive DFF(q_out, clk, data);
    	output q_out;
    	input clk, data;
    	reg q_out;
    	// q_out = posedge(clk) ? data : q_out;
    	// - 表示保持
    
    	table
    	// 时序逻辑table格式
    	// input1	input2	state 	: 	output/next_state
    	// clk		data	state	:	q_out/next_state
    	   (01)		0		?		:	0;
    	   (01)		1		?		:	1;
    	   (0?)		1		1		:	1;
    
    	   (?0)		?		?		:	-;
    
    	   ?		(??)	?		:	-;
    	endtable
    endprimitive
    
    展开全文
  • 数字IC设计 FPGA——再谈乘法器设计(使用Verilog 原语 LUT 进行四位乘法器设计) 乘法器同加法器一样,在数字信号的各种算法中被频繁的使用,并且对于整个系统的速度的影响是很大的。那么如何实现快速高效的乘法器...

    数字IC设计 FPGA——再谈乘法器设计(使用Verilog 原语 LUT 进行四位乘法器设计)

    乘法器同加法器一样,在数字信号的各种算法中被频繁的使用,并且对于整个系统的速度的影响是很大的。那么如何实现快速高效的乘法器关系着整个系统的运算速度和资源效率最大化的利用。

    乘法操作分为有符号操作和无符号操作两大类,无符号操作相对于有符号乘法操作相对简单,但也只需要简单的变换就能有符号乘法器变换为无符号乘法器。

    本次主要是基于Verilog 原语LUT 进行乘法器的设计。
    相关的乘法器知识可以参考之前的博文:

    数字电路基础知识——组合逻辑电路之乘法器的设计(一)—— 并行、移位相加、加法树、查找表乘法器
    数字电路基础知识——乘法器的设计(二)( 串行、流水线、有符号数八位乘法器)

    一、乘法器架构
    1. 乘法器
      由于乘数和被乘数都是二进制,所以利用人工计算来分析,所以利用乘数从最后一位到第第一位每一位依次与被乘数相乘,从第二位开始每一位都要依次左移一位,形成一个阵列的式。而由于两个一位二进制数相乘,实际上是做与运算,所以就将乘法操作简化为了与运算、移位操作以及加法操作。比如 1011与 1101相 乘,如图,实际上可看作 1011+00000+101100+1011000四个数相加。
      在这里插入图片描述
    2. 乘法器结构
      乘法运算是由与、或、非等基本逻辑组合而成的,如下图所示是乘法器内部结构图
      在这里插入图片描述
    二、乘法器的 Verilog 原语设计
    1. 设计思路
      使乘法器的输入分别为A[3:0]和B[3:0],设计思路先计算出相与的结果,将相与的结果一次移位相加得到最后的结果。移位相加所使用的全加器是之前在下面这篇博客中以LUT3设计的一位全加器。
      数字IC设计 FPGA——再谈加法器设计(使用Verilog 原语 进行四位加法器设计)
      并设置中间变量:
      t0,t1,t2,t3:第一行至第四行相与的结果
      ts0,ts1,ts2,ts3:第一行至第四行的结果输出
      tc0,tc1,tc2,tc3:第一行至第四行的进位输出
    2. Verilog代码
    module addr_4bit(
    A,B,Y
        );
    
    input [3:0] A,B;
    output [7:0] Y;
    
    wire [3:0] t0,t1,t2,t3; //每一行相与结果
    wire [3:0] ts0,ts1,ts2,ts3; //每一行的相加的结果输出
    wire [3:0] tc0,tc1,tc2,tc3; //每一行的进位输出
    
    genvar i;
    generate
       for (i=0;i<4;i=i+1)
       begin: label1  
            assign t0[i] = A[i] & B[0];
            assign t1[i] = A[i] & B[1];
            assign t2[i] = A[i] & B[2];
            assign t3[i] = A[i] & B[3];
       end  
    endgenerate
    
    genvar j;
    generate
        for (j=0;j<4;j=j+1)
        begin:label2
            assign ts0[j]= t0[j];
            assign tc0[j] = 1'b0;
        end
    endgenerate
    
    genvar m;
    generate
       for (m=0;m<3;m=m+1)
       begin: label3
            addr_bit u1(
            .A(t1[m]),
            .B(ts0[m+1]),
            .S(ts1[m]),
            .Cout(tc1[m]),
            .Cin(tc0[m])
            ); 
       end  
    
       for (m=0;m<3;m=m+1)
       begin: label4
            addr_bit u2(
            .A(t2[m]),
            .B(ts1[m+1]),
            .S(ts2[m]),
            .Cout(tc2[m]),
            .Cin(tc1[m])
            ); 
       end  
    
       for (m=0;m<3;m=m+1)
       begin: label5
            addr_bit u3(
            .A(t3[m]),
            .B(ts2[m+1]),
            .S(ts3[m]),
            .Cout(tc3[m]),
            .Cin(tc2[m])
            ); 
       end  
    endgenerate
    
    
    assign ts1[3]=t1[3];
    assign ts2[3]=t2[3];
    assign ts3[3]=t3[3];
    
    wire [3:0] rac,ras;
    
    assign rac[0]= 1'b0;
    
    genvar n;
    generate
        for (n=0;n<3;n=n+1)
        begin :label6
            addr_bit u4(
            .A(rac[n]),
            .B(ts3[n+1]),
            .S(ras[n]),
            .Cin(tc3[n]),
            .Cout(rac[n+1])
            );
        end
    endgenerate
    
    assign Y[0]=ts0[0];
    assign Y[1]=ts1[0];
    assign Y[2]=ts2[0];
    assign Y[3]=ts3[0];
    
    
    genvar p;
    generate
        for (p=4;p<7;p=p+1)
        begin:label7
            assign Y[p]=ras[p-4];
        end
    endgenerate
    
    assign Y[7]=rac[3];
    endmodule
    

    rac和ras是高四位的进位输出和结果输出相与的结果。必须要想加才能得到正确的结果。

    1. RTL结构图
      在这里插入图片描述
    2. 仿真结果如下:
      可以看到有正确的输出结果和进位输出
      在这里插入图片描述
    3. 综合之后资源的利用在这里插入图片描述
      40LUT包括24个LUT3和16个LUT2(与门)
    三、总结
    1. 使用该乘法器能够拓展为其他新的位宽的乘法器。该乘法器可能不是最好的乘法器架构。
    2. 如果再不采用原语进行设计的情况下,直接编写加法器Verilog代码,综合工具会根据自己的算法给出一个比较合理的电路,可能会比我们采用后一种方法设计的要更好,这需要依赖EDA综合工具。
    3. 但是通过了解CLB的不同的基本配置方式以及内部资源分布,对于更好理解软件综合过程和设计具有更好的指导意义
    4. 如果能再关键的位置手动配置硬件资源,可能会改善局部性能,这对于高性能计算硬件有重要意义,尤其是底层的硬件加法等部件。
    展开全文
  • 数字IC设计 FPGA——再谈加法器设计(使用Verilog 原语 进行四位加法器设计) 前面介绍了关于xilinx FPGA CLB的基本原理和结构,以及如何使用原语进行设计 一、基于LUT3的四位加法器设计 对于generate语句块,这是...

    数字IC设计 FPGA——再谈加法器设计(使用Verilog 原语 进行四位加法器设计)

    前面介绍了关于xilinx FPGA CLB的基本原理和结构,以及如何使用原语进行设计(在一般的设计中使用不到,本节只是更好理解FPGA内部逻辑块资源的使用),参考这篇博客:
    浅谈XILINX FPGA CLB单元 汇总 (CLB、LUT、存储单元、Distributed RAM、移位寄存器、多路复用器、进位逻辑(Carry Logic))

    之前写过一篇关于如何使用Verilog 设计半加器,全加器及超前进位加法器的博客:数字电路基础知识(四) 加法器-半加器、全加器与超前进位加法器

    在使用FPGA进行设计时,如果能对FPGA中的资源分布及配置能有详细的了解,对于设计高性能的计算硬件具有更好的指导意义。因此我们可以使用原语来设计快速加法器或乘法器等比较常用的电路。

    一、基于LUT3的四位加法器设计

    因为一个全加器由输入A,B,及进位信号Cout 三个输入端口,所以利用查找表进行设计,应该选用LUT3以上的查找表,下面针对LUT3 单元进行设计分析
    下面的结构是经典的行波进位加法器
    在这里插入图片描述

    1. 全加器
      有关基本的加法器的介绍本节会略去。
      一位全加器的基本逻辑方程:
      S = A xor B xor Cin
      Cout = (A and B) or (A and Cin) or (B and Cin)

      下表给出了真值表:
      在这里插入图片描述
      因此输出S的三位查找表的初始值为:8’b1001_0110 (8’h96)
      进位输出Cout的三位查找表的初始值为:8’b1110_1000 (8’hE8)

    2. 使用Vivado进行一位全加器的设计
      代码如下:

    module addr_1bit(
    A,B,Cin,S,Cout
        );
    
    input A,B;
    input Cin;
    output S,Cout;
    
    LUT3 #(
          .INIT(8'h96)  // Specify LUT Contents    查找表值
       ) LUT3_inst1 (		
          .O(S),   // LUT general output 结果输出端
          .I0(Cin), // LUT input
          .I1(B), // LUT input
          .I2(A)  // LUT input
       );
    
    LUT3 #(
          .INIT(8'hE8)  // Specify LUT Contents 	查找表值
       ) LUT3_inst2 (		
          .O(Cout),   // LUT general output 进位输出端
          .I0(Cin), // LUT input
          .I1(B), // LUT input
          .I2(A)  // LUT input
       );
    
    endmodule
    

    LUT3_inst1和LUT3_inst2分别是S 结果输出端和Cout进位输出端。

    1. 仿真结果在这里插入图片描述
    2. 四位全加器的设计
    module addr_4bit(
    A,B,Ci,S,Co
        );
    
    input [3:0] A,B;
    input Ci;
    output [3:0] S;
    output Co;
    
    wire [4:0] Cin;
    
    genvar i;
    generate
       assign Ci = Cin[0];
       assign Co = Cin[4];
       for (i=0;i<4;i=i+1)
       begin: label				// label是实例化之后的名称
            addr_1bit u(
            .A(A[i]),
            .B(B[i]),
            .S(S[i]),
            .Cout(Cin[i+1]),
            .Cin(Cin[i])
            );  
       end  
    endgenerate
    
    endmodule
    

    需要注意的是Cin是线网wire类型的变量,位宽为5bit。addr_1bit即为上面的一位全加器的模块。

    对于generate语句块,这是Verilog 2001语法中新增的语法,方便了设计者设计电路。
    但需要注意generate-for语句:
    (1) 必须有genvar关键字定义for语句的变量。
    (2)for语句的内容必须加begin和end(即使就一句)。
    (3)for语句必须有个名字。

    上面的generate 的代码片段等效于下面:

    /*
    addr_1bit u1(.A(A[0]),.B(B[0]),.S(S[0]),.Cin(Cin[0]),.Cout(Cin[1]));
    addr_1bit u2(.A(A[1]),.B(B[1]),.S(S[1]),.Cin(Cin[1]),.Cout(Cin[2]));
    addr_1bit u3(.A(A[2]),.B(B[2]),.S(S[2]),.Cin(Cin[2]),.Cout(Cin[3]));
    addr_1bit u4(.A(A[3]),.B(B[3]),.S(S[3]),.Cin(Cin[3]),.Cout(Cin[4]));
    
    assign Ci = Cin[0];
    assign Cout = Cin[4];
    */
    

    其RTL电路为:
    在这里插入图片描述
    仿真结果如下:
    可以看到有正确的结果输出和进位输出
    在这里插入图片描述
    5. 利用LUT3设计四位加法器的资源利用及延迟情况
    在这里插入图片描述
    在这里插入图片描述

    二、基于LUT5的四位加法器设计

    1. 对于上面利用LUT3来设计加法器的情况,无论是资源使用情况还是延迟都存在改进的空间,由于Xilinx 7 系列中CLB是由LUT5/6组成,而上述的LUT3实际上把LUT5当作是LUT3来使用了,即资源中所使用的8个LUT3实际上占用8个LUT5。
      因此可以想到的是将加法器直接使用LUT5,就可以减少资源的使用及可以减少延迟。
      下图是改进的四位加法器结构:
      使用5输入查找表,就可以使用俩位全加器,即五个输入分别是,两个加数A0,A1、两个加数B0,B1,进位输入Cin;输出需要三个结果输出S0,S1,进位输出Cout。
      在这里插入图片描述
    2. 设计思路
      由于把两个全加器当作一级来使用,因此有五个输入,三个输出,但是LUT5只能提供俩输出,因此还需要一个LUT3来作为第三个输出使用。因此,每一级使用2个五输入查找表和一个三输入查找表。
      具体的每一级全加器的真值表如下:
      在这里插入图片描述

    我们将S0作为三位查找表的输出,其初始值仍为:8’b1001_0110 (8’h96);
    输出S1的五位查找表,初始值为:32’b1001_1001_1001_0110_1001_0110_0110_0110 (32’h9996_9666);
    输出Cout的五位查找表,初始值为:32’b1110_1110_1110_1000_1110_1000_1000_1000 (32’hEEE8_E888)

    1. 一级对应的全加器代码如下:
      在这里插入图片描述
      RTL电路结构:
      在这里插入图片描述
    2. 两级形成四位全加器
    module addr_4bit(
    a0,a1,b0,b1,Ci,s0,s1,Co
        );
    
    input [1:0] a0,a1,b0,b1;
    input Ci;
    output [1:0] s0,s1;
    output Co;
    
    wire [2:0] Cin;
    
    addr_2bit u1(
            .A0(a0[0]),
            .A1(a0[1]),
            .B0(b0[0]),
            .B1(b0[1]),
            .S0(s0[0]),
            .S1(s0[1]),
            .Cin(Cin[0]),
            .Cout(Cin[1])
    );
    
    addr_2bit u2(
            .A0(a1[0]),
            .A1(a1[1]),
            .B0(b1[0]),
            .B1(b1[1]),
            .S0(s1[0]),
            .S1(s1[1]),
            .Cin(Cin[1]),
            .Cout(Cin[2])
    );
    
    assign Ci = Cin[0];
    assign Co = Cin[2];
    
    endmodule
    

    RTL电路结构:
    在这里插入图片描述
    仿真结果:
    在这里插入图片描述
    5. 两级形成四位全加器的资源利用和延迟情况对比
    在这里插入图片描述
    在这里插入图片描述
    可以看到和之前采用LUT3设计的四位加法器相比,资源利用变少了,关键路径延迟也变小了。

    但需要说明一点的是:
    如果再不采用原语进行设计的情况下,直接编写加法器Verilog代码,综合工具会根据自己的算法给出一个比较合理的电路,可能会比我们采用后一种方法设计的要更好,这需要依赖EDA综合工具。
    但是通过了解CLB的不同的基本配置方式以及内部资源分布,对于更好理解软件综合过程和设计具有更好的指导意义,如果能再关键的位置手动配置硬件资源,可能会改善局部性能,这对于高性能计算硬件有重要意义,尤其是底层的硬件加法等部件。

    展开全文
  • 数字电路设计之verilog 原语

    千次阅读 2014-09-28 14:55:32
    verilog原语: http://wenku.baidu.co/link?url=vDFd1mnHZTwOa74o1IhJqwsuY7WZjd4zUnw8BucYYlHNkHuBElH4Gw2Ryr6VH8r0UHiih83TqNW55aSAHj3kPFqxAeub5yWgBeF7HTKwSMm ...
  • 一、分布式RAM(Distributed RAM)SLICEM中的函数发生器添加一个据输入端口和使能就将 其拓展成一个分布式 RAM。分布式 。分布式 RAM的资源可以在 SLICE中配置, 中配置。RAM的主要特点。...Verilog 中 关键部分
  • 今天给大侠带来Verilog HDL原语浅析,获取电子版,请在“FPGA技术江湖”公众号内回复“Verilog HDL原语浅析”。话不多说,上货。
  • verilog硬件原语浅析

    2011-12-01 11:47:04
    总结了 verilog一些典型的概念和用法
  • verilog之用户定义原语UDP详细解释

    千次阅读 2019-07-12 21:04:42
    一、UDP的含义 用户定义的原语是从英语User Defined Primitives 直接翻译过来的,简称UDP...这样就可以与调用verilog HDL基本逻辑元件的方法来调用原语库中相应的元件模块,并进行仿真。由于UDP是由查找表的方法来...
  • Verilog 中需要使用原语的情况

    千次阅读 2018-04-03 09:40:06
    一般来说,在进行HDL代码编写时,不需要直接或间接地进行原语调用,因为随着FPGA设计规模越来越庞大,人脑应该集中于抽象层次较高的工作中去,而将这些具体实现细节交给编译器来完成。不过有些时候,原语或者库中...
  • 最近做QDR II SRAM控制器,要用到xilinx的原语IDDR,我的数据输入输出是18位的,又用到Generate将一位输入输出IDDR扩成18位,以前没用过generate,也不太熟悉,现在已熟悉其应用场合及其用法。
  • Verilog HDL的自定义原语(UDP) Verilog HDL不仅有自带的门级原语,还允许用户进行自定义原语。 1.UDP的定义 (1)UDP在Verilog HDL中可以被看成一个模块,与模块的定义在语法是同一级别的,所以UDP的定义不能在...
  • Verilog基本语法——原语篇(Gate门)

    千次阅读 2020-02-20 14:31:22
    Verilog中已有一些建立好的逻辑门和开关的模型。在所涉及的模块中,可通过实例引用这些门与开关模型,从而对模块进行结构化的描述。 逻辑门: and (output,input,…) nand (output,input,…) or (output,input,…) ...
  • 2)每种们都有对应的逻辑符号,真值表和Verilog原语,原语的调用和模块的调用是一致的,但这些基础的门模块Verilog相当于已经定义好了,不需要自行编写; 3)通过两个完整的设计实例总结出来了完整的步骤: a.画出...
  • 介绍了verilog 原语,即一些基本的逻辑门,例化时不必写例华名; 介绍了verilog module 的结构; 4.2 逻辑系统的验证和测试方法 四值逻辑:0/1/x/z, x: 例如当一个wire 的变量被两个相反的信号驱动时,仿真器就无法...
  • iddr verilog

    2017-09-06 16:08:06
    FPGA中IDDR的使用方法,用verilog语言编写原语 在某些情况下,输入数据必须同步到一个时钟域里,通常C0同步。但是在频率比较高的情况下,这种同步相对比较困难,因为有效时间仅为时钟周期的一半(50%占空比的情况下...
  • verilog 教程

    2010-01-28 20:48:56
    Verilog语言基本语言要素,表达式,门电平模型化,用户定义原语,数据流模型化,行为建模,结构建模,等。
  • 7系列FPGA原语例程

    2016-10-25 16:10:23
    7系列的Verilog/VHDL原语使用例程,可用NotePad或UltraEdit等工具打开查看

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 150
精华内容 60
关键字:

verilog原语