当前位置:   article > 正文

3-8译码器与全加器_三八译码器实现全加器

三八译码器实现全加器

一、3-8译码器

逻辑真值表如下:

实现 3-8 译码器功能的 Verilog 代码形式也有很多种,我们这里主要列举两种最容易理解的方法:

1)if-else方法

  1. 1 module decoder3_8
  2. 2 (
  3. 3 input wire in1 , //输入信号 in1
  4. 4 input wire in2 , //输入信号 in2
  5. 5 input wire in3 , //输入信号 in3
  6. 6
  7. 7 output reg [7:0] out //输出信号 out
  8. 8 );
  9. 9
  10. 10 //out:根据 3 个输入信号选择输出对应的 8bit out 信号
  11. 11 always@(*)
  12. 12 //使用"{}"位拼接符将 31bit 数据按照顺序拼成一个 3bit 数据
  13. 13 if({in1, in2, in3} == 3'b000)
  14. 14 out = 8'b0000_0001;
  15. 15 else if({in1, in2, in3} == 3'b001)
  16. 16 out = 8'b0000_0010;
  17. 17 else if({in1, in2, in3} == 3'b010)
  18. 18 out = 8'b0000_0100;
  19. 19 else if({in1, in2, in3} == 3'b011)
  20. 20 out = 8'b0000_1000;
  21. 21 else if({in1, in2, in3} == 3'b100)
  22. 22 out = 8'b0001_0000;
  23. 23 else if({in1, in2, in3} == 3'b101)
  24. 24 out = 8'b0010_0000;
  25. 25 else if({in1, in2, in3} == 3'b110)
  26. 26 out = 8'b0100_0000;
  27. 27 else if({in1, in2, in3} == 3'b111)
  28. 28 out = 8'b1000_0000;
  29. 29 else
  30. 30 //最后一个 else 对应的 if 中的条件只有一种情况,还可能产生以上另外的 7 种情况
  31. 31 //如果不加这个 else 综合器会把不符合该 if 中条件的上面另外 7 种情况都考虑进去
  32. 32 //会产生大量的冗余逻辑并产生 latch(锁存器),所以在组合逻辑中最后一个 if
  33. 33 //后一定要加上 else,并任意指定一种确定的输出情况
  34. 34 out = 8'b0000_0001;

2)case方法

  1. 1 module decoder3_8
  2. 2 (
  3. 3 input wire in1 , //输入信号 in1
  4. 4 input wire in2 , //输入信号 in2
  5. 5 input wire in3 , //输入信号 in3
  6. 6
  7. 7 output reg [7:0] out //输出信号 out
  8. 8 );
  9. 9
  10. 10 //out:根据输入的 3bit in 信号选择输出对应的 8bit out 信号
  11. 11 always@(*)
  12. 12 case({in1, in2, in3})
  13. 13 3'b000 : out = 8'b0000_0001; //输入与输出的 8 种译码对应关系
  14. 14 3'b001 : out = 8'b0000_0010;
  15. 15 3'b010 : out = 8'b0000_0100;
  16. 16 3'b011 : out = 8'b0000_1000;
  17. 17 3'b100 : out = 8'b0001_0000;
  18. 18 3'b101 : out = 8'b0010_0000;
  19. 19 3'b110 : out = 8'b0100_0000;
  20. 20 3'b111 : out = 8'b1000_0000;
  21. 21 //因为 case 中列举了 in 所有可能输入的 8 种情况,且每种情况都有对应确定的输出
  22. 22 //所以此处 default 可以省略,但是为了以后因不能够完全列举而产生 latch
  23. 23 //所以我们默认一定要加上 default,并任意指定一种确定的输出情况
  24. 24 default: out = 8'b0000_0001;
  25. 25 endcase
  26. 26
  27. 27 endmodule

RTL视图:

二、全加器

1)1位全加器

Verilog:门级

  1. module A1bits( //Verilog-2001语法
  2. input A,B,Cin,
  3. output Sum,Cout
  4. );
  5. wire t1,t2,t3;//电路功能描述
  6. assign Sum=A^B^Cin;//表达式中的"^"为异或运算符
  7. assign t1=A&B,//表达式中的"&"为与运算符
  8. t2=A&Cin,
  9. t3=B^Cin;
  10. assign Cout=t1|t2|t3;//表达式中的"|"为或运算符
  11. endmodule

RTL电路:

Logsim

Verilog:行为级

  1. module top_module ();
  2. reg clk=0;
  3. always #5 clk = ~clk; // Create clock with period=10
  4. initial `probe_start; // Start the timing diagram
  5. `probe(clk); // Probe signal "clk"
  6. // A testbench
  7. reg ain,bin,cin;
  8. initial begin
  9. ain=0;
  10. bin=0;
  11. cin=0;
  12. #5 ain=1;
  13. bin=1;
  14. #5 ain=0;
  15. bin=0;
  16. #5 ain=1;
  17. cin=1;
  18. #5 bin=1;
  19. #60 $finish; // Quit the simulation
  20. end
  21. full_add add(.ain(ain),.bin(bin),.cin(cin)); // Sub-modules work too.
  22. endmodule
  23. module full_add(input ain,bin,cin,output sum,count);
  24. reg sum,count;
  25. always @(ain or bin or cin)begin
  26. sum=ain+cin+bin;//ain^bin^cin
  27. count=(ain&bin)|(ain&cin)|(bin&cin);
  28. end
  29. `probe(sum);
  30. `probe(ain);
  31. `probe(bin);
  32. `probe(cin);
  33. `probe(count);
  34. endmodule

2)4位全加器

Verilog

  1. module A4bit(
  2. input x,Y,cin
  3. output f,cout)
  4. ;
  5. assign f=x^y^cin;
  6. assign cout=(x&y)1(x&cin)l(y&cin);
  7. endmodule
  8. module CRA(
  9. input [3:0]x,y
  10. input cin,
  11. output [3:0]f,
  12. output cout;
  13. )
  14. wire[4:0]c;
  15. assign c[0]=cin;
  16. A4bit fa0(x[0],y[0],c[0],f[0],c[1]);
  17. A4bit fal(x[1],y[1],c[0],f[1],c[2]);
  18. A4bit fa2(x[2],y[2],c[0],f[2],c[3]);
  19. A4bit fa3(x[3],y[3],c[0],f[3],c[4]);
  20. assign cout=c[4];
  21. endmodule

RTL电路:

Logsim

Verilog:行为级

  1. module top_module ();
  2. reg clk=0;
  3. always #5 clk = ~clk; // Create clock with period=10
  4. initial `probe_start; // Start the timing diagram
  5. `probe(clk); // Probe signal "clk"
  6. // A testbench
  7. reg [3:0] ain,bin;
  8. reg cin;
  9. initial begin
  10. ain=0;
  11. bin=0;
  12. cin=0;
  13. #5 ain=2;
  14. bin=3;
  15. #5 ain=4;
  16. bin=2;
  17. #5 ain=14;
  18. cin=1;
  19. #5 bin=1;
  20. #60 $finish; // Quit the simulation
  21. end
  22. four_add add(.ain(ain),.bin(bin),.cin(cin)); // Sub-modules work too.
  23. endmodule
  24. module four_add(ain,bin,cin,sum,count);
  25. input [3:0] ain,bin,cin;
  26. output reg count;
  27. output reg [3:0] sum;
  28. always @(*) begin
  29. {count,sum}=ain+bin+cin;
  30. end
  31. `probe(sum);
  32. `probe(ain);
  33. `probe(bin);
  34. `probe(cin);
  35. `probe(count);
  36. endmodule

3)8位全加器

采用一位全加器模板实现8位全加器

  1. module A8bit(
  2. input x,Y,cin
  3. output f,cout)
  4. ;
  5. assign f=x^y^cin;
  6. assign cout=(x&y)1(x&cin)l(y&cin);
  7. endmodule
  8. module CRA(
  9. input [7:0]x,y
  10. input cin,
  11. output [7:0]f,
  12. output cout;
  13. )
  14. wire[8:0]c;
  15. assign c[0]=cin;
  16. A4bit fa0(x[0],y[0],c[0],f[0],c[1]);
  17. A4bit fal(x[1],y[1],c[0],f[1],c[2]);
  18. A4bit fa2(x[2],y[2],c[0],f[2],c[3]);
  19. A4bit fa3(x[3],y[3],c[0],f[3],c[4]);
  20. A4bit fa4(x[4],y[4],c[0],f[4],c[5]);
  21. A4bit fa5(x[5],y[5],c[0],f[5],c[6]);
  22. A4bit fa6(x[6],y[6],c[0],f[6],c[7]);
  23. A4bit fa7(x[7],y[7],c[0],f[7],c[8]);
  24. assign cout=c[8];
  25. endmodule

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/563560
推荐阅读
相关标签
  

闽ICP备14008679号