您好,欢迎访问三七文档
第四部分VerilogHDL语言(第四、五、六、七章)一、初识VerilogHDL三、VerilogHDL行为语句主要内容:二、VerilogHDL基础四、VerilogHDL设计风格五、常见组合与时序逻辑电路VerilogHDL描述常用组合电路模块的设计常用时序电路模块的设计常见组合与时序逻辑电路VerilogHDL描述用VerilogHDL描述电路模块小结一、用VerilogHDL描述电路模块小结模块中最重要的部分是逻辑功能定义部分。有3种方法可在模块中产生逻辑功能:(1)用实例元件:内置门元件、开关元件、自行设计生成的元件。(结构描述)如:and#2ul(q,a,b)端口信号名称可以采用位置关联方法和名称关联方法进行连接。(2)用“assign”声明语句连续赋值。(数据流描述)采用“assign”语句是描述组合逻辑电路最常用的方法之一。(3)用“always”或“initial”过程块。(行为描述)使用initial和always的区别“always”块既可用于描述组合逻辑,也可描述时序逻辑。always语句是不断地重复活动的,直到仿真过程结束。但always语句后的过程块是否运行,则要看它的触发条件是否满足,如满足则运行过程块一次,再次满足则再运行一次,直至仿真过程结束。“initial”块一般用于变量初始化及仿真波形产生。Initial语句只执行一次。一个模块中这三种表达方式是并发执行的,有多个实例元件、“assign”声明语句、“always”块也是并发执行的。但“always”块内是顺序执行的。在一个模块中,使用initial和always语句的次数是不受限制的,它们都是同时开始运行的。行为描述“always”或“initial”过程块构成了行为级建模的基础,即所有行为级语句只能出现在这两种块之中。只有实例元件和“assign”连续赋值语句可以独立在块外。行为级描述时如果分支条件比较少,且有先后顺序,选择if-else语句;如果条件分支比较多,使用case(casez、casex)语句更加方便。循环语句有4种(for、repeat、while、forever),建议首选for语句。二、常用组合电路模块的设计组合逻辑电路在数字系统中起着基本组件的作用。组合逻辑电路包括:门电路、双向三态门、加法器、多路选择器、比较器、乘法器、总线等。(一)简单组合电路的描述1、基本门电路的描述(2)用assign连续赋值语句描述modulegate1(F,A,B,C,D);inputA,B,C,D;outputF;assignF=(~(A&B))|(B&C&D);//连续赋值语句endmodule(3)用过程语句always块描述modulegate2(F,A,B,C,D);inputA,B,C,D;outputF;regF;always@(AorBorCorD)//always过程语句F=~(A&B)|(B&C&D);endmodule(1)调用内置门元件描述modulegate3(F,A,B,C,D);inputA,B,C,D;outputF;nand(F1,A,B);and(F2,B,C,D);or(F,F1,F2);//调用内置门endmoduleassignF1=~(A&B);assignF2=(B&C&D);assignF=F1|F2;或2、三态门的描述regout;beginalways@(enorin)out=en?in:’bz;end(2)用assign连续赋值语句描述(3)用过程语句always块描述(1)调用内置门元件描述bufif1b1(out,in,en);assignout=en?in:’bz;※在VerilogHDL中,描述简单的组合逻辑通常使用assign结构。注意:条件运算符是一种在组合逻辑实现分支判断时常使用的格式。(二)复杂组合电路的描述※一般用always块实现较复杂的组合逻辑电路1、3线-8线译码器moduledecoder_38(out,in);output[7:0]out;input[2:0]in;reg[7:0]out;always@(in)begincase(in)3’b000:out=8’b11111110;3’b001:out=8’b11111101;3’b010:out=8’b11111011;3’b011:out=8’b11110111;3’b100:out=8’b11101111;3’b101:out=8’b11011111;3’b110:out=8’b10111111;3’b111:out=8’b01111111;default:out=8'bx;endcaseendendmoduleQUARTUSII编译后的生成的模块符号:2moduledecode4_7(a,b,c,d,e,f,g,D3,D2,D1,D0);outputa,b,c,d,e,f,g;inputD3,D2,D1,D0;rega,b,c,d,e,f,g;always@(D3orD2orD1orD0)begincase({D3,D2,D1,D0})4’d0:{a,b,c,d,e,f,g}=7’b1111110;4’d1:{a,b,c,d,e,f,g}=7’b0110000;4’d2:{a,b,c,d,e,f,g}=7’b1101101;4’d3:{a,b,c,d,e,f,g}=7’b1111001;4’d4:{a,b,c,d,e,f,g}=7’b0110011;4’d5:{a,b,c,d,e,f,g}=7’b1011011;4’d6:{a,b,c,d,e,f,g}=7’b1011111;4’d7:{a,b,c,d,e,f,g}=7’b1110000;4’d8:{a,b,c,d,e,f,g}=7’b1111111;4’d9:{a,b,c,d,e,f,g}=7’b1111011;default:{a,b,c,d,e,f,g}=7’bz;endcaseendendmodule2、BCD码——七段数码显示译码器QUARTUSII编译后的生成的模块符号:3、8线-3线优先编码器moduleencoder8_3(outcode,a,b,c,d,e,f,g,h);output[2:0]outcode;inputa,b,c,d,e,f,g,h;reg[2:0]outcode;always@(aorborcordoreorforgorh)beginif(h)outcode=3’b111;elseif(g)outcode=3’b110;elseif(f)outcode=3’b101;elseif(e)outcode=3’b100;elseif(d)outcode=3’b011;elseif(c)outcode=3’b010;elseif(b)outcode=3’b001;elseif(a)outcode=3’b000;elseoutcode=3’bzzz;endendmodule要求:输入高电平有效,输出为原码,哪一个输入的优先权最高?哪一个最低?QUARTUSII编译后的生成的模块符号:4、数据选择器(2选1、4选1)(略)5、奇偶校验位产生器moduleparity(even,odd,bus);input[7:0]bus;outputeven,odd;assignodd=^bus;//缩位运算产生奇校验位assigneven=~odd;//产生偶校验位endmodule6、程序如左所示,说出for语句的执行过程,说明该电路的功能modulevoter7(pass,vote);outputpass;input[6:0]vote;reg[2:0]sum;integeri;regpass;always@(vote)beginsum=0;for(i=0;i=6;i=i+1)if(vote[i])sum=sum+1;if(sum[2])pass=1;elsepass=0;endendmodule(vote[6]orvote[5]orvote[4]orvote[3]orvote[2]orvote[1]orvote[0])3’b000循环体//i=7时这条语句得到执行,判断sum是否大于等于4电路功能:7人多数表决器练习:采用VerilogHDLcase语句对半加器进行行为描述modulehalfadder(A,B,S,C);inputA,B;outputS,C;regS,C;always@(AorB)begincase({A,B})2'B00:{S,C}=2'B00;2'B01:{S,C}=2'B10;2'B10:{S,C}=2'B10;2'B11:{S,C}=2'B01;endcaseendendmodule(一)简单时序逻辑电路的描述※通常使用always@(posedgeclk)或@(negedgeclk)块来描述时序逻辑。基本D触发器moduleDFF(Q,D,CLK);outputQ;inputD,CLK;regQ;always@(posedgeCLK)Q=D;endmodule三、常用时序电路模块设计上升沿有效的边沿结构的D触发器(二)复杂时序逻辑电路的描述※通常在always过程语句里使用条件语句来实现较复杂的时序逻辑电路。1、带清零端、置1端的D触发器moduleDFF1(q,qn,d,clk,set,reset);outputq,qn;inputd,clk,set,reset;regq,qn;always@(posedgeclk)beginif(!reset)beginq=0;qn=1;endelseif(!set)beginq=1;qn=0;endelsebeginq=d;qn=~d;endendendmoduleornegedgesetornegedgereset同步清零,低电平有效.优先级高同步置数,低电平有效.优先级低异步置数或异步清零?2、带清零端、置1端的JK触发器moduleJK_FF(CLK,J,K,Q,RS,SET);inputCLK,J,K,SET,RS;outputQ;regQ;always@(posedgeCLKornegedgeRSornegedgeSET)beginif(!RS)Q=1’B0;elseif(!SET)q=1’B1;elsecase({J,K})2’b00:Q=Q;2’b01:Q=1’b0;2’b10:Q=1’b1;2’b11:Q=~Q;endcaseendendmodule异步清零、异步置数异步清零,低电平有效3、数据寄存器modulereg8(out_data,in_data,clk,clr);output[7:0]out_data;input[7:0]in_data;inputclk,clr;reg[7:0]out_data;always@(posedgeclkorposedgeclr)beginif(clr)out_data=0;elseout_data=in_data;endendmodule异步清零,高电平有效4、数据锁存器modulelatch_8(qout,data,clk);output[7:0]qout;input[7:0]data;inputclk;reg[7:0]qout;always@(clkordata)if(clk)qout=data;endmodule寄存器与锁存器寄存器与锁存器的异同:相同点:功能相同,都具有保存数据的功能。区别:锁存器一般是由电平信号来控制的,属于电平敏感型,而寄存器一般由同步时钟信号控制,属于边沿敏感型,若数据有效滞后于控制信号有效,则只能使用锁存器,若数据提前于控制信号,并要求同步操作,则可以选择寄存器来存放数据moduleshifter(din,clk,clr,dout);inputdin,clk,clr;output[7:0]dout;reg[7:0]dout;always@(posedgeclk)beginif(clr)dout
本文标题:常见组合逻辑电路6
链接地址:https://www.777doc.com/doc-3187411 .html