[verilog]if……else的一种糟糕的用法
(2010-11-30 08:58:46)
标签:
杂谈 |
分类: FPGA |
module test(
input clk,aclr;
output [4:0] out;
output sop;
reg[4:0] out;
reg sop;
reg[4:0] in;
always@(posedge
begin
//
//
//
//
end
endmodule
以上的代码功能很简单:当aclr为高时,对电路异步复位;当aclr为低时,5位寄存器in开始+1计数;当计数器计到特定的值时,对out进行赋值;当计数器为特定的值时对sop信号赋值;
在quartus中综合出电路中,sop和in还有out寄存器前面各有5个串联的多路选择器,对应这几个if……else语句,可见这个if……else若用得不好,是多么费逻辑资源。
module ddd(
input clk,aclr;
output [4:0] out;
output sop;
reg[4:0] out;
reg sop;
reg[4:0] in;
always@(posedge clk)
begin
end
endmodule
这样的写法确实可以节省逻辑资源,并减少sop和in的输入信号的延时。
但时out前面仍然有多个串联的选择器,故想到用case语句对out赋值
本想这样用
reg[4:0] out_tem;
case(in)
5'd0:……
5'd1:……
……
5'd31:……
default:
out_tem=out_tem;
endcase
always@(posedge clk or posedge aclr)
begin
end
但发现这样的case语句综合出来的out_tem为触发器,按理说这样的思路是没有错的啊,因为in的每一种情况我都对out_tem赋了值,把out_tem作为多路选择器的一路输入信号再反回out_tem为什么不行呢?这里有点搞不懂了。于是只好换了另一种办法,用casex语句把所有的情况都一一列出:
module ddd(
input clk,aclr;
output [4:0] out;
output sop;
reg[4:0] out;
reg sop;
reg[4:0] in;
reg[4:0] out_tem;
always@(in)
casex(in)
endcase
always@(posedge clk or posedge
aclr)
begin
end
endmodule
经过这样的处理后,基本上消除了那种信号经过很多个选择器串连后为寄存器提供输入的情况。