• 【牛客网刷题】VL11-VL24 组合逻辑 & 时序逻辑


    目录

    VL11 4位数值比较器电路

    VL12 4bit超前进位加法器电路

    VL13 优先编码器电路① 

    VL14 用优先编码器①实现键盘编码电路

    VL15 优先编码器Ⅰ

    VL16 使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器

    VL17 用3-8译码器实现全减器 

    VL18 实现3-8译码器

    VL19 使用3-8译码器①实现逻辑函数

    VL20 数据选择器实现逻辑电路

    VL21 根据状态转移表实现时序电路

    VL22 根据状态转移图实现时序电路

    VL23 ROM的简单实现

    VL24 边沿检测


    VL11 4位数值比较器电路

    题目描述

    某4位数值比较器的功能表如下。

    请用Verilog语言采用门级描述方式,实现此4位数值比较器

    input

    output

    A[3]B[3]

    A[2]B[2]

    A[1]B[1]

    A[0]B[0]

    Y2(A>B)

    Y1(A=B)

    Y0(A

    A[3]>B[3]

    x

    x

    x

    1

    0

    0

    A[3]

    x

    x

    x

    0

    0

    1

    A[3]=B[3]

    A[2]>B[2]

    x

    x

    1

    0

    0

    A[3]=B[3]

    A[2]

    x

    x

    0

    0

    1

    A[3]=B[3]

    A[2]=B[2]

    A[1]>B[1]

    x

    1

    0

    0

    A[3]=B[3]

    A[2]=B[2]

    A[1]

    x

    0

    0

    1

    A[3]=B[3]

    A[2]=B[2]

    A[1]=B[1]

    A[0]>B[0]

    1

    0

    0

    A[3]=B[3]

    A[2]=B[2]

    A[1]=B[1]

    A[0]

    0

    0

    1

    A[3]=B[3]

    A[2]=B[2]

    A[1]=B[1]

    A[0]=B[0]

    0

    1

    0

    RTL 设计

    1. `timescale 1ns/1ns
    2. module comparator_4(
    3. input [3:0] A ,
    4. input [3:0] B ,
    5. output wire Y2 , //A>B
    6. output wire Y1 , //A=B
    7. output wire Y0 //A<B
    8. );
    9. assign Y2 = (A[3] > B[3]) | ((A[3] == B[3]) & (A[2] > B[2])) | ((A[3] == B[3]) & (A[2] == B[2]) & (A[1] > B[1])) | ((A[3] == B[3]) & (A[2] == B[2]) & (A[1] == B[1]) & (A[0] > B[0]));
    10. assign Y1 = (A[3] == B[3]) & (A[2] == B[2]) & (A[1] == B[1]) & (A[0] == B[0]);
    11. assign Y0 = (~Y1) & (~Y2);
    12. endmodule

    testbench 设计

    1. `timescale 1ns/1ns
    2. module tb_comparator_4();
    3. reg [3:0] A;
    4. reg [3:0] B;
    5. wire Y2;
    6. wire Y1;
    7. wire Y0;
    8. initial begin
    9. A <= 4'd12;
    10. B <= 4'd10;
    11. #200
    12. $finish;
    13. end
    14. always #10 A <= {$random} % 5'd16;
    15. always #10 B <= {$random} % 5'd16;
    16. comparator_4 inst_comparator_4 (
    17. .A(A),
    18. .B(B),
    19. .Y2(Y2),
    20. .Y1(Y1),
    21. .Y0(Y0)
    22. );
    23. //verdi
    24. initial begin
    25. $fsdbDumpfile("tb_comparator_4.fsdb");
    26. $fsdbDumpvars(0);
    27. end
    28. endmodule

    仿真测试

    VL12 4bit超前进位加法器电路

    题目描述

    4bit超前进位加法器的逻辑表达式如下:

    请用Verilog语言采用门级描述方式,实现此4bit超前进位加法器,接口电路如下:

    输入描述

    A_in [3:0]

    B_in [3:0]

    C_1

    类型:wire

    输出描述

    S [3:0]

    CO

    类型:wire

    RTL 设计

    1. `timescale 1ns/1ns
    2. module lca_4(
    3. input [3:0] A_in ,
    4. input [3:0] B_in ,
    5. input C_1 ,
    6. output wire CO ,
    7. output wire [3:0] S
    8. );
    9. wire [3:0] G;
    10. wire [3:0] P;
    11. wire [3:0] C;
    12. //0
    13. assign G[0] = A_in[0] & B_in[0];
    14. assign P[0] = A_in[0] ^ B_in[0];
    15. assign C[0] = G[0] | (P[0] & C_1);
    16. assign S[0] = P[0] ^ C_1;
    17. //1
    18. assign G[1] = A_in[1] & B_in[1];
    19. assign P[1] = A_in[1] ^ B_in[1];
    20. assign C[1] = G[1] | (P[1] & C[0]);
    21. assign S[1] = P[1] ^ C[0];
    22. //2
    23. assign G[2] = A_in[2] & B_in[2];
    24. assign P[2] = A_in[2] ^ B_in[2];
    25. assign C[2] = G[2] | (P[2] & C[1]);
    26. assign S[2] = P[2] ^ C[1];
    27. //3
    28. assign G[3] = A_in[3] & B_in[3];
    29. assign P[3] = A_in[3] ^ B_in[3];
    30. assign C[3] = G[3] | (P[3] & C[2]);
    31. assign S[3] = P[3] ^ C[2];
    32. assign CO = C[3];
    33. endmodule

    testbench 设计

    1. `timescale 1ns/1ns
    2. module tb_lca_4();
    3. reg [3:0] A_in;
    4. reg [3:0] B_in;
    5. reg C_1;
    6. wire CO;
    7. wire S;
    8. initial begin
    9. A_in <= 4'd12;
    10. B_in <= 4'd10;
    11. C_1 <= 1'd1;
    12. #200
    13. $finish;
    14. end
    15. always #10 A_in <= {$random} % 5'd16;
    16. always #10 B_in <= {$random} % 5'd16;
    17. always #10 C_1 <= {$random} % 2'd2;
    18. lca_4 inst_lca_4 (
    19. .A_in(A_in),
    20. .B_in(B_in),
    21. .C_1(C_1),
    22. .CO(CO),
    23. .S(S)
    24. );
    25. //verdi
    26. initial begin
    27. $fsdbDumpfile("tb_lca_4.fsdb");
    28. $fsdbDumpvars(0);
    29. end
    30. endmodule

    仿真测试

    VL13 优先编码器电路① 

    题目描述

    下表是某优先编码器的真值表。

    ①请用Verilog实现此优先编码器

    RTL 设计

    1. `timescale 1ns/1ns
    2. module encoder_0(
    3. input [8:0] I_n,
    4. output reg [3:0] Y_n
    5. );
    6. always @(*) begin
    7. casez(I_n)
    8. 9'b111111111: begin
    9. Y_n <= 4'b1111;
    10. end
    11. 9'b0????????: begin
    12. Y_n <= 4'b0110;
    13. end
    14. 9'b10???????: begin
    15. Y_n <= 4'b0111;
    16. end
    17. 9'b110??????: begin
    18. Y_n <= 4'b1000;
    19. end
    20. 9'b1110?????: begin
    21. Y_n <= 4'b1001;
    22. end
    23. 9'b11110????: begin
    24. Y_n <= 4'b1010;
    25. end
    26. 9'b111110???: begin
    27. Y_n <= 4'b1011;
    28. end
    29. 9'b1111110??: begin
    30. Y_n <= 4'b1100;
    31. end
    32. 9'b11111110?: begin
    33. Y_n <= 4'b1101;
    34. end
    35. 9'b111111110: begin
    36. Y_n <= 4'b1110;
    37. end
    38. default: begin
    39. Y_n <= 4'bz;
    40. end
    41. endcase
    42. end
    43. endmodule

    testbench设计

    1. `timescale 1ns/1ns
    2. module tb_encoder_0();
    3. reg [8:0] I_n;
    4. wire [3:0] Y_n;
    5. initial begin
    6. I_n <= 9'd0;
    7. #200
    8. $finsih;
    9. end
    10. always #10 I_n <= {$random} % 10'd512;
    11. encoder_0 inst_encoder_0 (
    12. .I_n(I_n),
    13. .Y_n(Y_n)
    14. );
    15. //verdi
    16. initial begin
    17. $fsdbDumpfile("tb_encoder_0.fsdb");
    18. $fsdbDumpvars(0);
    19. end
    20. endmodule

    仿真测试

    VL14 用优先编码器①实现键盘编码电路

    题目描述

    请使用优先编码器①实现键盘编码电路,可添加并例化题目中已给出的优先编码器代码。

    10个按键分别对应十进制数0-9,按键9的优先级别最高;按键悬空时,按键输出高电平,按键按下时,按键输出低电平;键盘编码电路的输出是8421BCD码。

    要求:键盘编码电路要有工作状态标志,以区分没有按键按下和按键0按下两种情况。

    优先编码器真值表如下图:

    优先编码器代码如下:

    1. module encoder_0(
    2. input [8:0] I_n ,
    3. output reg [3:0] Y_n
    4. );
    5. always @(*) begin
    6. casex(I_n)
    7. 9'b111111111 : Y_n = 4'b1111;
    8. 9'b0xxxxxxxx : Y_n = 4'b0110;
    9. 9'b10xxxxxxx : Y_n = 4'b0111;
    10. 9'b110xxxxxx : Y_n = 4'b1000;
    11. 9'b1110xxxxx : Y_n = 4'b1001;
    12. 9'b11110xxxx : Y_n = 4'b1010;
    13. 9'b111110xxx : Y_n = 4'b1011;
    14. 9'b1111110xx : Y_n = 4'b1100;
    15. 9'b11111110x : Y_n = 4'b1101;
    16. 9'b111111110 : Y_n = 4'b1110;
    17. default : Y_n = 4'b1111;
    18. endcase
    19. end
    20. endmodule

    RTL设计

    1. `timescale 1ns/1ns
    2. module encoder_0(
    3. input [8:0] I_n,
    4. output reg [3:0] Y_n
    5. );
    6. always @(*)begin
    7. casex(I_n)
    8. 9'b111111111 : Y_n = 4'b1111;
    9. 9'b0xxxxxxxx : Y_n = 4'b0110;
    10. 9'b10xxxxxxx : Y_n = 4'b0111;
    11. 9'b110xxxxxx : Y_n = 4'b1000;
    12. 9'b1110xxxxx : Y_n = 4'b1001;
    13. 9'b11110xxxx : Y_n = 4'b1010;
    14. 9'b111110xxx : Y_n = 4'b1011;
    15. 9'b1111110xx : Y_n = 4'b1100;
    16. 9'b11111110x : Y_n = 4'b1101;
    17. 9'b111111110 : Y_n = 4'b1110;
    18. default : Y_n = 4'b1111;
    19. endcase
    20. end
    21. endmodule
    22. module key_encoder(
    23. input [9:0] S_n,
    24. output wire [3:0] L,
    25. output wire GS
    26. );
    27. wire [3:0] L_reg;
    28. encoder_0 inst_encoder_0 (
    29. .I_n(S_n[9:1]),
    30. .Y_n(L_reg)
    31. );
    32. assign L = ~L_reg;
    33. assign GS = ~(&S_n);
    34. endmodule

    testbench 设计

    1. `timescale 1ns/1ns
    2. module tb_encoder_0();
    3. reg [9:0] S_n;
    4. wire [3:0] L;
    5. wire GS;
    6. initial begin
    7. S_n <= 10'b0000_0000_00;
    8. #20
    9. S_n <= 10'b1111_1111_11;
    10. #20
    11. S_n <= 10'b1111_1111_10;
    12. #20
    13. S_n <= 10'b1111_1111_01;
    14. #20
    15. S_n <= 10'b1111_1110_11;
    16. #20
    17. S_n <= 10'b1111_1101_11;
    18. #20
    19. S_n <= 10'b1111_1011_11;
    20. #20
    21. S_n <= 10'b1111_0111_11;
    22. #20
    23. S_n <= 10'b1110_1111_11;
    24. #20
    25. S_n <= 10'b1101_1111_11;
    26. #20
    27. S_n <= 10'b1011_1111_11;
    28. #20
    29. S_n <= 10'b0111_1111_11;
    30. #20
    31. S_n <= 10'b0111_1111_11;
    32. #50
    33. $finish;
    34. end
    35. key_encoder inst_key_encoder(
    36. .S_n (S_n),
    37. .L (L),
    38. .GS (GS)
    39. );
    40. initial begin
    41. $fsdbDumpfile("tb_encoder_0.fsdb");
    42. $fsdbDumpvars(0);
    43. end
    44. endmodule

    仿真测试

    VL15 优先编码器Ⅰ

    题目描述

    下表是8线-3线优先编码器Ⅰ的功能表。

    ①请根据该功能表,用Verilog实现该优先编码器Ⅰ。

    EI

    I[7]

    I[6]

    I[5]

    I[4]

    I[3]

    I[2]

    I[1]

    I[0]

    Y[2]

    Y[1]

    Y[0]

    GS

    EO

    0

    x

    x

    x

    x

    x

    x

    x

    x

    0

    0

    0

    0

    0

    1

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    1

    1

    1

    x

    x

    x

    x

    x

    x

    x

    1

    1

    1

    1

    0

    1

    0

    1

    x

    x

    x

    x

    x

    x

    1

    1

    0

    1

    0

    1

    0

    0

    1

    x

    x

    x

    x

    x

    1

    0

    1

    1

    0

    1

    0

    0

    0

    1

    x

    x

    x

    x

    1

    0

    0

    1

    0

    1

    0

    0

    0

    0

    1

    x

    x

    x

    0

    1

    1

    1

    0

    1

    0

    0

    0

    0

    0

    1

    x

    x

    0

    1

    0

    1

    0

    1

    0

    0

    0

    0

    0

    0

    1

    x

    0

    0

    1

    1

    0

    1

    0

    0

    0

    0

    0

    0

    0

    1

    0

    0

    0

    1

    0

    RTL设计

    1. module encoder_83(
    2. input [7:0] I ,
    3. input EI ,
    4. output wire [2:0] Y ,
    5. output wire GS ,
    6. output wire EO
    7. );
    8. reg [2:0] Y_reg;
    9. always @(I or EI) begin
    10. if (!EI) begin
    11. Y_reg = 3'b000;
    12. end
    13. else begin
    14. casez(I)
    15. 8'b00000000: begin
    16. Y_reg <= 3'b000;
    17. end
    18. 8'b1???????: begin
    19. Y_reg <= 3'b111;
    20. end
    21. 8'b01??????: begin
    22. Y_reg <= 3'b110;
    23. end
    24. 8'b001?????: begin
    25. Y_reg <= 3'b101;
    26. end
    27. 8'b0001????: begin
    28. Y_reg <= 3'b100;
    29. end
    30. 8'b00001???: begin
    31. Y_reg <= 3'b011;
    32. end
    33. 8'b000001??: begin
    34. Y_reg <= 3'b010;
    35. end
    36. 8'b0000001?: begin
    37. Y_reg <= 3'b001;
    38. end
    39. 8'b00000001: begin
    40. Y_reg <= 3'b000;
    41. end
    42. default: begin
    43. Y_reg <= 3'b000;
    44. end
    45. endcase
    46. end
    47. end
    48. assign Y = Y_reg;
    49. assign GS = (EI==1'b0) ? 1'b0 : (((|I) == 1'b0) ? 1'b0 : 1'b1);
    50. assign EO = (EI==1'b0) ? 1'b0 : (~GS);
    51. endmodule

    testbench设计

    1. `timescale 1ns/1ns
    2. module tb_encoder_83();
    3. reg [7:0] I;
    4. reg EI;
    5. wire [2:0] Y;
    6. wire GS;
    7. wire EO;
    8. initial begin
    9. I <= 8'd0;
    10. EI <= 1'b0;
    11. #200
    12. $finish;
    13. end
    14. always #10 I <= {$random} % 9'd256;
    15. always #10 EI <= {$random} % 2'd2;
    16. encoder_83 inst_encoder_83 (
    17. .I (I),
    18. .EI (EI),
    19. .Y (Y),
    20. .GS (GS),
    21. .EO (EO)
    22. );
    23. //fsdb
    24. initial begin
    25. $fsdbDumpfile("tb_encoder_83.fsdb");
    26. $fsdbDumpvars(0);
    27. end
    28. endmodule

    仿真测试

    VL16 使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器

    题目描述

    ②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。

    可将优先编码器Ⅰ的代码添加到本题答案中,并例化。

    RTL 设计

    1. `timescale 1ns/1ns
    2. module encoder_83(
    3. input [7:0] I ,
    4. input EI ,
    5. output wire [2:0] Y ,
    6. output wire GS ,
    7. output wire EO
    8. );
    9. assign Y[2] = EI & (I[7] | I[6] | I[5] | I[4]);
    10. assign Y[1] = EI & (I[7] | I[6] | ~I[5]&~I[4]&I[3] | ~I[5]&~I[4]&I[2]);
    11. assign Y[0] = EI & (I[7] | ~I[6]&I[5] | ~I[6]&~I[4]&I[3] | ~I[6]&~I[4]&~I[2]&I[1]);
    12. assign EO = EI&~I[7]&~I[6]&~I[5]&~I[4]&~I[3]&~I[2]&~I[1]&~I[0];
    13. assign GS = EI&(I[7] | I[6] | I[5] | I[4] | I[3] | I[2] | I[1] | I[0]);
    14. //assign GS = EI&(| I);
    15. endmodule
    16. module encoder_164(
    17. input [15:0] A ,
    18. input EI ,
    19. output wire [3:0] L ,
    20. output wire GS ,
    21. output wire EO
    22. );
    23. wire [2:0] Y0;
    24. wire [2:0] Y1;
    25. wire GS0;
    26. wire GS1;
    27. wire E0_0;
    28. wire E0_1;
    29. encoder_83 inst_encoder_83_0 (
    30. .I(A[7:0]),
    31. .EI(EI),
    32. .Y(Y0),
    33. .GS(GS0),
    34. .EO(EO_0)
    35. );
    36. encoder_83 inst_encoder_83_1 (
    37. .I(A[15:8]),
    38. .EI(EI),
    39. .Y(Y1),
    40. .GS(GS1),
    41. .EO(EO_1)
    42. );
    43. assign L[3] = GS1;
    44. assign L[2] = (L[3]==0) ? Y0[2] : Y1[2];
    45. assign L[1] = (L[3]==0) ? Y0[1] : Y1[1];
    46. assign L[0] = (L[3]==0) ? Y0[0] : Y1[0];
    47. assign GS = GS0 | GS1;
    48. assign EO = EO_0 & EO_1;
    49. endmodule

    testbench 设计

    1. `timescale 1ns/1ns
    2. module tb_encoder_164();
    3. reg [15:0] A ;
    4. reg EI;
    5. wire [3:0] L ;
    6. wire GS;
    7. wire EO;
    8. initial begin
    9. A <= 16'd0;
    10. EI <= 1'b0;
    11. #200
    12. $finish;
    13. end
    14. always #10 A <= {$random} % 17'd65536;
    15. always #10 EI <= {$random} % 2'd2;
    16. encoder_164 encoder_164_inst(
    17. .A (A ),
    18. .EI(EI),
    19. .L (L ),
    20. .GS(GS),
    21. .EO(EO)
    22. );
    23. //fsdb
    24. initial begin
    25. $fsdbDumpfile("tb_encoder_164.fsdb");
    26. $fsdbDumpvars(0);
    27. end
    28. endmodule

    仿真测试

     

    VL17 用3-8译码器实现全减器 

    题目描述

    请使用3-8译码器和必要的逻辑门实现全减器,全减器接口图如下,A是被减数,B是减数,Ci是来自低位的借位,D是差,Co是向高位的借位。

    3-8译码器代码如下,可将参考代码添加并例化到本题答案中。

    RTL 设计

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

    testbench 设计 

    1. `timescale 1ns/1ns
    2. module tb_decoder_38();
    3. reg A;
    4. reg B;
    5. reg Ci;
    6. wire D;
    7. wire Co;
    8. initial begin
    9. A <= 1'd0;
    10. B <= 1'd0;
    11. Ci <= 1'd0;
    12. #200
    13. $finish;
    14. end
    15. always #10 A <= {$random} % 2'd2;
    16. always #10 B <= {$random} % 2'd2;
    17. always #10 Ci <= {$random} % 2'd2;
    18. decoder_38 decoder_38_inst(
    19. .A(A),
    20. .B(B),
    21. .Ci(Ci),
    22. .D(D),
    23. .Co(Co)
    24. );
    25. //fsdb
    26. initial begin
    27. $fsdbDumpfile("tb_decoder_38.fsdb");
    28. $fsdbDumpvars(0);
    29. end
    30. endmodule

    仿真测试

    VL18 实现3-8译码器

    题目描述

    下表是74HC138译码器的功能表。

    E3

    E2_n

    E1_n

    A2

    A1

    A0

    Y0_n

    Y1_n

    Y2_n

    Y3_n

    Y4_n

    Y5_n

    Y6_n

    Y7_n

    x

    1

    x

    x

    x

    x

    1

    1

    1

    1

    1

    1

    1

    1

    x

    x

    1

    x

    x

    x

    1

    1

    1

    1

    1

    1

    1

    1

    0

    x

    x

    x

    x

    x

    1

    1

    1

    1

    1

    1

    1

    1

    1

    0

    0

    0

    0

    0

    0

    1

    1

    1

    1

    1

    1

    1

    1

    0

    0

    0

    0

    1

    1

    0

    1

    1

    1

    1

    1

    1

    1

    0

    0

    0

    1

    0

    1

    1

    0

    1

    1

    1

    1

    1

    1

    0

    0

    0

    1

    1

    1

    1

    1

    0

    1

    1

    1

    1

    1

    0

    0

    1

    0

    0

    1

    1

    1

    1

    0

    1

    1

    1

    1

    0

    0

    1

    0

    1

    1

    1

    1

    1

    1

    0

    1

    1

    1

    0

    0

    1

    1

    0

    1

    1

    1

    1

    1

    1

    0

    1

    1

    0

    0

    1

    1

    1

    1

    1

    1

    1

    1

    1

    0

    ①请用基础门电路实现该译码器电路,用Verilog将电路描述出来。基础门电路包括:非门、多输入与门、多输入或门。

    RTL 设计

    1. module decoder_38(
    2. input E1_n ,
    3. input E2_n ,
    4. input E3 ,
    5. input A0 ,
    6. input A1 ,
    7. input A2 ,
    8. output wire Y0_n ,
    9. output wire Y1_n ,
    10. output wire Y2_n ,
    11. output wire Y3_n ,
    12. output wire Y4_n ,
    13. output wire Y5_n ,
    14. output wire Y6_n ,
    15. output wire Y7_n
    16. );
    17. assign Y0_n = ~(E3 & (~(E2_n | E1_n | A2 | A1 | A0)));
    18. assign Y1_n = ~(E3 & A0 & (~(E2_n | E1_n | A2 | A1)));
    19. assign Y2_n = ~(E3 & A1 & (~(E2_n | E1_n | A2 | A0)));
    20. assign Y3_n = ~(E3 & A1 & A0 & (~(E2_n | E1_n | A2)));
    21. assign Y4_n = ~(E3 & A2 & (~(E2_n | E1_n | A1 | A0)));
    22. assign Y5_n = ~(E3 & A2 & A0 & (~(E2_n | E1_n | A1)));
    23. assign Y6_n = ~(E3 & A2 & A1 & (~(E2_n | E1_n | A0)));
    24. assign Y7_n = ~(E3 & A2 & A1 & A0 & (~(E2_n | E1_n)));
    25. endmodule

    testbench 设计

    1. `timescale 1ns/1ns
    2. module tb_decoder_38();
    3. reg E1_n;
    4. reg E2_n;
    5. reg E3;
    6. reg A0;
    7. reg A1;
    8. reg A2;
    9. wire Y0_n;
    10. wire Y1_n;
    11. wire Y2_n;
    12. wire Y3_n;
    13. wire Y4_n;
    14. wire Y5_n;
    15. wire Y6_n;
    16. wire Y7_n;
    17. initial begin
    18. E1_n <= 1'b0;
    19. E2_n <= 1'b0;
    20. E3 <= 1'b0;
    21. A0 <= 1'b0;
    22. A1 <= 1'b0;
    23. A2 <= 1'b0;
    24. #200
    25. $finish;
    26. end
    27. always #10 E1_n <= {$random} % 2'd2;
    28. always #10 E2_n <= {$random} % 2'd2;
    29. always #10 E3 <= {$random} % 2'd2;
    30. always #10 A0 <= {$random} % 2'd2;
    31. always #10 A1 <= {$random} % 2'd2;
    32. always #10 A2 <= {$random} % 2'd2;
    33. decoder_38 inst_decoder_38 (
    34. .E1_n (E1_n),
    35. .E2_n (E2_n),
    36. .E3 (E3),
    37. .A0 (A0),
    38. .A1 (A1),
    39. .A2 (A2),
    40. .Y0_n (Y0_n),
    41. .Y1_n (Y1_n),
    42. .Y2_n (Y2_n),
    43. .Y3_n (Y3_n),
    44. .Y4_n (Y4_n),
    45. .Y5_n (Y5_n),
    46. .Y6_n (Y6_n),
    47. .Y7_n (Y7_n)
    48. );
    49. //fsdb
    50. initial begin
    51. $fsdbDumpfile("tb_decoder_38.fsdb");
    52. $fsdbDumpvars(0);
    53. end
    54. endmodule

    仿真测试

    VL19 使用3-8译码器①实现逻辑函数

    题目描述

    下表是74HC138译码器的功能表.

    E3

    E2_n

    E1_n

    A2

    A1

    A0

    Y0_n

    Y1_n

    Y2_n

    Y3_n

    Y4_n

    Y5_n

    Y6_n

    Y7_n

    x

    1

    x

    x

    x

    x

    1

    1

    1

    1

    1

    1

    1

    1

    x

    x

    1

    x

    x

    x

    1

    1

    1

    1

    1

    1

    1

    1

    0

    x

    x

    x

    x

    x

    1

    1

    1

    1

    1

    1

    1

    1

    1

    0

    0

    0

    0

    0

    0

    1

    1

    1

    1

    1

    1

    1

    1

    0

    0

    0

    0

    1

    1

    0

    1

    1

    1

    1

    1

    1

    1

    0

    0

    0

    1

    0

    1

    1

    0

    1

    1

    1

    1

    1

    1

    0

    0

    0

    1

    1

    1

    1

    1

    0

    1

    1

    1

    1

    1

    0

    0

    1

    0

    0

    1

    1

    1

    1

    0

    1

    1

    1

    1

    0

    0

    1

    0

    1

    1

    1

    1

    1

    1

    0

    1

    1

    1

    0

    0

    1

    1

    0

    1

    1

    1

    1

    1

    1

    0

    1

    1

    0

    0

    1

    1

    1

    1

    1

    1

    1

    1

    1

    0

    ②请使用3-8译码器①和必要的逻辑门实现函数L=(~A)·C+A·B

    RTL 设计

    1. module decoder_38(
    2. input E1_n ,
    3. input E2_n ,
    4. input E3 ,
    5. input A0 ,
    6. input A1 ,
    7. input A2 ,
    8. output wire Y0_n ,
    9. output wire Y1_n ,
    10. output wire Y2_n ,
    11. output wire Y3_n ,
    12. output wire Y4_n ,
    13. output wire Y5_n ,
    14. output wire Y6_n ,
    15. output wire Y7_n
    16. );
    17. wire E ;
    18. assign E = E3 & ~E2_n & ~E1_n;
    19. assign Y0_n = ~(E & ~A2 & ~A1 & ~A0);
    20. assign Y1_n = ~(E & ~A2 & ~A1 & A0);
    21. assign Y2_n = ~(E & ~A2 & A1 & ~A0);
    22. assign Y3_n = ~(E & ~A2 & A1 & A0);
    23. assign Y4_n = ~(E & A2 & ~A1 & ~A0);
    24. assign Y5_n = ~(E & A2 & ~A1 & A0);
    25. assign Y6_n = ~(E & A2 & A1 & ~A0);
    26. assign Y7_n = ~(E & A2 & A1 & A0);
    27. endmodule
    28. module decoder0(
    29. input A ,
    30. input B ,
    31. input C ,
    32. output wire L
    33. );
    34. wire Y0_n,Y1_n,Y2_n,Y3_n,Y4_n,Y5_n,Y6_n,Y7_n;
    35. decoder_38 inst_decoder_38(
    36. .E1_n (0),
    37. .E2_n (0),
    38. .E3 (1),
    39. .A0 (A),
    40. .A1 (B),
    41. .A2 (C),
    42. .Y0_n (Y0_n),
    43. .Y1_n (Y1_n),
    44. .Y2_n (Y2_n),
    45. .Y3_n (Y3_n),
    46. .Y4_n (Y4_n),
    47. .Y5_n (Y5_n),
    48. .Y6_n (Y6_n),
    49. .Y7_n (Y7_n)
    50. );
    51. assign L = ~Y3_n | ~Y4_n | ~Y6_n | ~Y7_n;
    52. endmodule

    testbench 设计

    1. `timescale 1ns/1ns
    2. module tb_decoder0();
    3. reg A;
    4. reg B;
    5. reg C;
    6. wire L;
    7. initial begin
    8. A <= 1'b1;
    9. B <= 1'b1;
    10. C <= 1'b1;
    11. #200
    12. $finish;
    13. end
    14. always #10 A <= {$random} % 2'd2;
    15. always #10 B <= {$random} % 2'd2;
    16. always #10 C <= {$random} % 2'd2;
    17. decoder0 decoder0_inst(
    18. .A (A),
    19. .B (B),
    20. .C (C),
    21. .L (L)
    22. );
    23. //fsdb
    24. initial begin
    25. $fsdbDumpfile("tb_decoder0.fsdb");
    26. $fsdbDumpvars(0);
    27. end
    28. endmodule

    仿真测试

    VL20 数据选择器实现逻辑电路

    题目描述

    请使用此4选1数据选择器和必要的逻辑门实现下列表达式。

    L=A∙B+A∙~C+B∙C

    数据选择器的逻辑符号如下图:

    数据选择器代码如下,可在本题答案中添加并例化此数据选择器。

    RTL 设计

    1. module data_sel(
    2. input S0 ,
    3. input S1 ,
    4. input D0 ,
    5. input D1 ,
    6. input D2 ,
    7. input D3 ,
    8. output wire Y
    9. );
    10. assign Y = ~S1 & (~S0&D0 | S0&D1) | S1&(~S0&D2 | S0&D3);
    11. endmodule
    12. module sel_exp(
    13. input A ,
    14. input B ,
    15. input C ,
    16. output wire L
    17. );
    18. data_sel luoji(
    19. .S1(A),
    20. .S0(B),
    21. .D0(1'b0),
    22. .D1(C),
    23. .D2(~C),
    24. .D3(1'b1),
    25. .Y(L)
    26. );
    27. endmodule

    testbench 设计

    1. `timescale 1ns/1ns
    2. module tb_sel_exp();
    3. reg A;
    4. reg B;
    5. reg C;
    6. wire L;
    7. initial begin
    8. A <= 1'b0;
    9. B <= 1'b0;
    10. C <= 1'b0;
    11. #200
    12. $finish;
    13. end
    14. always #10 A <= {$random} % 2'd2;
    15. always #10 B <= {$random} % 2'd2;
    16. always #10 C <= {$random} % 2'd2;
    17. sel_exp sel_exp_inst(
    18. .A (A),
    19. .B (B),
    20. .C (C),
    21. .L (L)
    22. );
    23. //fsdb
    24. initial begin
    25. $fsdbDumpfile("tb_sel_exp.fsdb");
    26. $fsdbDumpvars(0);
    27. end
    28. endmodule

    VL21 根据状态转移表实现时序电路

    题目描述

    某同步时序电路转换表如下,请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。

    电路的接口如下图所示。

    RTL 设计 

    1. `timescale 1ns/1ns
    2. module seq_circuit(
    3. input clk,
    4. input rst_n,
    5. input A,
    6. output wire Y
    7. );
    8. reg [1:0] state;
    9. reg [1:0] next_state;
    10. reg Y_reg;
    11. //状态机第一段,状态跳转,时序逻辑
    12. always @(posedge clk or negedge rst_n) begin
    13. if (!rst_n) begin
    14. state <= 2'b00;
    15. end
    16. else begin
    17. state <= next_state;
    18. end
    19. end
    20. //状态机第二段,转移条件,组合逻辑
    21. always @(*) begin
    22. next_state = state;
    23. case(state)
    24. 2'b00: begin
    25. if (A == 1'b1) begin
    26. next_state <= 2'b11;
    27. end
    28. else begin
    29. next_state <= 2'b01;
    30. end
    31. end
    32. 2'b01: begin
    33. if (A == 1'b1) begin
    34. next_state <= 2'b00;
    35. end
    36. else begin
    37. next_state <= 2'b10;
    38. end
    39. end
    40. 2'b10: begin
    41. if (A == 1'b1) begin
    42. next_state <= 2'b01;
    43. end
    44. else begin
    45. next_state <= 2'b11;
    46. end
    47. end
    48. 2'b11: begin
    49. if (A == 1'b1) begin
    50. next_state <= 2'b10;
    51. end
    52. else begin
    53. next_state <= 2'b00;
    54. end
    55. end
    56. default: begin
    57. next_state <= 2'b00;
    58. end
    59. endcase
    60. end
    61. //状态机第三段,结果输出,时序逻辑
    62. always @(posedge clk or negedge rst_n) begin
    63. if (!rst_n) begin
    64. Y_reg <= 1'b0;
    65. end
    66. else if (next_state == 2'b11) begin
    67. Y_reg <= 1'b1;
    68. end
    69. else begin
    70. Y_reg <= 1'b0;
    71. end
    72. end
    73. assign Y = Y_reg;
    74. endmodule

    testbench 设计

    1. `timescale 1ns/1ns
    2. module tb_seq_circuit();
    3. reg clk;
    4. reg rst_n;
    5. reg A;
    6. wire y;
    7. initial begin
    8. clk = 1'b1;
    9. rst_n <= 1'b0;
    10. #20
    11. rst_n <= 1'b1;
    12. #200
    13. $finish;
    14. end
    15. always #5 clk = ~clk;
    16. always #10 A <= {$random} % 2'd2;
    17. seq_circuit inst_seq (
    18. .clk(clk),
    19. .rst_n(rst_n),
    20. .A(A),
    21. .Y(Y)
    22. );
    23. //fsdb
    24. initial begin
    25. $fsdbDumpfile("tb_seq_circuit.fsdb");
    26. $fsdbDumpvars(0);
    27. $fsdbDumpMDA();
    28. end
    29. endmodule

    仿真测试

    VL22 根据状态转移图实现时序电路

    题目描述

    某同步时序电路的状态转换图如下,→上表示“C/Y”,圆圈内为现态,→指向次态。

    请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。

    电路的接口如下图所示,C是单bit数据输入端。 

    RTL 设计

    1. module seq_circuit(
    2. input C,
    3. input clk,
    4. input rst_n,
    5. output Y
    6. );
    7. parameter S0 = 2'b00;
    8. parameter S1 = 2'b01;
    9. parameter S2 = 2'b10;
    10. parameter S3 = 2'b11;
    11. reg [1:0] state;
    12. reg [1:0] next_state;
    13. //状态机第一段,状态跳转,时序逻辑
    14. always @(posedge clk or negedge rst_n) begin
    15. if (!rst_n) begin
    16. state <= S0;
    17. end
    18. else begin
    19. state <= next_state;
    20. end
    21. end
    22. //状态机第二段,条件转移,组合逻辑
    23. always @(*) begin
    24. next_state = state;
    25. case(state)
    26. S0: begin
    27. if (C) begin
    28. next_state = S1;
    29. end
    30. else begin
    31. next_state = S0;
    32. end
    33. end
    34. S1: begin
    35. if (C) begin
    36. next_state = S1;
    37. end
    38. else begin
    39. next_state = S3;
    40. end
    41. end
    42. S2: begin
    43. if (C) begin
    44. next_state = S2;
    45. end
    46. else begin
    47. next_state = S0;
    48. end
    49. end
    50. S3: begin
    51. if (C) begin
    52. next_state = S2;
    53. end
    54. else begin
    55. next_state = S3;
    56. end
    57. end
    58. default: begin
    59. next_state = S0;
    60. end
    61. endcase
    62. end
    63. //状态机第三段,结果输出,组合逻辑
    64. assign Y = ((state==S2) && (C == 1'b1)) || (state == S3);
    65. endmodule

    testbench 设计

    1. `timescale 1ns/1ns
    2. module tb_seq_circuit();
    3. reg C;
    4. reg clk;
    5. reg rst_n;
    6. wire Y;
    7. initial begin
    8. clk = 1'b1;
    9. rst_n = 1'b0;
    10. #20
    11. rst_n = 1'b1;
    12. #200
    13. $finish;
    14. end
    15. always #5 clk = ~clk;
    16. always #10 C <= {$random} % 2'd2;
    17. seq_circuit inst_seq (
    18. .C (C),
    19. .clk (clk),
    20. .rst_n (rst_n),
    21. .Y (Y)
    22. );
    23. initial begin
    24. $fsdbDumpfile("tb_seq_circuit.fsdb");
    25. $fsdbDumpvars(0);
    26. $fsdbDumpMDA ();
    27. end
    28. endmodule

    VL23 ROM的简单实现

    题目描述

    实现一个深度为8,位宽为4bit的ROM,数据初始化为0,2,4,6,8,10,12,14。可以通过输入地址addr,输出相应的数据data。

    接口信号图如下:

    使用Verilog HDL实现以上功能并编写testbench验证。

    RTL 设计

    1. module rom(
    2. input clk,
    3. input rst_n,
    4. input [7:0] addr,
    5. output [3:0] data
    6. );
    7. reg [3:0] rom [7:0];
    8. reg [3:0] data_reg;
    9. integer i;
    10. initial begin
    11. for (i=0;i<8;i=i+1) begin
    12. rom[i] = i*2;
    13. end
    14. end
    15. always @(*) begin
    16. if (!rst_n) begin
    17. data_reg <= 4'd0;
    18. end
    19. else begin
    20. data_reg <= rom[addr];
    21. end
    22. end
    23. assign data = data_reg;
    24. endmodule

    testbench 设计

    1. `timescale 1ns/1ns
    2. module tb_rom();
    3. reg clk;
    4. reg rst_n;
    5. reg [7:0] addr;
    6. wire [3:0] data;
    7. initial begin
    8. clk = 1'b1;
    9. rst_n <= 1'b0;
    10. #20
    11. rst_n <= 1'b1;
    12. #200
    13. $finish;
    14. end
    15. always #5 clk = ~clk;
    16. always #10 addr <= {$random} % 4'd8;
    17. rom inst_rom (
    18. .clk (clk),
    19. .rst_n (rst_n),
    20. .addr (addr),
    21. .data (data)
    22. );
    23. //fsdb
    24. initial begin
    25. $fsdbDumpfile("tb_rom.fsdb");
    26. $fsdbDumpvars(0);
    27. $fsdbDumpMDA();
    28. end
    29. endmodule

    VL24 边沿检测

    题目描述

    有一个缓慢变化的1bit信号a,编写一个程序检测a信号的上升沿给出指示信号rise,当a信号出现下降沿时给出指示信号down。
    注:rise,down应为单脉冲信号,在相应边沿出现时的下一个时钟为高,之后恢复到0,一直到再一次出现相应的边沿。

    使用Verilog HDL实现以上功能并编写testbench验证。

    RTL 设计

    1. module edge_detect(
    2. input clk,
    3. input rst_n,
    4. input a,
    5. output reg rise,
    6. output reg down
    7. );
    8. reg a_reg;
    9. wire pulse;
    10. always @(posedge clk or negedge rst_n) begin
    11. if (!rst_n) begin
    12. a_reg <= 1'b0;
    13. end
    14. else begin
    15. a_reg <= a;
    16. end
    17. end
    18. assign pulse = a ^ a_reg;
    19. always @(posedge clk or negedge rst_n) begin
    20. if (!rst_n) begin
    21. rise <= 1'b0;
    22. down <= 1'b0;
    23. end
    24. else if (pulse && a) begin
    25. rise <= 1'b1;
    26. end
    27. else if (pulse && ~a) begin
    28. down <= 1'b1;
    29. end
    30. else begin
    31. rise <= 1'b0;
    32. down <= 1'b0;
    33. end
    34. end
    35. endmodule

    testbench 设计

    1. `timescale 1ns/1ns
    2. module tb_edge_detect();
    3. reg clk ;
    4. reg rst_n;
    5. reg a ;
    6. wire rise ;
    7. wire down ;
    8. initial begin
    9. clk = 1'b1;
    10. rst_n <= 1'b0;
    11. a <= 1'b0;
    12. #20
    13. rst_n <= 1'b1;
    14. #20
    15. a <= 1'b1;
    16. #20
    17. a <= 1'b0;
    18. #30
    19. a <= 1'b1;
    20. #40
    21. a <= 1'b0;
    22. #20
    23. a <= 1'b1;
    24. #20
    25. a <= 1'b0;
    26. #20
    27. $finish;
    28. end
    29. always #5 clk = ~clk;
    30. edge_detect inst_edge_detect (
    31. .clk (clk),
    32. .rst_n (rst_n),
    33. .a (a),
    34. .rise (rise),
    35. .down (down)
    36. );
    37. //fsdb
    38. initial begin
    39. $fsdbDumpfile("tb_edge_detect.fsdb");
    40. $fsdbDumpvars(0);
    41. $fsdbDumpMDA();
    42. end
    43. endmodule

  • 相关阅读:
    NOIP 2010 普及组初赛 第28题 过河问题
    uniapp自定义右击菜单
    Kafka - 10 Kafka副本 | 分区副本分配 | 手动调整分区副本 | Leader Partition 负载平衡 | 增加副本因子
    【算法题】反转链表(头插法、C++实现、力扣第206题、剑指offer第24题)
    解决plt.imshow()不显示图片cv2.imshw()不显示图片
    cocosCreator 之 3.x使用NodePool对象池和封装
    【Vue.js】条件渲染和列表渲染以及Vue中key值的内部原理
    Cy3 PEG N-羟基琥珀酰亚胺,荧光染料CY3标记聚乙二醇修饰N-羟基琥珀酰亚胺,Cy3-PEG-N-Hydroxy succinimide
    阿里面试官问的 Redis 太刁钻,索性整理出所有大厂的 Redis 面试题,拿下麻烦的面试官
    Python模块和包
  • 原文地址:https://blog.csdn.net/m0_61298445/article/details/127706042