• 牛客刷题<17>用3-8译码器实现全减器


    题目:用3-8译码器实现全减器_牛客题霸_牛客网

    前言:被减数是减号前边的数,减数是减号后面的数

    知识点:3-8译码器的输出实际上包含了输入A2 A1 A0的所有最小项,而全减器作为作为组合电路,其输出最终可化简为最小项的形式。由于译码器的输出是最小项取反,而逻辑函数可以写成最小项之和的形式,故可以利用门电路和译码器实现逻辑函数。

    须先列出全减器的真值表

    ABCiDCo
    00000
    00111
    01011
    01101
    10010
    10100
    11000
    11111

    由真值表可得出,输出D的逻辑表达式用最小项表示为:

    D=m1+m2+m3+m7

    输出Co的逻辑表达式用最小项表示

    Co =m1+m2+m3+m7;

    由于译码器的输出是最小项取反,根据反演定理,转换结果如下:

    D =(m1'm2'm4'm7')';

    Co=(m1'm2'm3'm7')'

    表示取反

    由上式可知,使用与非门即可实现该电路的组合逻辑输出

    上图中D和Co的输入端来自同一译码器 

    本题给出的3-8译码器只有一个使能端口E。当E==1时,译码器正常工作;当E==0时,译码器输出为8'b1111_1111

    解法一

    1. `timescale 1ns/1ns
    2. module decoder_38(
    3. input E ,
    4. input A0 ,
    5. input A1 ,
    6. input A2 ,
    7. output reg Y0n ,
    8. output reg Y1n ,
    9. output reg Y2n ,
    10. output reg Y3n ,
    11. output reg Y4n ,
    12. output reg Y5n ,
    13. output reg Y6n ,
    14. output reg Y7n
    15. );
    16. always @(*)begin
    17. if(!E)begin
    18. Y0n = 1'b1;
    19. Y1n = 1'b1;
    20. Y2n = 1'b1;
    21. Y3n = 1'b1;
    22. Y4n = 1'b1;
    23. Y5n = 1'b1;
    24. Y6n = 1'b1;
    25. Y7n = 1'b1;
    26. end
    27. else begin
    28. case({A2,A1,A0})
    29. 3'b000 : begin
    30. Y0n = 1'b0; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    31. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    32. end
    33. 3'b001 : begin
    34. Y0n = 1'b1; Y1n = 1'b0; Y2n = 1'b1; Y3n = 1'b1;
    35. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    36. end
    37. 3'b010 : begin
    38. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b0; Y3n = 1'b1;
    39. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    40. end
    41. 3'b011 : begin
    42. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b0;
    43. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    44. end
    45. 3'b100 : begin
    46. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    47. Y4n = 1'b0; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    48. end
    49. 3'b101 : begin
    50. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    51. Y4n = 1'b1; Y5n = 1'b0; Y6n = 1'b1; Y7n = 1'b1;
    52. end
    53. 3'b110 : begin
    54. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    55. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b0; Y7n = 1'b1;
    56. end
    57. 3'b111 : begin
    58. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    59. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b0;
    60. end
    61. default: begin
    62. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    63. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    64. end
    65. endcase
    66. end
    67. end
    68. endmodule
    69. module decoder1(
    70. input A ,
    71. input B ,
    72. input Ci ,
    73. output wire D ,
    74. output wire Co
    75. );
    76. wire Y0_n;
    77. wire Y1_n;
    78. wire Y2_n;
    79. wire Y3_n;
    80. wire Y4_n;
    81. wire Y5_n;
    82. wire Y6_n;
    83. wire Y7_n;
    84. decoder_38 U0(
    85. .E(1'b1),
    86. .A0(Ci),
    87. .A1(B),
    88. .A2(A),
    89. .Y0n(Y0_n),
    90. .Y1n(Y1_n),
    91. .Y2n(Y2_n),
    92. .Y3n(Y3_n),
    93. .Y4n(Y4_n),
    94. .Y5n(Y5_n),
    95. .Y6n(Y6_n),
    96. .Y7n(Y7_n)
    97. );
    98. assign D = ~(Y1_n & Y2_n & Y4_n & Y7_n);
    99. assign Co = ~(Y1_n & Y2_n & Y3_n & Y7_n);
    100. endmodule

    解法二

    1. `timescale 1ns/1ns
    2. module decoder_38(
    3. input E ,
    4. input A0 ,
    5. input A1 ,
    6. input A2 ,
    7. output reg Y0n ,
    8. output reg Y1n ,
    9. output reg Y2n ,
    10. output reg Y3n ,
    11. output reg Y4n ,
    12. output reg Y5n ,
    13. output reg Y6n ,
    14. output reg Y7n
    15. );
    16. always @(*)begin
    17. if(!E)begin
    18. Y0n = 1'b1;
    19. Y1n = 1'b1;
    20. Y2n = 1'b1;
    21. Y3n = 1'b1;
    22. Y4n = 1'b1;
    23. Y5n = 1'b1;
    24. Y6n = 1'b1;
    25. Y7n = 1'b1;
    26. end
    27. else begin
    28. case({A2,A1,A0})
    29. 3'b000 : begin
    30. Y0n = 1'b0; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    31. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    32. end
    33. 3'b001 : begin
    34. Y0n = 1'b1; Y1n = 1'b0; Y2n = 1'b1; Y3n = 1'b1;
    35. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    36. end
    37. 3'b010 : begin
    38. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b0; Y3n = 1'b1;
    39. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    40. end
    41. 3'b011 : begin
    42. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b0;
    43. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    44. end
    45. 3'b100 : begin
    46. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    47. Y4n = 1'b0; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    48. end
    49. 3'b101 : begin
    50. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    51. Y4n = 1'b1; Y5n = 1'b0; Y6n = 1'b1; Y7n = 1'b1;
    52. end
    53. 3'b110 : begin
    54. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    55. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b0; Y7n = 1'b1;
    56. end
    57. 3'b111 : begin
    58. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    59. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b0;
    60. end
    61. default: begin
    62. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    63. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    64. end
    65. endcase
    66. end
    67. end
    68. endmodule
    69. module decoder1(
    70. input A ,
    71. input B ,
    72. input Ci ,
    73. output wire D ,
    74. output wire Co
    75. );
    76. wire [7:0] Y;
    77. assign D = ~Y[1] + ~Y[2] + ~Y[4] + ~Y[7];
    78. assign Co = ~Y[1] + ~Y[4] + ~Y[5] + ~Y[7];
    79. decoder_38 inst(
    80. .E(1),
    81. .A0(B),
    82. .A1(A),
    83. .A2(Ci),
    84. .Y0n(Y[0]),
    85. .Y1n(Y[1]),
    86. .Y2n(Y[2]),
    87. .Y3n(Y[3]),
    88. .Y4n(Y[4]),
    89. .Y5n(Y[5]),
    90. .Y6n(Y[6]),
    91. .Y7n(Y[7])
    92. );
    93. endmodule

    解法三

    1. `timescale 1ns/1ns
    2. module decoder_38(
    3. input E ,
    4. input A0 ,
    5. input A1 ,
    6. input A2 ,
    7. output reg Y0n ,
    8. output reg Y1n ,
    9. output reg Y2n ,
    10. output reg Y3n ,
    11. output reg Y4n ,
    12. output reg Y5n ,
    13. output reg Y6n ,
    14. output reg Y7n
    15. );
    16. always @(*)begin
    17. if(!E)begin
    18. Y0n = 1'b1;
    19. Y1n = 1'b1;
    20. Y2n = 1'b1;
    21. Y3n = 1'b1;
    22. Y4n = 1'b1;
    23. Y5n = 1'b1;
    24. Y6n = 1'b1;
    25. Y7n = 1'b1;
    26. end
    27. else begin
    28. case({A2,A1,A0})
    29. 3'b000 : begin
    30. Y0n = 1'b0; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    31. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    32. end
    33. 3'b001 : begin
    34. Y0n = 1'b1; Y1n = 1'b0; Y2n = 1'b1; Y3n = 1'b1;
    35. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    36. end
    37. 3'b010 : begin
    38. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b0; Y3n = 1'b1;
    39. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    40. end
    41. 3'b011 : begin
    42. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b0;
    43. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    44. end
    45. 3'b100 : begin
    46. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    47. Y4n = 1'b0; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    48. end
    49. 3'b101 : begin
    50. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    51. Y4n = 1'b1; Y5n = 1'b0; Y6n = 1'b1; Y7n = 1'b1;
    52. end
    53. 3'b110 : begin
    54. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    55. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b0; Y7n = 1'b1;
    56. end
    57. 3'b111 : begin
    58. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    59. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b0;
    60. end
    61. default: begin
    62. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    63. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    64. end
    65. endcase
    66. end
    67. end
    68. endmodule
    69. module decoder1(
    70. input A ,
    71. input B ,
    72. input Ci ,
    73. output wire D ,
    74. output wire Co
    75. );
    76. wire m1,m2,m3,m4,m7;
    77. decoder_38 inst(
    78. .E(1),
    79. .A0(Ci),
    80. .A1(B),
    81. .A2(A),
    82. .Y0n(),
    83. .Y1n(m1),
    84. .Y2n(m2),
    85. .Y3n(m3),
    86. .Y4n(m4),
    87. .Y5n(),
    88. .Y6n(),
    89. .Y7n(m7)
    90. );
    91. assign D = !m1 | !m2 | !m4 | !m7;
    92. assign Co = !m1 | !m2 | !m3 | !m7;
    93. endmodule

    解法四:不理解

    1. `timescale 1ns/1ns
    2. module decoder_38(
    3. input E ,
    4. input A0 ,
    5. input A1 ,
    6. input A2 ,
    7. output reg Y0n ,
    8. output reg Y1n ,
    9. output reg Y2n ,
    10. output reg Y3n ,
    11. output reg Y4n ,
    12. output reg Y5n ,
    13. output reg Y6n ,
    14. output reg Y7n
    15. );
    16. always @(*)begin
    17. if(!E)begin
    18. Y0n = 1'b1;
    19. Y1n = 1'b1;
    20. Y2n = 1'b1;
    21. Y3n = 1'b1;
    22. Y4n = 1'b1;
    23. Y5n = 1'b1;
    24. Y6n = 1'b1;
    25. Y7n = 1'b1;
    26. end
    27. else begin
    28. case({A2,A1,A0})
    29. 3'b000 : begin
    30. Y0n = 1'b0; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    31. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    32. end
    33. 3'b001 : begin
    34. Y0n = 1'b1; Y1n = 1'b0; Y2n = 1'b1; Y3n = 1'b1;
    35. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    36. end
    37. 3'b010 : begin
    38. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b0; Y3n = 1'b1;
    39. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    40. end
    41. 3'b011 : begin
    42. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b0;
    43. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    44. end
    45. 3'b100 : begin
    46. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    47. Y4n = 1'b0; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    48. end
    49. 3'b101 : begin
    50. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    51. Y4n = 1'b1; Y5n = 1'b0; Y6n = 1'b1; Y7n = 1'b1;
    52. end
    53. 3'b110 : begin
    54. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    55. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b0; Y7n = 1'b1;
    56. end
    57. 3'b111 : begin
    58. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    59. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b0;
    60. end
    61. default: begin
    62. Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
    63. Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
    64. end
    65. endcase
    66. end
    67. end
    68. endmodule
    69. module decoder1(
    70. input A ,
    71. input B ,
    72. input Ci ,
    73. output wire D ,
    74. output wire Co
    75. );
    76. wire [1:0] add;
    77. assign add = B + Ci;
    78. assign D = (A>=add)?(A-add):(2+A-add);
    79. assign Co = (A>=add)?1'b0:1'b1;
    80. endmodule

    Testbench

    1. `timescale 1ns/1ns
    2. module testbench();
    3. initial begin
    4. $dumpfile("out.vcd");
    5. $dumpvars(0,testbench);
    6. end
    7. decoder1 inst(
    8. .A(A),
    9. .B(B),
    10. .Ci(Ci),
    11. .D(D),
    12. .Co(Co)
    13. );
    14. endmodule

  • 相关阅读:
    Less混合结合:nth-child()选择器的高级玩法
    Flink CDC-SQL Server CDC配置及DataStream API实现代码...可实现监控采集一个数据库的多个表
    elasticsearch-exporter部署手册
    Java中的正则表达式是什么该怎么用?
    【Java毕设项目】基于SpringBoot+Vue科研管理系统的设计与实现
    【爬虫实战】用python爬今日头条热榜TOP50榜单!
    el-table行添加阴影悬浮效果
    【autodl/linux配环境心得:conda/本地配cuda,cudnn及pytorch心得】
    01-Scala环境部署
    沉睡者IT - 中视频破10万播放秘诀,只需一个无脑动作
  • 原文地址:https://blog.csdn.net/mxh3600/article/details/126488561