verilog设计加法器

左心房为你撑大大i 提交于 2019-11-26 14:49:45

概述

本文利用了硬件行为描述、数据流描述、结构描述三种方法分别写了几个加法器

一位半加法器

即两个一位的二进制数相加,得到其正常相加的结果的最后一位。

仿真波形图

硬件行为描述

设计文件

12345678910111213141516171819202122
module bjqxw(a,b,sum,cout);    input a,b;    output sum,cout;    reg sum,cout;    always @(a or b)        begin            case({a,b})                2'b00:begin                    sum=0;cout=0;                    end                2'b01:begin                    sum=1;cout=0;                    end                2'b10:begin                    sum=1;cout=0;                    end                2'b11:begin                    sum=0;cout=1;                    end             endcase        endendmodule

仿真结构图

仿真文件

12345678910
module bjqxwsimu;    reg a,b;    wire sum,cout;    bjqxw sl(a,b,sum,cout);    initial        begin            a=0;b=0;        end    always #10 {a,b}={a,b}+1;endmodule

结构描述

设计文件

123456
module add(a,b,sum,cout);    input a,b;    output sum,cout;    xor(sum,a,b);    and(cout,a,b);endmodule

仿真结构图

仿真文件

12345678910
module add1;    reg a,b;    wire sum,cout;    add ul(a,b,sum,cout);    initial    begin        a=0;b=0;    end    always #10 {a,b}={a,b}+1;endmodule

数据流描述

设计文件

1234567
endmodulemodule add3(a,b,sum,cout);    input a,b;    output sum,cout;    wire sum,cout;    assign sum=a^b;    assign cout=a&b;endmodule

仿真结构图

仿真文件

12345678910111213141516
module add1;    reg ain,bin;    reg clk;    wire sum1,cout1;    initial    begin        ain=0;bin=0;clk=0;    end    always #50 clk=~clk;    always @(posedge clk)    begin        ain={$random}%2;        #3 bin={$random}%2;    end    add3 ul(.a(ain),.b(bin),.sum(sum1),.cout(cout1));endmodule

一位全加器

仿真波图

硬件行为描述

设计文件

12345678910111213141516171819202122232425262728293031323334
module qjq(a,b,cin,sum,cout);    input a,b,cin;    output sum,cout;    reg sum,cout;    always @(a or b or cin)    begin    case ({cin,a,b})        3'b000:begin            sum=0;cout=0;        end        3'b001:begin            sum=1;cout=0;        end        3'b010:begin            sum=1;cout=0;        end       3'b011:begin            sum=0;cout=1;        end        3'b100:begin            sum=1;cout=0;        end        3'b101:begin            sum=0;cout=1;        end        3'b110:begin            sum=0;cout=1;        end        3'b111:begin            sum=1;cout=1;        end      endcase      endendmodule

仿真结构图

仿真文件

12345678910
module qjq1;    reg a,b,cin;    wire sum,cout;    qjq ul(a,b,cin,sum,cout);    initial    begin        a=0;b=0;cin=0;    end    always #10 {a,b,cin}={a,b,cin}+1;endmodule

结构描述

设计文件

12345678910
module qiq(a,b,cin,sum,cout);    input a,b,cin;    output sum,cout;    wire q1,q2,q3;    xor(sum,a,b,cin);    or(q1,a,b);    or(q2,b,cin);    or(q3,a,cin);    and(cout,q1,q2,q3);endmodule

仿真结构图

仿真文件

12345678910
module qjq1;    reg a,b,cin;    wire sum,cout;    qiq ul(a,b,cin,sum,cout);    initial    begin        a=0;b=0;cin=0;    end    always #10 {a,b,cin}={a,b,cin}+1;endmodule

数据流描述

设计文件

12345
module qjq(a,b,cin,sum,cout);    input a,b,cin;    output sum,cout;    assign {sum,cout}=a+b+cin;endmodule

仿真结构图

仿真文件

12345678910
module qjqsimu;    reg a,b,cin;    wire sum,cout;    qjq sl(a,b,cin,sum,cout);    initial        begin            a=0;b=0;cin=a&b;        end    always #20 {a,b}={a,b}+1;endmodule

四位全加器

数据流描述

设计文件

1234567
module qjq(a,b,cin,sum,cout);    input [3:0] a,b;    input cin;    output [3:0] sum;    output cout;    assign {sum,cout}=a+b+cin;endmodule

仿真结构图

仿真文件

123456789101112
module qjqsimu;    reg [3:0] a,b;    reg cin;    wire [3:0] sum;    wire cout;    qjq sl(a,b,cin,sum,cout);    initial        begin            a=4'b0000;b=4'b0000;cin=0;        end    always #20 {a,b}={a,b}+4'b0001;endmodule

仿真波图

ps:将上述输入输出的字段长度对应修改,可得到相应数位的全加器数据流描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!