下面是verilog中描述的七人投票程式,但是由于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
這是我教授留下的作業。沒錯,我想用case陳述句重寫下面的代碼。
for(i=0; i<=6; i=i 1)
if(vote[i]) sum = sum 1;
uj5u.com熱心網友回復:
與“C”等不同的高級編程語言不同,Verilog case 陳述句包括隱式 break 陳述句。 Verilog 教程中的 verilog-case-statement
根據我的經驗,你的教授可能犯了一個錯誤,他認為 Verilog 可以順序執行多個 case 陳述句,但實際上它不能這樣做。因此,您可能會使用以下笨拙的方法來回應您的教授。
module voter7(pass, vote);
output pass;
input[6:0] vote;
reg[2:0] sum;
integer i;
reg pass;
always @(vote)
begin
sum = 0;
casez(vote)
7'b??????1: sum = sum 1;
endcase
casez(vote)
7'b?????1?: sum = sum 1;
endcase
casez(vote)
7'b????1??: sum = sum 1;
endcase
casez(vote)
7'b???1???: sum = sum 1;
endcase
casez(vote)
7'b??1????: sum = sum 1;
endcase
casez(vote)
7'b?1?????: sum = sum 1;
endcase
casez(vote)
7'b1??????: sum = sum 1;
endcase
if(sum[2]) pass = 1;
else pass = 0;
end
endmodule
uj5u.com熱心網友回復:
在對回圈不一定比一個case陳述句效率較低。在您的情況下,合成模型的問題可能出在“ ”運算子中。在您的情況下,綜合可以嘗試生成 7 個 3 位加法器。
其中一個想法是創建一個巨大的 case 陳述句,其中列出了多數位的所有可能組合:
casez(vote)
7'b???1111,
7'b??1?111,
7'b??11?11,
.... : pass = 1;
defalut: pass = 0;
唯一的問題是在 7 位系統中列出 4 位的所有可能組合。我會把它留給你。建議是創建一個測驗平臺并比較回圈和 case 陳述句的結果。
順便說一句,使用always @*而不是總是 @(vote)。讓它成為一種習慣,它會在以后避免許多錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/329233.html
上一篇:Python:使用for回圈制作萬無一失的輸入法時出錯
下一篇:減少和列印字串陣列
