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.cnblogs.com/magnolia666/p/16831291.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!