第11章编写和验证简单的存组合逻辑模块_第1页
第11章编写和验证简单的存组合逻辑模块_第2页
第11章编写和验证简单的存组合逻辑模块_第3页
第11章编写和验证简单的存组合逻辑模块_第4页
第11章编写和验证简单的存组合逻辑模块_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编写和验证简单的纯组合逻辑模块概述 复杂的算法数字逻辑电路是由基本运算逻辑、数据流动控制逻辑和接口逻辑电路所构成的。 为了提高算法的运算速度除了提高制造工艺技术外,逻辑结构设计是最重要的环节。而设计出结构合理的基本运算组合电路是算法逻辑结构设计的基础,只有深入理解复杂组合电路的许多基本特点,才有可能通过电路结构的改进来提高算法逻辑系统的基本时钟速度,为结构合理的高速复杂算法的数字逻辑系统的构成打下坚实的基础。 加法器一位全加器的真值表 逻辑公式Ci = Xi Yi + Yi Ci-1 + Xi Ci-1 Si = Xi / Ci + Yi / Ci + Ci-1 /Ci + Xi Yi Ci-

2、1加法器加法器1、串行进位加法器、串行进位加法器:把n位全加器串联起来,低位全加器的进位输出连接到相邻的高位全加器的进位输入。 C3 S3 C2 S2 C1 S1 C0 S0C0-1A3 B3 A2 B2 A1 B1 A0 B0COCOCOCOCICICICI:进位信号是由低位向高位逐级传递的,进位产生时间较长,且各加法器的和产生时间也不同,速度不高。2、并行进位加法器(超前进位加法器)、并行进位加法器(超前进位加法器) iiiBAG iiiBAP进位生成项进位生成项进位传递条件进位传递条件11)(iiiiiiiiiCPGCBABAC进位表达式进位表达式10012301231232332333

3、23310012012122122212210010110111011100001000CPPPPGPPPGPPGPGCPGCCPSCPPPGPPGPGCPGCCPSCPPGPGCPGCCPSCPGCCPS11iiiiiiCPCBAS和表达式和表达式4位超前进位加位超前进位加法器递推公式法器递推公式超前进位4位加法器超前进位十六位加法器 加法器代码module add_4( X, Y, sum, C);input 3 : 0 X, Y;output 3: 0 sum;output C;assign C, Sum = X + Y;endmodulemodule add_4( X, Y, sum,

4、 C);input 3 : 0 X, Y;output 3: 0 sum;output C;assign C, Sum = X + Y;endmodulemodule add_16( X, Y, sum, C);input 15 : 0 X, Y;output 15 : 0 sum;output C;assign C, Sum = X + Y;endmodule4 4位超前进位加法器位超前进位加法器module fulladd4 ( a, b, ci, s, co); input3:0 a; input3:0 b; input ci; output3:0 s; output co; wire3

5、:0 p; wire3:0 g; wire2:0 c; wire mg,mp; assign p0 = a0 b0; assign p1 = a1 b1; assign p2 = a2 b2; assign p3 = a3 b3; assign g0 = a0 & b0; assign g1 = a1 & b1; assign g2 = a2 & b2; assign g3 = a3 & b3; assign c0 = (p0 & ci) | g0; assign c1 = (p1 & c0) | g1; assign c2 = (p2 & c1) | g2; assign pp = p3 &

6、 p2 & p1 & p0; assign gg = g3 | (p3 & (g2 | p2 & (g1 | p1 & g0); assign co = (pp & ci) |gg; assign s0 = p0 ci; assign s1 = p1 c0; assign s2 = p2 c1; assign s3 = p3 c2; endmodule 信号解释p表示进位否决信号(pass),如果p为0就否决调前一级的进位输入。否决的意思就是即使前一级有进位,本级也不会向后一级产生进位输出。g表示进位产生信号(generate),如果g为1就表示一定会向后一级产生进位输出 pn = an bn

7、当a=1,b=0或a=0,b=1时前一级的进位输入信号不能否决。gn = an & bn如果a=1,b=1时就直接向后一级产生进位输出信号,而不用考虑其它的任何因素。pp表示本级模块的进位否决信号,如果pp为0就否决调前一级模块的进位输入。gg表示本级模块进位产生信号,如果gg为1就表示一定会向后一级模块产生进位输出。 这两个信号pp和gg都是用于超前进位模块之间的连接,如4个4位超前进位加法器模块再使用超前进位逻辑进行连接构成16位超前进位加法器。pp = p3 & p2 & p1 & p0当a+b=1111时,此时前一级模块的进位输入不能被否决。gg = g3|(p3&(g2|p2&(g1

8、|p1 & g0)这一句可以这样理解,它是嵌套了几层的:1. 如果g3=1,即最高位要产生进位位,则表示本模块一定会向后一级模块产生进位输出,于是gg=1。2. 如果g3=0,但是p3=1(表示不能否决掉前一级的进位),而且前一级又有进位输入时,gg=1。3. 以下层次的关系依此类推。总结 1. 用于模块内部的p和g信号,它们的产生都不依赖于模块内部各位之间的进位信号,而是由输入信号a和b直接得到的。2. 用于模块外部的pp和gg信号,它们的产生也不依赖于该模块的进位输入信号,pp和gg信号用于超前进位链的再次级联3. 当进位产生信号(g或gg)为1时,一定向后一级产生进位输出,此时不需要等待

9、前一级进位信号的输入,速度得以加快。4. 当进位产生信号(g或gg)为0时,向不向后一级产生进位输出就不好说了。我们能肯定的是如果此时进位否决信号(p或pp)为0,则一定不会向后一级产生进位输出,这种情况也不需要等待前一级进位信号的输入,速度还是得以加快。5. 如果进位产生信号(g或gg)为0,并且进位否决信号(p或pp)为1,向不向后一级产生进位输出就完全取决于前一级进位信号的输入了,这时花的时间最长。乘法器乘法器 设两个n位二进制正数X和Y: X : X n-1X1 X0 Y : Y n-1Y1 Y0 则X和Y的乘积Z有2n位:并且式中YiX称为部分积,记为P i,有显然,两个一位二进制数

10、相乘遵循如下规则: 00=0; 01=0; 10=0; 11=1因此YiXj 可用一个与与门实现,记Pi.j = Yi X j例:两个四位二进制数X和Y相乘 被乘数被乘数: X3 X2 X1 X0 ) 乘乘 数数: Y3 Y2 Y1 Y0 _ Y0X3 Y0X2 Y0X1 Y0X0 Y1X3 Y1X2 Y1X1 Y1X0 Y2X3 Y2X2 Y2X1 Y2X0 Y3X3 Y3X2 Y3X1 Y3X0 _ 乘积:乘积:Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0逐位进位并行乘法器M UM UM UM UM UM UM UM UM UM UM UM UM UM UM UM U0 Y3 X0 Y3

11、 X1 Y3 X2 Y3 X3 Y2 X0 Y2 X1 Y2 X2 Y2 X3 Y1 X0 Y1 X1 Y1 X2 Y1 X3 Y0 X3 0 Y0 X2 0 Y0 X1 0 Y0 X0 0 000Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0乘法单元(MU) 进位节省乘法器 乘法器代码module mult_4( X, Y, Product);input 3 : 0 X, Y;output 7 : 0 Product;assign Product = X * Y;endmodulemodule mult_4( X, Y, Product);input 3 : 0 X, Y;output 7

12、: 0 Product;assign Product = X * Y;endmodulemodule mult_8( X, Y, Product);input 7 : 0 X, Y;output 15 : 0 Product;assign Product = X * Y;endmodule移位累加乘法器module mult8(result,opa,opb);parameter SIZE=8,LONGSIZE=16;input SIZE:1 opa,opb;output LONGSIZE:1 result;regLONGSIZE:1 result;always (opa or opb)begi

13、n: multreg LONGSIZE:1 shift_opa,shift_opb; /局部变量定义局部变量定义shift_opa=opa;shift_opb=opb;result=0;repeat(SIZE) /repeat循环语句循环语句begin /循环体语句块循环体语句块if(shift_opb1) result=result+shift_opa;shift_opa=shift_opa1;end /循环体语句块结束标志循环体语句块结束标志endendmodule比较器真值表 逻辑表达式比较器代码module compare_n ( X, Y, XGY, XSY, XEY);input

14、width-1:0 X, Y;output XGY, XSY, XEY;reg XGY, XSY, XEY;parameter width = 8;always ( X or Y ) / 每当每当X 或或Y 变化时变化时 begin if ( X = = Y ) XEY = 1; / 设置设置X 等于等于Y的信号为的信号为1 else XEY = 0; if (X Y) XGY = 1; / 设置设置X 大于大于Y的信号为的信号为1 else XGY = 0; if (X Y) XSY = 1; / 设置设置X 小于小于Y的信号为的信号为1 else XSY = 0; endendmodule

15、多路器多路选择器(Multiplexer)(Multiplexer)简称多路器,它是一个多输入、单输出的组合逻辑电路,在数字系统中有着广泛的应用。它可以根据地址码的不同,从多个输入数据中选取一个,让其输出到公共的输出端。在算法电路的实现中多路器常用来根据地址码来调度数据。我们可以很容易地写出一个有两位地址码,可以从四组输入信号线中选出一组通过公共输出端输出的功能表。4选1选择器真值表选择器代码module Mux_8( addr,in1, in2, in3, in4, in5, in6, in7, in8, Mout, nCS);input 2:0 addr;input width-1 in1

16、, in2, in3, in4, in5, in6, in7, in8;output width-1 Mout;parameter width = 8;always (addr or in1 or in2 or in3 or in4 or in5 or in6 or in7 or in8) begin if (!ncs) case(addr) 3b000: Mout = in1; 3b001: Mout = in2; 3b010: Mout = in3; 3b011: Mout = in4; 3b100: Mout = in5; 3b101: Mout = in6; 3b110: Mout =

17、 in7; 3b111: Mout = in8; endcase else Mout = 0; end endmodule总线和总线操作总线和总线操作 module SampleOfBus( DataBus, link_bus,write );inout 11:0 DataBus; / 总线双向端口input link_bus; / 向总线输出数据的控制电平reg 11:0 outsigs;assign DataBus = (link_bus) ? outsigs : 12 h zzz ; /当link_bus为高电平时通过总线把存在outsigs的计算结果输出always (posedge

18、write) /每当write信号上跳沿时 begin /接收总线上数据并乘以五 outsigs = DataBus * 5; /把计算结果存入outsigs endendmodule流水线流水线 流水线(pipe-line)设计技术 流水线的设计方法已经在高性能的、需要经常进行大规模运算的系统中得到广泛的应用,如CPU(中央处理器)、DSP等。通过加法器和乘法器等一些基本模块,本节讨论了有关流水线的一些基本概念流水线设计的概念所谓流水线设计实际上就是把规模较大、层次较多的组合逻辑电路分为几个级,在每一级插入寄存器组暂存中间数据。K级的流水线就是从组合逻辑的输入到输出恰好有K个寄存器组(分为K

19、级,每一级都有一个寄存器组)上一级的输出是下一级的输入而又无反馈的电路。首次延迟:就是将(从输入到输出)最长的路径进行初始化所需要的时间总量被称为采用流水线设计的首次延迟(latency)吞吐延迟:则是执行一次重复性操作所需要的时间总量常用流水线设计时序图组合逻辑设计转化为流水线设计 为了通过这个组合逻辑得到稳定的计算结果输出,需要等待的传播延迟为:(max(T1,T3)+T2)采用流水线设计为取得稳定的输出总体计算周期为: max(max(T1,T3)+Tco,(T2+Tco)流水线设计的优势假设T1、T2和T3具有同样的传递延迟Tpd。组合逻辑设计:首次延迟为2*Tpd 吞吐延迟为2*Tp

20、d流水线设计:首次延迟为2*(Tpd+Tco) 吞吐延迟为Tpd+Tcon位全加器的方程式n 位纯组合逻辑全加器一个n位全加器的例子,如图所示为实现该加法功能需要三级电路:(1)加法器输入的数据产生器和传送器;(2)数据产生器和传送器的超前进位部分;(3)数据产生、传送功能和超前进位三者求和部分 n位流水线全加器 流水线加法器与组合逻辑加法器流水线加法器与组合逻辑加法器的比较的比较 采用流水线技术可以在相同的半导体工艺的前提下通过电路结构的改进来大幅度地提高重复多次使用的复杂组合逻辑计算电路的吞吐量非流水线4位(4bit)加法器module pipeline_add(a,b,cin,cout,

21、sum,clk);input3:0 a,b;input clk,cin;output reg 3:0sum;output reg cout;always(posedge clk)cout,sum=a+b+cin;endmodule流水线4位(4bit)加法器module pipeline_add(a,b,cin,cout,sum,clk);input3:0 a,b;input clk,cin;output3:0sum;output cout;reg3:0 tempa,tempb;reg tempci;reg cout;reg firstco;reg1:0 firstsum;reg2:0 fir

22、sta,firstb; /空出空出fista2、firstn2放进位放进位reg3:0 sum;always(posedge clk) begin tempa=a; /输入数据缓存输入数据缓存 tempb=b; tempci=cin; endalways(posedge clk) begin firstco,firstsum=tempa1:0+tempb1:0+tempci; /第一级加(低第一级加(低2位)位) firsta=tempa3:2; /未参加计算的数据缓存未参加计算的数据缓存 firstb=tempb3:2; endalways(posedge clk) begin cout,s

23、um=firsta2:0+firstb2:0+firstco,firstsum; /第二级加(高第二级加(高2位)位) endendmoduleRTL视图+A2.0B2.0ADDER+A2.0B2.0ADDER+A2.0B2.0ADDER+A2.0B2.0ADDERDENAQPRECLRDQPREENACLRDQPREENACLRDENAQPRECLRDQPREENACLRDQPREENACLRDQPREENACLRDQPREENACLRDENAQPRECLRAdd01 h0 -1 h0 -Add2Add32 h0 -coutreg0firsta2.01 h0 -firstb2.01 h0 -

24、firstcofirstsum1.0tempa3.0tempb3.0tempcicincoutclka3.0b3.0sum3.0sum3.0reg0Add12 h0 -顶层测试模块代码timescale 1ns/1psmodule pipeline_add_test; reg 3:0 a = 4b0000; reg 3:0 b = 4b0000; reg cin = 1b0; wire cout; wire 3:0 sum; reg clk = 1b0; parameter PERIOD = 200; parameter real DUTY_CYCLE = 0.5; parameter OFF

25、SET = 100;initial / Clock process for clk begin #OFFSET; forever begin clk = 1b0; #(PERIOD-(PERIOD*DUTY_CYCLE) clk = 1b1; #(PERIOD*DUTY_CYCLE); end end pipeline_add UUT ( .a(a), .b(b), .cin(cin), .cout(cout), .sum(sum), .clk(clk);initial begin / - Current Time: 100ns #100; cin = 1b1; / - / - Current

26、 Time: 185ns #85; a = 4b0010; b = 4b0011; / - / - Current Time: 385ns #200; a = 4b0100; b = 4b0010; / - / - Current Time: 585ns #200; cin = 1b0; a = 4b1010; b = 4b0011;/ - / - Current Time: 785ns #200; a = 4b1011; b = 4b1010; / - / - Current Time: 985ns #200; a = 4b1111; b = 4b1110; / - / - Current

27、Time: 1185ns #200; a = 4b1101; b = 4b0100;/ - / - Current Time: 1585ns #400; a = 4b0011; / - / - Current Time: 1785ns #200; b = 4b1101; / - / - Current Time: 1985ns #200; cin = 1b1; a = 4b0101; b = 4b1111; / - / - Current Time: 2385ns #400; a = 4b0100; b = 4b1101; / - endendmodule4位组合逻辑乘法器与4位流水线乘法器的

28、比较 并行乘法器4位的流水线乘法器 module mul_addtree(mul_a, mul_b, mul_out, clk, rst_n); parameter MUL_WIDTH = 4; parameter MUL_RESULT = 8; input MUL_WIDTH-1 : 0 mul_a; input MUL_WIDTH-1 : 0 mul_b; input clk; input rst_n; output MUL_RESULT-1 : 0 mul_out; reg MUL_RESULT-1 : 0 mul_out; reg MUL_RESULT-1 : 0 stored0; r

29、eg MUL_RESULT-1 : 0 stored1; reg MUL_RESULT-1 : 0 stored2; reg MUL_RESULT-1 : 0 stored3; reg MUL_RESULT-1 : 0 add01; reg MUL_RESULT-1 : 0 add23; always (posedge clk or negedge rst_n) RTL视图+A7.0B7.0ADDER+A7.0B7.0ADDERDQPREENACLR+A7.0B7.0ADDERDQPREENACLRDQPREENACLRDQPREENACLRDQPREENACLRDQPREENACLRDQPR

30、EENACLRSELDATAADATABOUT0MUX21SELDATAADATABOUT0MUX21SELDATAADATABOUT0MUX21SELDATAADATABOUT0MUX21Add1Add2mul_out7.0reg0stored27.02 h0 -2 h0 -stored37.01 h0 -3 h0 -stored03.04 h0 -clkrst_nmul_a3.0mul_out7.0stored07.04 h0 -stored23.04 h0 -stored33.04 h0 -add017.0add237.0Add0stored17.03 h0 -1 h0 -stored1

31、3.04 h0 -mul_b3.0 begin if(!rst_n) begin /初始化寄存器变量初始化寄存器变量 mul_out = 8b0000_0000; stored0 = 8b0000_0000; stored1 = 8b0000_0000; stored2 = 8b0000_0000; stored3 = 8b0000_0000; add01 = 8b0000_0000; add23 = 8b0000_0000; end else begin /实现移位相加实现移位相加 stored3 = mul_b3?1b0,mul_a,3b0: 8b0; stored2 = mul_b2?2

32、b0,mul_a,2b0: 8b0; stored1 = mul_b1?3b0,mul_a,1b0: 8b0; stored0 = mul_b0?4b0,mul_a: 8b0; add01 = stored1 + stored0; add23 = stored3 + stored2; mul_out = add01 + add23; end end endmodule 一般的快速乘法器通常采用逐位并行的迭代阵列结构,将每个操作数的N位都并行地提交给乘法器。但是一般对于FPGA来讲,进位的速度快于加法的速度,这种阵列结构并不是最优的。所以可以采用多级流水线的形式,将相邻的两个部分乘积结果再加到最

33、终的输出乘积上,即排成一个二叉树形式的结构,这样对于N位乘法器需要log2(N)级来实现。一个8位乘法器,如图所示 6*10流水线乘法器 例简单流水线处理器module mark1Pipe ;reg 15 :0 m0 :8191 ; / 8192 x 16 位存储器reg 12 :0 pc ; / 13 位程序计数器reg 15 :0 acc ; / 15 位累加器reg 15 :0 ir ; / 1 6 位指令寄存器reg ck ; / 时 钟信号always ( posedge ck) beginir = m pc ;pc = pc + 1;endalways ( posedge ck)c

34、ase ( ir 15 :13 )3b000 : pc = m i r12:0 ;3b001 : pc = pc + m ir 12 :0 ;3b010 : acc = - m ir 12 :0 ;3b011 : m ir 12 :0 = acc ;3b100 ,3b101 : acc = acc - m ir 12 :0 ;3b110 : if ( acc 0 ) pc = pc + 1 ;endcaseendmodule但是, 无阻塞赋值语句并不能解决同步中的所有问题。请注意运行某些指令时, pc被装入到两个always 块中指令0 就是这种情况。需要考虑的问题是, pc 中的哪个更新会首

35、先出现: 是第一个always 块中的更新, 还是第二个? 当然, 更新的顺序是不明确的, 所以我们需要更改这个描述来获得正确的操作。我们用周期精确的表示方法给出了处理器的模型。这种设计处理器的模型在抽象层次上允许设计者掌握在每个时钟周期中会出现什么功能, 该功能在处理器流水线的其他级( stage )怎样受并发行为的影响, 并且至少可以根据时钟周期来判断机器性能。这个示例由两个always 块构成, 每个always 块构成这个简单处理器的一级。第一个alway s 块构成处理器的第一级, 用来取指令。第二个always 块构成处理器的第二级,用来执行指令。因为每一级处理器由一个always

36、 块描述, 所以我们在处理器的流水线之间建立起并发关系。设计中使用无阻塞赋值语句将状态的更新同步到时钟边沿ck 上。使用无阻塞赋值语句时, 请记住整个设计中( 此处指两个alway s 块)所有赋值语句的右边要在左边被更新以前求值, 这一点是很重要的。在本例中, 请注意指令寄存器( ir ) 在第一个always 块中加载, 而在第二个always 块中存取。因为所有的存取都是由无阻塞赋值语句来实现的, 所以我们知道用来加载指令寄存器的指令的存取不会和第二个always 块中指令的执行相互干扰第二个always 块的右边在ir 被第一个always 块更新以前要被求值流水线之间的同步modul

37、e ma rk1PipeStage ;r eg 15: 0 m 0 :8191 ; / 8192 x 16 bit memoryr eg 12: 0 pc , pctemp; / 13 bit program counter and tempor aryr eg 12: 0 acc ; / 13 bit accumulatorr eg 15: 0 ir ; / 16 bit instruction registerr eg ck , skip ;always ( posedge ck ) begin / fetch processif ( skip )pc = pctemp;ir = m pc ;pc = pc + 1;endalways ( posedge ck ) begin / execute processif ( skip)skip = 0 ;elsecase ( ir 15 :13 )3b000 : be

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论