EDA技术与Verilog设计王金明版第10章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
综合
可综合的设计中应注意
不使用初始化语句;不使用带有延时的描述;不使用循环 次数不确定的循环语句,如forever等。 除非是关键路径的设计,一般不采用调用门级元件来描述 设计的方法,建议采用行为语句来完成设计。 应尽量采用同步方式设计电路。 用always过程块描述组合逻辑,应在敏感信号列表中列出 块中出现的所有输入信号。 所有的内部寄存器都应该能够被复位,在使用FPGA实现 设计时,应尽量使用器件的全局复位端作为系统总的复位 ,用器件的全局时钟端作为系统外部时钟输入端。 在Verilog模块中,任务(task)通常被综合成组合逻辑的 形式;每个函数(function)在调用时通常也被综合为一 个独立的组合电路模块。
state2: begin if (step2) next_state <=state3; else next_state <=state0; end state3: begin if (step3) next_state <=state0; else next_state <=state3; end default: next_state <=state0; /*default 语句*/ endcase end always @(state) /*该进程定义组合逻辑(FSM 的输出)*/ begin case(state) state0: out=3'b001; state1: out=3'b010; state2: out=3'b100; state3: out=3'b111; default:out=3'b001; /*default 语句,避免锁存 器的产生*/ endcase end endmodule
流水线设计的代价是增加了寄存操作的概念
如某个复杂逻辑功能的实现需较长的延时,可将其分解为几 个(如3个)步骤来实现,每一步的延时变小,在各步间加 入寄存器,以暂存中间结果,这样可大大提高整个系统的最 高工作频率。
流水线操作的概念示意图
非流水线方式实现的8位全加器
2个选择器和1个加法器的实现方式
资源共享
器件资源的消耗对比
资源共享
结 论
方式一需要2个加法器,而方式二通过增加一个MUX,共享 一个加法器,由于加法器耗用的资源比MUX更多,因此方式 二更节省资源。所以在电路设计中,应尽可能使硬件代价高的 功能模块资源共享,从而降低整个系统的成本。
例10.6设计可重用举例
有限状态机(FSM,Finite State Machine)是时序 电路设计中经常采用的一种方式,尤其适于设计数字系 统的控制模块。用Verilog的case、if-else等语句能很好 地描述基于状态机的设计。 状态机可以认为是组合逻辑和寄存器逻辑的特殊组 合,它一般包括两个部分:组合逻辑部分和寄存器逻辑 部分。寄存器用于存储状态,组合电路用于状态译码和 产生输出信号。状态机的下一状态及输出,不仅与输入 信号有关,而且还与寄存器当前所处状态有关。
四级流水线实现的8位加法器
module pipeline(cout,sum,ina,inb,cin,clk); output[7:0] sum;output cout; input[7:0] ina,inb;input cin,clk; reg[7:0] tempa,tempb,sum; reg tempci,firstco,secondco,thirdco, cout; reg[1:0] firsts, thirda,thirdb; reg[3:0] seconda, secondb, seconds; reg[5:0] firsta, firstb, thirds; always @(posedge clk) begin tempa=ina; tempb=inb; tempci=cin; end //输入数据缓存 always @(posedge clk) begin {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci; //第一级加(低2位) firsta=tempa[7:2]; firstb=tempb[7:2]; //未参加计算的数据缓存 end always @(posedge clk) begin {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts}; //第二级加(第2、3位相加) seconda=firsta[5:2]; secondb=firstb[5:2]; //数据缓存 end always @(posedge clk) begin {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}; //第三级加(第4、5位相加) thirda=seconda[3:2];thirdb=secondb[3:2]; //数据缓存 end always @(posedge clk) begin {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds}; //第四级加(高两位相加) end endmodule
10.3 资源共享(Resource Sharing)
1.先加后选
module resource1(sum,a,b,c,d,sel); parameter size=4; output[size:0] sum; input sel; input[size-1:0] a,b,c,d; reg[size:0] sum; always @(a or b or c or d or sel) begin if(sel) sum=a+b; else sum=c+d; end endmodule
第10章 设计的优化
第10章 设计的优化
10.1 设计的可综合性
10.2 流水线设计技术
主要 内容 10.3 资源共享
10.4 有限状态机设计
10.5 多层次结构电路的设计 10.6 进程 10.7 阻塞赋值与非阻塞赋值 10.8 FPGA设计中毛刺的消除
10.1 设计的可综合性
用FPGA/CPLD器件实现的设计中,综合就是将Verilog或 VHDL语言描述的行为级或功能级电路模型转化为RTL级功 能块或门级电路网表的过程
例10.8状态机设计的例子
moduleFSM(clk,clr,out,start,step2,step3) ;
input clk,clr,start,step2,step3; output[2:0] out; reg[2:0] out; reg[1:0] state,next_state; parameter state0=2'b00,state1=2'b01, state2=2'b11,state3=2'b10; /*状态编码,采用格雷(Gray)编码方式*/ always @(posedge clk or posedge clr) /* 该进程定义起始状态*/ begin if (clr) state <= state0; else state <= next_state; End always @(state or start or step2 or step3) /*该进程实现状态的转换*/ begin case (state) state0: begin if (start) next_state <=state1; else next_state <=state0; end state1: begin next_state <= state2; end
综上所述,在节省资源的设计中应注意一下重点: (1)尽量共享复杂的运算单元,可以采用函数和 任务来定义这些共享的数据处理模块。 (2)对综合后的结果要做到心中有数,可用括号 等方式控制综合的结果,尽量实现资源的共享和重 用已计算过的结果。
(3)模块数据宽度应该尽量小,以能满足设计要 求为标准。
10.4 有限状态机(FSM)设计
10.2 流水线设计(Pipeline Design)技术
流水线设计是经常用于提高所设计系统运行速度的 一种有效的方法。为了保障数据的快速传输,必须 使系统运行在尽可能高的频率上,但如果某些复杂 逻辑功能的完成需要较长的延时,就会使系统难以 运行在高的频率上,在这种情况下,可使用流水线 技术,即在长延时的逻辑功能块中插入触发器,使 复杂的逻辑操作分步完成,减小每个部分的延时, 从而使系统的运行频率得以提高。
module adder8(cout,sum,ina,inb,cin,clk); output[7:0] sum; output cout; input[7:0] ina,inb; input cin,clk; reg[7:0] tempa,tempb,sum; reg cout,tempc; always @(posedge clk) begin tempa=ina; tempb=inb; tempc=cin; end always @(posedge clk) begin {cout,sum}=tempa+tempb+tempc; end endmodule
状态机(FSM)分类:
米里型(Mealy):输出是当前状态和当前输入的函数,米 里型状态机的输出是在输入变化后立即改变的,不依赖时钟 信号的同步。 摩尔型(Moore):输出只是当前状态得函数,摩尔型状态 机的输入变化时还需要等待时钟的到来,必须等状态发生变 化时才导致输出的变化。
例10.8状态机设计的例子
module adder(s1,s2,a,b,c); input[3:0] a,b,c; output[4:0] s1,s2; reg[4:0] s1,s2; always @(a or b or c) module adder(s1,s2,a,b,c); begin input[3:0] a,b,c; s1=a+b; output[4:0] s1,s2; s2=c+a+b; reg[4:0] s1,s2; end always @(a or b or c) endmodule begin s1=a+b; s2=c+(a+b); end endmodule
2个加法器和1个选择器的实现方式
资源共享
1.先选后加
module resource2(sum,a,b,c,d,sel); parameter size=4; output[size-1:0] sum; input sel; input[size-1:0] a,b,c,d; reg[size-1:0] atemp,btemp; reg[size:0] sum; always @(a or b or c or d or sel) begin if(sel) begin atemp=a;btemp=b;end else begin atemp=c;btemp=d;end sum=atemp+btemp; end endmodule
设计综合到不同器件的最高工作频率
10.3 资源共享(Resource Sharing)
尽量减少系统所耗用的器件资源也是我们进行电路设计时所 追求的目标,在这方面,资源共享是一个较好的方法,尤其 是将一些耗用资源较多的模块进行共享,能有效降低整个系 统耗用的资源。 实现如下功能,当sel=0时, sum=a+b; 当sel=1时, sum=c+d;
//输入数据锁存
两级流水实现的8位加法器
module adder_pipe2(cout,sum,ina,inb,cin,clk); input[7:0] ina,inb; input cin,clk; output[7:0] sum; output cout;reg cout; reg[7:0] sum; reg[3:0] tempa,tempb,firsts; reg firstc; always @(posedge clk) begin {firstc,firsts}=ina[3:0]+inb[3:0]+cin; tempa=ina[7:4]; tempb=inb[7:4];end always @(posedge clk) begin {cout,sum[7:4]}=tempa+tempb+firstc; sum[3:0]=firsts; end endmodule