您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Verilog-HDL高级程序设计举例
第六章VerilogHDL高级程序设计举例5/7/20201MicroelectronicsSchoolXidianUniversity6.1数字电路系统设计的层次化描述方法Bottom-Up:5/7/20202MicroelectronicsSchoolXidianUniversity顶层模块子模块1子模块2子模块3子模块4叶子模块叶子模块叶子模块叶子模块叶子模块叶子模块叶子模块叶子模块串行加法器:一个四位串行加法器由4个全加器构成。全加器是串行加法器的子模块,而全加器是由基本的逻辑门构成,这些基本的逻辑门就是所说的叶子模块。这个设计中运用叶子模块(基本逻辑门)搭建成子模块(全加器),再用子模块搭建成所需要的电路(串行加法器)。显然,Bottom-Up的设计方法没有明显的规律可循,主要依靠设计者的实践经验和熟练的设计技巧,用逐步试探的方法最后设计出一个完整的数字系统。系统的各项性能指标只有在系统构成后才能分析测试。此种设计方法常用于原理图的设计中,相比于其它方法此种方法对于实现各个子模块电路所需的时间较短。5/7/20203MicroelectronicsSchoolXidianUniversityA0A1A2A3B0B1B2B3AC_OUTC_INC_INC_INC_INC_INC_OUTC_OUTC_OUT∑∑∑∑C_OUTAAABBBBS0S1S2S3SUMSUMSUMSUMABC_INSUMC_OUT=1=1&&&Top-Down:5/7/20204MicroelectronicsSchoolXidianUniversity顶层模块子模块1子模块2子模块3子模块4叶子模块叶子模块叶子模块叶子模块叶子模块叶子模块叶子模块叶子模块使用Top-Down设计方法对一个典型cpu进行设计:5/7/20205MicroelectronicsSchoolXidianUniversityCPU控制单元逻辑运算单元存储单元控制单元指令控制器时序控制器总线控制器中断控制器逻辑运算单元算术逻辑运算单元ALU浮点运算单元FPU存储算单元通用寄存器专用寄存器指令控制器QQSETCLRSRENB向量点积乘法器:采用模块层次化设计方法,设计4维向量点积乘法器,其中向量a=(a1,a2,a3,a4);b=(b1,b2,b3,b4)。点积乘法规则为:5/7/20206MicroelectronicsSchoolXidianUniversity11223344++abababababa1b1a2b2a3b3a4b4+++out乘法器加法器全加器半加器全加器半加器基本门电路基本门电路向量点积乘法器5/7/20207MicroelectronicsSchoolXidianUniversityVerilogHDL程序代码为:modulevector(a1,a2,a3,a4,b1,b2,b3,b4,out);input[3:0]a1,a2,a3,a4,b1,b2,b3,b4;output[9:0]out;wire[7:0]out1,out2,out3,out4;wire[8:0]out5,out6;wire[9:0]out;mul_addtreeU1(.x(a1),.y(b1),.out(out1));mul_addtreeU2(.x(a2),.y(b2),.out(out2));mul_addtreeU3(.x(a3),.y(b3),.out(out3));mul_addtreeU4(.x(a4),.y(b4),.out(out4));add#(8)U5(.a(out1),.b(out2),.out(out5));add#(8)U6(.a(out3),.b(out4),.out(out6));add#(9)U7(.a(out5),.b(out6),.out(out));endmodule//addermoduleadd(a,b,out);parametersize=8;input[size-1:0]a,b;output[size:0]out;assignout=a+b;endmodule//Multipliermodulemul_addtree(mul_a,mul_b,mul_out);input[3:0]mul_a,mul_b;//IOdeclarationoutput[7:0]mul_out;wire[3:0]mul_out;//Wiredeclarationwire[3:0]stored0,stored1,stored2,stored3;wire[3:0]add01,add23;assignstored3=mul_b[3]?{1'b0,mul_a,3'b0}:8'b0;//Logicdesignassignstored2=mul_b[2]?{2'b0,mul_a,2'b0}:8'b0;assignstored1=mul_b[1]?{3'b0,mul_a,1'b0}:8'b0;assignstored0=mul_b[0]?{4'b0,mul_a}:8'b0;assignadd01=stored1+stored0;assignadd23=stored3+stored2;assignmul_out=add01+add23;endmodule6.2典型电路设计•6.2.1加法器树乘法器加法器树乘法器的设计思想是“移位后加”,并且加法运算采用加法器树的形式。乘法运算的过程是,被乘数与乘数的每一位相乘并且乘以相应的权值,最后将所得的结果相加,便得到了最终的乘法结果。例:下图是一个4位的乘法器结构,用VerilogHDL设计一个加法器树4位乘法器5/7/20208MicroelectronicsSchoolXidianUniversity8x*y[3]4x*y[2]2x*y[1]X*y[0]P[7:0]5/7/20209MicroelectronicsSchoolXidianUniversitymodulemul_addtree(mul_a,mul_b,mul_out);input[3:0]mul_a,mul_b;//IOdeclarationoutput[7:0]mul_out;wire[7:0]mul_out;//Wiredeclarationwire[7:0]stored0,stored1,stored2,stored3;wire[7:0]add01,add23;assignstored3=mul_b[3]?{1'b0,mul_a,3'b0}:8'b0;//Logicdesignassignstored2=mul_b[2]?{2'b0,mul_a,2'b0}:8'b0;assignstored1=mul_b[1]?{3'b0,mul_a,1'b0}:8'b0;assignstored0=mul_b[0]?{4'b0,mul_a}:8'b0;assignadd01=stored1+stored0;assignadd23=stored3+stored2;assignmul_out=add01+add23;endmodulemodulemult_addtree_tb;reg[3:0]mult_a;reg[3:0]mult_b;wire[7:0]mult_out;//moduleinstancemul_addtreeU1(.mul_a(mult_a),.mul_b(mult_b),.mul_out(mult_out));initial//Stimulisignalbeginmult_a=0;mult_b=0;repeat(9)begin#20mult_a=mult_a+1;mult_b=mult_b+1;endendendmodule流水线结构例:下图是一个4位的乘法器结构,用VerilogHDL设计一个两级流水线加法器树4位乘法器。两级流水线加法器树4位乘法器结构如图所示,通过在第一级与第二级、第二级与第三级加法器之间插入D触发器组,可以实现两级流水线设计。5/7/202010MicroelectronicsSchoolXidianUniversity8x*y[3]4x*y[2]2x*y[1]X*y[0]P[7:0]DDD5/7/202011MicroelectronicsSchoolXidianUniversitymodulemul_addtree_2_stage(clk,clr,mul_a,mul_b,mul_out);inputclk,clr;input[3:0]mul_a,mul_b;//IOdeclarationoutput[7:0]mul_out;reg[7:0]add_tmp_1,add_tmp_2,mul_out;wire[7:0]stored0,stored1,stored2,stored3;assignstored3=mul_b[3]?{1'b0,mul_a,3'b0}:8'b0;//Logicdesignassignstored2=mul_b[2]?{2'b0,mul_a,2'b0}:8'b0;assignstored1=mul_b[1]?{3'b0,mul_a,1'b0}:8'b0;assignstored0=mul_b[0]?{4'b0,mul_a}:8'b0;always@(posedgeclkornegedgeclr)//Timingcontrolbeginif(!clr)beginadd_tmp_1=8'b0000_0000;add_tmp_2=8'b0000_0000;mul_out=8'b0000_0000;endelsebeginadd_tmp_1=stored3+stored2;add_tmp_2=stored1+stored0;mul_out=add_tmp_1+add_tmp_2;endendendmodule5/7/202012MicroelectronicsSchoolXidianUniversitymodulemult_addtree_2_stag_tb;regclk,clr;reg[3:0]mult_a,mult_b;wire[7:0]mult_out;mul_addtree_2_stageU1(.mul_a(mult_a),.mul_b(mult_b),.mul_out(mult_out),.clk(clk),.clr(clr));initialbeginclk=0;clr=0;mult_a=1;mult_b=1;#5clr=1;endalways#10clk=~clk;initialbeginrepeat(5)begin#20mult_a=mult_a+1;mult_b=mult_b+1;endendendmodule6.2.2Wallace树乘法器Wallace树乘法器运算原理如下图所示,其中FA为全加器HA为半加器。其基本原理是,加法从数据最密集的地方开始,不断地反复使用全加器半加器来覆盖“树”。这一级全加器是一个3输入2输出的器件,因此全加器又称为3-2压缩器。通过全加器将树的深度不断缩减,最终缩减为一个深度为2的树。最后一级则采用一个简单的两输入加法器组成。5/7/202013MicroelectronicsSchoolXidianUniversity6543210部分积6543210第1级6543210第2级FAHA6543210最终的加法器5/7/202014MicroelectronicsSchoolXidianUniversity部分积第1级第2级HAHAFAFAFAHAadd_aadd_bc3[1]c2[1]c1[1]c0[1]a3a1a15c3[0]c2[0]c1[0]c0[0]a2a0a4a5a6a7a8a9a10a11a12a13a14b0[0]b0[1]b1[0]b1[1]x[0]y[0]x[0]y[1]x[1]y[0]x[2]y[0]x[0]y[2]x[1]y[1]x[2]y[1]x[3]y[0]x[1]y[3]x[2]y[2]x[3]y[1]x[
本文标题:Verilog-HDL高级程序设计举例
链接地址:https://www.777doc.com/doc-5254182 .html