Conditional
使用三目運算子可以實作一個資料選擇器,可以替代if陳述句,不過:?可讀性較差,復雜邏輯還是推薦用if,
注意這道題中間變數的定義,不定義中間變數運算式會變得十分復雜且可讀性差,
module top_module ( input [7:0] a, b, c, d, output [7:0] min);// // assign intermediate_result1 = compare? true: false; wire [7:0] min_1,min_2; assign min_1=a>b?b:a; assign min_2=min_1>c?c:min_1; assign min=min_2>d?d:min_2; endmodule
Reduction
歸約運算子,雙目運算子直接用在多位變數前使用,可以實作歸約操作,這里使用了一個異或的歸約操作,實作了偶校驗,
module top_module ( input [7:0] in, output parity); assign parity = ^in; endmodule
Gates100
同樣是使用一個歸約運算子,實作100輸入的與、或、異或運算,
module top_module( input [99:0] in, output out_and, output out_or, output out_xor ); assign out_and=∈ assign out_or=|in; assign out_xor=^in; endmodule
Vector100r
按照提示用了一個for回圈,for回圈一般用于仿真,這里也可以用于反轉位序,
答案用了一個$bits()系統函式,可以直接回傳信號的位寬,
module top_module( input [99:0] in, output [99:0] out ); integer i=0; always@(*) begin for(i=0;i<100;i=i+1) begin out[i]=in[99-i]; end end endmodule
Popcount255
同樣使用了一個for回圈,也可以把in中每位的數加起來,就不用if判斷了,
module top_module( input [254:0] in, output [7:0] out ); reg [7:0] count; always@(*) begin count = 0; for(int i=0;i<$bits(in);i=i+1) begin if(in[i]==1'b1) count=count+1'b1; end end assign out=count; endmodule
Adder100i
題目意思是使用例化陣列或者generate陳述句,感覺這兩種用法用的并不多,不過還是嘗試寫了一下,
直接for回圈
module top_module( input [99:0] a, b, input cin, output [99:0] cout, output [99:0] sum ); always@(*) begin for(int i=0;i<100;i=i+1) begin {cout[i],sum[i]}=a[i]+b[i]+((i==0)?cin:cout[i-1]); end end endmodule
實體化陣列
module top_module( input [99:0] a, b, input cin, output [99:0] cout, output [99:0] sum ); add adder[99:0]( .cin({cout[98:0],cin}), .a(a[99:0]), .b(b[99:0]), .sum(sum[99:0]), .cout(cout[99:0]) ); endmodule module add( input cin, input a, input b, output sum, output cout ); assign {cout,sum}=cin+a+b; endmodule
generate for陳述句
module top_module( input [99:0] a, b, input cin, output [99:0] cout, output [99:0] sum ); genvar i; generate for(i = 0;i<$bits(sum);i=i+1) begin:gen add adder( .cin((i==0)?cin:cout[i-1]), .a(a[i]), .b(b[i]), .sum(sum[i]), .cout(cout[i]) ); end endgenerate endmodule module add( input cin, input a, input b, output sum, output cout ); assign {cout,sum}=cin+a+b; endmodule
Bcdadd100
這道題同樣也是用實體化陣列或者generate for陳述句,
module top_module( input [399:0] a, b, input cin, output cout, output [399:0] sum ); wire [98:0]c; bcd_fadd u_bcd_fadd[99:0]( .a(a[399:0]), .b(b[399:0]), .cin({c[98:0],cin}), .cout({cout,c[98:0]}), .sum(sum[399:0]) ); endmodule
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519378.html
標籤:其他
上一篇:機器學習實戰-AdaBoost
下一篇:解決vscode在使用默認的autopep8格式化工具格式化Python代碼時改變import陳述句位置導致自定義模塊不能匯入的問題
