Verilog中如何使用case语句替代for循环实现7人投票逻辑
问题描述
以下是用Verilog编写的7人投票程序,受for循环效率问题影响,需要将代码中的for循环替换为case语句。
原完整代码:
module voter7(pass, vote); output pass; input[6:0] vote; reg[2:0] sum; integer i; reg pass; always @(vote) begin sum = 0; for(i=0; i<=6; i=i+1) if(vote[i]) sum = sum+1; if(sum[2]) pass = 1; else pass = 0; end endmodule
需要替换的代码段:
for(i=0; i<=6; i=i+1) if(vote[i]) sum = sum+1;
实现方案
因为vote是固定7位位宽的输入,总共有128种取值可能,直接以vote作为case的分支判断条件,枚举所有输入对应的赞成票总数赋值给sum即可,完全不需要循环逻辑。
替换后的完整代码如下:
module voter7(pass, vote); output pass; input[6:0] vote; reg[2:0] sum; reg pass; always @(vote) begin case(vote) // 0票赞成 7'b0000000: sum = 3'd0; // 1票赞成 7'b0000001,7'b0000010,7'b0000100,7'b0001000,7'b0010000,7'b0100000,7'b1000000: sum = 3'd1; // 2票赞成 7'b0000011,7'b0000101,7'b0000110,7'b0001001,7'b0001010,7'b0001100,7'b0010001,7'b0010010,7'b0010100,7'b0011000,7'b0100001,7'b0100010,7'b0100100,7'b0101000,7'b0110000,7'b1000001,7'b1000010,7'b1000100,7'b1001000,7'b1010000,7'b1100000: sum = 3'd2; // 3票及以上赞成,直接赋值sum最高位为1即可满足pass判定 default: sum = 3'd4; endcase pass = sum[2]; end endmodule
该实现为纯组合逻辑查找表结构,综合后电路延迟比for循环生成的逐位加法电路更低,运行效率更高。
内容的提问来源于stack exchange,提问作者Freya
相关产品推荐
相关产品推荐

