【HDLBits刷题笔记】07 Multiplexer&Arithmetic adder
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