Mux2to1
module top_module( input a, b, sel, output out ); assign out=sel?b:a; endmodule
Mux2to1v
100位和1位的是一樣的,
module top_module( input [99:0] a, b, input sel, output [99:0] out ); assign out=sel?b:a; endmodule
Mux9to1v
一個case陳述句就可以解決,這里默認值用的:out=‘1;這里就可以把一個數的所有位都置為1,0、x、z也可以這樣用,作者說喜歡賦一個初值,我好像更喜歡用一個default case,hhh,
module top_module( input [15:0] a, b, c, d, e, f, g, h, i, input [3:0] sel, output [15:0] out ); always@(*) begin case(sel) 4'd0:out=a; 4'd1:out=b; 4'd2:out=c; 4'd3:out=d; 4'd4:out=e; 4'd5:out=f; 4'd6:out=g; 4'd7:out=h; 4'd8:out=i; default:out=16'b1111_1111_1111_1111; endcase end endmodule
Mux256to1
看見around 1 line就知道怎么寫了,
module top_module( input [255:0] in, input [7:0] sel, output out ); assign out=in[sel]; endmodule
Mux256to1v
這道題開始直接寫的out=in[sel*4+3:sel*4];報錯網上查了一下說是A[a:b]中的a、b應為常數,所以這里把四個數拼接起來,
答案還給了兩種不常用的語法:out = in[sel*4 +: 4];代表從下標從sel開始累加四次,或者out = in[sel*4+3 -: 4];同理,
module top_module( input [1023:0] in, input [7:0] sel, output [3:0] out ); assign out={in[sel*4+3],in[sel*4+2],in[sel*4+1],in[sel*4]}; endmodule
Hadd
似曾相識,
module top_module( input a, b, output cout, sum ); assign cout=a&b; assign sum=a^b; endmodule
Fadd
module top_module( input a, b, cin, output cout, sum ); assign sum=a^b^cin; assign cout=a&b | a&cin | b&cin; endmodule
Adder3
module top_module( input [2:0] a, b, input cin, output [2:0] cout, output [2:0] sum ); add add1(a[0],b[0],cin,cout[0],sum[0]); add add2(a[1],b[1],cout[0],cout[1],sum[1]); add add3(a[2],b[2],cout[1],cout[2],sum[2]); endmodule module add( input a, b, cin, output cout, sum ); assign sum=a^b^cin; assign cout=a&b | a&cin | b&cin; endmodule
Exams/m2014 q4j
想復雜了,答案直接sum=x+y,
答案告訴了verilog一個很奇特的地方x+y包括進位,但是x+y仍是一個4位的數,所以sum=x+y是對的,但是sum = {x+y}是錯的,
module top_module ( input [3:0] x, input [3:0] y, output [4:0] sum); wire cout[3:0]; fadd add1(x[0],y[0],1'b0,cout[0],sum[0]); fadd add2(x[1],y[1],cout[0],cout[1],sum[1]); fadd add3(x[2],y[2],cout[1],cout[2],sum[2]); fadd add4(x[3],y[3],cout[2],sum[4],sum[3]); endmodule module fadd( input a, b, cin, output cout, sum ); assign sum=a^b^cin; assign cout=a&b | a&cin | b&cin; endmodule
Exams/ece241 2014 q1c
這里有兩種情況可能導致溢位:1、兩個數都為正數,即a[7]和b[7]都為0,而相加后溢位,即s[7]為1;2、兩個數都為負數,即a[7]和b[7]都為1,而相加后溢位,即s[7]為0;
module top_module ( input [7:0] a, input [7:0] b, output [7:0] s, output overflow ); // assign s = a+b; assign overflow = (a[7]&b[7]&~s[7])|(~a[7]&~b[7]&s[7]); endmodule
Adder100
直接寫+號就是爽
module top_module( input [99:0] a, b, input cin, output cout, output [99:0] sum ); assign {cout,sum}=a+b+cin; endmodule
Bcdadd4
注意bcd編碼不能直接用加法符號,
module top_module ( input [15:0] a, b, input cin, output cout, output [15:0] sum ); wire [2:0]c; bcd_fadd add[3:0](a[15:0],b[15:0],{c[2:0],cin},{cout,c[2:0]},sum[15:0]); endmodule
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/524901.html
標籤:Verilog
