西安邮电学院计算机系VerilogHDL模块设计实例1.组合逻辑电路设计实例:[例1]八位带进位端的加法器的设计实例(利用简单的算法描述)moduleadder_8(cout,sum,a,b,cin);outputcout;output[7:0]sum;inputcin;input[7:0]a,b;assign{cout,sum}=a+b+cin;endmodule[例2]指令译码电路的设计实例(利用电平敏感的always块来设计组合逻辑)//操作码的宏定义`defineplus3'd0`defineminus3'd1`defineband3'd2`definebor3'd3`defineunegate3'd4modulealu(out,opcode,a,b);output[7:0]out;input[2:0]opcode;input[7:0]a,b;reg[7:0]out;always@(opcodeoraorb)//用电平敏感的always块描述//组合逻辑begincase(opcode)//算术运算`plus:out=a+b;`minus:out=a-b;//位运算`band:out=a&b;`bor:out=a|b;//单目运算`unegate:out=~a;default:out=8'hx;endcaseendendmodule[例3].利用task和电平敏感的always块设计比较后重组信号的组合逻辑.modulesort4(ra,rb,rc,rd,a,b,c,d);parametert=3;output[t:0]ra,rb,rc,rd;input[t:0]a,b,c,d;reg[t:0]ra,rb,rc,rd;always@(aorborcord)//用电平敏感的always块描述组合逻辑beginreg[t:0]va,vb,vc,vd;{va,vb,vc,vd}={a,b,c,d};sort2(va,vc);sort2(vb,vd);sort2(va,vb);sort2(vc,vd);sort2(vb,vc);{ra,rb,rc,rd}={va,vb,vc,vd};endtasksort2;inout[t:0]x,y;reg[t:0]tmp;if(xy)begintmp=x;x=y;y=tmp;endendtaskendmodule[例4].比较器的设计实例(利用赋值语句设计组合逻辑)modulecompare(equal,a,b);parametersize=1;outputequal;input[size-1:0]a,b;assignequal=(a==b)?1:0;endmodule[例5].3-8译码器设计实例(利用赋值语句设计组合逻辑)moduledecoder(out,in);output[7:0]out;input[2:0]in;assignout=1‘b1in;/****把最低位的1左移in(根据从in口输入的值)位,并赋予out****/endmodule[例6].8-3编码器的设计实例编码器设计方案之一:moduleencoder1(out,in);output[2:0]out;input[7:0]in;reg[2:0]out;always@(in)begin:localintegeri;out=0;/*returnsthevalueofthehighestbitnumberturnedon*/for(i=0;i8;i=i+1)beginif(in[i])beginout=i;endendendendmodule编码器设计方案之二:moduleencoder2(none_on,out2,out1,out0,h,g,f,e,d,c,b,a);inputh,g,f,e,d,c,b,a;outputnone_on,out2,out1,out0;wire[3:0]outvec;assignoutvec=h?4'b0111:g?4'b0110:f?4'b0101:e?4'b0100:d?4'b0011:c?4'b0010:b?4'b0001:a?4'b0000:4'b1000;assignnone_on=outvec[3];assignout2=outvec[2];assignout1=outvec[1];assignout0=outvec[0];endmodule编码器设计方案之三:moduleencoder3(none_on,out2,out1,out0,h,g,f,e,d,c,b,a);inputh,g,f,e,d,c,b,a;outputout2,out1,out0;outputnone_on;reg[3:0]outvec;assign{none_on,out2,out1,out0}=outvec;always@(aorborcordoreorforgorh)beginif(h)outvec=4'b0111;elseif(g)outvec=4'b0110;elseif(f)outvec=4'b0101;elseif(e)outvec=4'b0100;elseif(d)outvec=4'b0011;elseif(c)outvec=4'b0010;elseif(b)outvec=4'b0001;elseif(a)outvec=4'b0000;elseoutvec=4'b1000;endendmodule[例7].多路器的设计实例。使用连续赋值、case语句或if-else语句可以生成多路器电路,如果条件语句(case或if-else)中分支条件是互斥的话,综合器能自动地生成并行的多路器。多路器设计方案之一:modulemux1(out,a,b,sel);outputout;inputa,b,sel;assignout=sel?a:b;endmodule多路器设计方案之二:modulemux2(out,a,b,sel);outputout;inputa,b,sel;regout;//用电平触发的always块来设计多路器的组合逻辑always@(aorborsel)begin/*检查输入信号sel的值,如为1,输出out为a,如为0,输出out为b.*/case(sel)1'b1:out=a;1'b0:out=b;default:out='bx;endcaseendendmodule多路器设计方案之三:modulemux3(out,a,b,sel);outputout;inputa,b,sel;regout;always@(aorborsel)beginif(sel)out=a;elseout=b;endendmodule[例8].奇偶校验位生成器设计实例Moduleparity(even_numbits,odd_numbits,input_bus);outputeven_numbits,odd_numbits;input[7:0]input_bus;assignodd_numbits=^input_bus;assigneven_numbits=^~input_bus;endmodule[例9].输出驱动器设计实例三态输出驱动器设计方案之一:moduletrist1(out,in,enable);outputout;inputin,enable;assignout=enable?in:'bz;endmodule三态输出驱动器设计方案之二:moduletrist2(out,in,enable);outputout;inputin,enable;//bufif1是一个Verilog门级原语(primitive)bufif1mybuf1(out,in,enable);endmodule2.时序逻辑电路设计实例[例1]触发器设计实例moduledff(q,data,clk);outputq;inputdata,clk;regq;always@(posedgeclk)beginq=data;endendmodule[例2].电平敏感型锁存器设计实例modulelatch3(q,data,clk);outputq;inputdata,clk;regq;always@(clkordata)beginif(clk)q=data;endendmodule[例3].移位寄存器设计实例moduleshifter(din,clk,clr,dout);inputdin,clk,clr;output[7:0]dout;reg[7:0]dout;always@(posedgeclk)beginif(clr)dout=8'b0;//清零elsebegindout=dout1;//左移一位dout[0]=din;end//把输入信号放入寄存器的最低位endendmodule[例4].八位计数器设计实例之一modulecounter1(out,data,load,clk);output[7:0]out;input[7:0]data;inputload,clk;reg[7:0]out;always@(posedgeclk)beginif(load)out=data;elseout=out+1;end//只有当out[7:0]的所有各位都为1endmodule[例5].八位计数器设计实例之二modulecounter2(out,cout,data,load,clk);output[7:0]out;outputcout;input[7:0]data;inputload,clk;reg[7:0]out;regcout;reg[7:0]preout;//创建8位寄存器always@(posedgeclk)beginout=preout;end/****计算计数器和进位的下一个状态,注意:为提高性能不希望加载影响进位****/always@(outordataorload)begin{cout,preout}=out+1;if(load)preout=data;endendmodule存储建模目标学会如何用Verilog对存储器建模。学会如何用Verilog中对双向(即输入/输出)端口,(inout)建模。存储器建模必须注意以下两个方面的问题:声明存储器容量的大小。明确对存储器访问操作的权限。例如:指出可以对存储器做以下哪几种操作:1)只读2)读写3)同步读写4)多次读,同时进行一次写5)多次同步读写,同时提供一些方法保证一致性存储器建模`timescale1ns/10psmodulemyrom(read_data,addr,read_en_);inputread_en_;input[3:0]addr;output[3:0]read_data;reg[3:0]read_data;reg[3:0]mem[0:15];initial$readmemb(“my_rom_data”,mem);always@(addrorread_en_)if(!read_en_)read_data=mem[addr];endmodule简单ROM建模my_rom_data0000010111000011110100100011111110001001100000011101101000011101ROM的数据存储在另外的一个独立的文件中简单ROM建模上页所示的ROM模型说明:如何在Verilog中用二维的寄存器组来定义存储器。ROM中的数据保存在一个独立的文件中,如上页的右边的虚线方框所示。这是一种保存ROM数据的通用的方法,它可以使数据和ROM模型分开。简单RAM建模`timescale1ns/1nsmodulemymem(data,addr,read,write);inout[3:0]data;input[3:0]addr;inputread,write;reg[3:0]memory[0:15];//4bits,16words//从存储器读出到总线上assigndata=read?memory[addr]:4’bz