• ALU——调用加法乘法模块


    只调用加法模块的仿真图:

    (注:alu_control 为十六进制

    001高位加载 src2的低16位加载到高16位上

    002算数右移 src1算数右移  (高位补1)

    004逻辑右移 src1逻辑右移 (逻辑右移直接补0)

    008逻辑左移 src1逻辑左移

    010异或 020或 040或非 080与

    100 无符号比较 小于置位

    200 有符号比较 小于置位

    400 减法

    800 加法

    没有调用乘法器的ALU (下面那个调用了)

     alu.v

    1. `timescale 1ns / 1ps
    2. module alu(
    3. input [11:0] alu_control,
    4. input [31:0] alu_src1,
    5. input [31:0] alu_src2,
    6. output [31:0] alu_result
    7. );
    8. reg [31:0] alu_result;
    9. wire alu_add; //加法
    10. wire alu_sub; //减法
    11. wire alu_slt; //有符号比较,小于置位
    12. wire alu_sltu; //无符号比较,小于置位
    13. wire alu_and; //按位与
    14. wire alu_nor; //按位或非
    15. wire alu_or; //按位或
    16. wire alu_xor; //按位异或
    17. wire alu_sll; //逻辑左移
    18. wire alu_srl; //逻辑右移
    19. wire alu_sra; //算数右移
    20. wire alu_lui; //高位加载
    21. assign alu_mult = alu_control[11];
    22. assign alu_add = alu_control[11];
    23. assign alu_sub = alu_control[10];
    24. assign alu_slt = alu_control[ 9];
    25. assign alu_sltu = alu_control[ 8];
    26. assign alu_and = alu_control[ 7];
    27. assign alu_nor = alu_control[ 6];
    28. assign alu_or = alu_control[ 5];
    29. assign alu_xor = alu_control[ 4];
    30. assign alu_sll = alu_control[ 3];
    31. assign alu_srl = alu_control[ 2];
    32. assign alu_sra = alu_control[ 1];
    33. assign alu_lui = alu_control[ 0];
    34. wire [31:0] add_sub_result; //加减结果,减法用加法来实现
    35. wire [31:0] slt_result; //
    36. wire [31:0] sltu_result; //
    37. wire [31:0] and_result;
    38. wire [31:0] nor_result;
    39. wire [31:0] or_result;
    40. wire [31:0] xor_result;
    41. wire [31:0] sll_result;
    42. wire [31:0] srl_result;
    43. wire [31:0] sra_result;
    44. wire [31:0] lui_result;
    45. wire signed [31:0] temp_src1; //带符号数的临时变量
    46. assign temp_src1 = alu_src1; //方便后面对alu_src1进行算数右移
    47. assign and_result = alu_src1 & alu_src2; //按位与
    48. assign or_result = alu_src1 | alu_src2; //按位或
    49. assign nor_result = ~or_result; //或非
    50. assign xor_result = alu_src1 ^ alu_src2; //异或
    51. assign lui_result = {alu_src2[15:0], 16'd0}; //高位加载,第二个操作数的低十六位加载到高十六位上
    52. assign sll_result = alu_src1 << alu_src2; //逻辑左移
    53. assign srl_result = alu_src1 >> alu_src2; //逻辑右移
    54. assign slt_result = adder_result[31] ? 1'b1 : 1'b0; // 带符号数小于置位
    55. assign sltu_result = adder_cout ? 1'b0 : 1'b1; //无符号数小于置位
    56. assign sra_result = temp_src1 >>> alu_src2; //算数右移
    57. wire [31:0] adder_operand1;
    58. wire [31:0] adder_operand2;
    59. wire adder_cin ;
    60. wire [31:0] adder_result ;
    61. wire adder_cout ;
    62. assign adder_operand1 = alu_src1;
    63. assign adder_operand2 = alu_add ? alu_src2 : ~alu_src2; //默认进行减法,为slt和sltu服务
    64. assign adder_cin = ~alu_add; //巧妙到我都以为代码有bug
    65. adder adder_module( //调用加法模块
    66. .A(adder_operand1),
    67. .B(adder_operand2),
    68. .Cin (adder_cin ),
    69. .S (adder_result ),
    70. .Cout (adder_cout )
    71. );
    72. assign add_sub_result = adder_result;
    73. always@(*)
    74. begin
    75. if(alu_add | alu_sub)
    76. alu_result <= add_sub_result;
    77. else if(alu_slt)
    78. alu_result <= slt_result;
    79. else if(alu_sltu)
    80. alu_result <= sltu_result;
    81. else if(alu_and)
    82. alu_result <= and_result;
    83. else if(alu_nor)
    84. alu_result <= nor_result;
    85. else if(alu_or)
    86. alu_result <= or_result;
    87. else if(alu_xor)
    88. alu_result <= xor_result;
    89. else if(alu_sll)
    90. alu_result <= sll_result;
    91. else if(alu_srl)
    92. alu_result <= srl_result;
    93. else if(alu_sra)
    94. alu_result <= sra_result;
    95. else if(alu_lui)
    96. alu_result <= lui_result;
    97. end
    98. endmodule

    testbench.v 

    1. `timescale 1ns / 1ps
    2. module tb;
    3. // Inputs
    4. reg clk;
    5. reg [11:0] alu_control;
    6. reg [31:0] alu_src1;
    7. reg [31:0] alu_src2;
    8. // Outputs
    9. wire [31:0] alu_result;
    10. // Instantiate the Unit Under Test (UUT)
    11. //alu al(
    12. // input [11:0] alu_control,
    13. // input [31:0] alu_src1,
    14. // input [31:0] alu_src2,
    15. // output [31:0] alu_result
    16. // );
    17. alu alu_module(
    18. .alu_control(alu_control),
    19. .alu_src1 (alu_src1 ),
    20. .alu_src2 (alu_src2 ),
    21. .alu_result (alu_result )
    22. );
    23. initial begin
    24. // Initialize Inputs
    25. clk = 0;
    26. alu_control = 0;
    27. alu_src1 = 32'H10001111;
    28. alu_src2 = 32'H00000004;
    29. // Wait 100 ns for global reset to finish
    30. #100;
    31. alu_control = 12'b0000_0000_0001;
    32. #400;
    33. alu_control = 12'b0000_0000_0010;
    34. #500;
    35. alu_control = 12'b0000_0000_0100;
    36. #400;
    37. alu_control = 12'b0000_0000_1000;
    38. #500;
    39. alu_control = 12'b0000_0001_0000;
    40. #400;
    41. alu_control = 12'b0000_0010_0000;
    42. #500;
    43. alu_control = 12'b0000_0100_0000;
    44. #400;
    45. alu_control = 12'b0000_1000_0000;
    46. #400;
    47. alu_control = 12'b0001_0000_0000;
    48. #400;
    49. alu_control = 12'b0010_0000_0000;
    50. #400;
    51. alu_control = 12'b0100_0000_0000;
    52. #400;
    53. alu_control = 12'b1000_0000_0000;
    54. // Add stimulus here
    55. end
    56. always #5 clk = ~clk;
    57. endmodule

     alu_display.v

    1. module alu_display(
    2. //时钟与复位信号
    3. input clk,
    4. input resetn, //后缀"n"代表低电平有效
    5. //拨码开关,用于选择输入数
    6. input [1:0] input_sel, //00:输入为控制信号(alu_control)
    7. //10:输入为源操作数1(alu_src1)
    8. //11:输入为源操作数2(alu_src2)
    9. //触摸屏相关接口,不需要更改
    10. output lcd_rst,
    11. output lcd_cs,
    12. output lcd_rs,
    13. output lcd_wr,
    14. output lcd_rd,
    15. inout[15:0] lcd_data_io,
    16. output lcd_bl_ctr,
    17. inout ct_int,
    18. inout ct_sda,
    19. output ct_scl,
    20. output ct_rstn
    21. );
    22. //-----{调用ALU模块}begin
    23. reg [11:0] alu_control; // ALU控制信号
    24. reg [31:0] alu_src1; // ALU操作数1
    25. reg [31:0] alu_src2; // ALU操作数2
    26. wire [31:0] alu_result; // ALU结果
    27. alu alu_module(
    28. .alu_control(alu_control),
    29. .alu_src1 (alu_src1 ),
    30. .alu_src2 (alu_src2 ),
    31. .alu_result (alu_result )
    32. );
    33. //-----{调用ALU模块}end
    34. //---------------------{调用触摸屏模块}begin--------------------//
    35. //-----{实例化触摸屏}begin
    36. //此小节不需要更改
    37. reg display_valid;
    38. reg [39:0] display_name;
    39. reg [31:0] display_value;
    40. wire [5 :0] display_number;
    41. wire input_valid;
    42. wire [31:0] input_value;
    43. lcd_module lcd_module(
    44. .clk (clk ), //10Mhz
    45. .resetn (resetn ),
    46. //调用触摸屏的接口
    47. .display_valid (display_valid ),
    48. .display_name (display_name ),
    49. .display_value (display_value ),
    50. .display_number (display_number),
    51. .input_valid (input_valid ),
    52. .input_value (input_value ),
    53. //lcd触摸屏相关接口,不需要更改
    54. .lcd_rst (lcd_rst ),
    55. .lcd_cs (lcd_cs ),
    56. .lcd_rs (lcd_rs ),
    57. .lcd_wr (lcd_wr ),
    58. .lcd_rd (lcd_rd ),
    59. .lcd_data_io (lcd_data_io ),
    60. .lcd_bl_ctr (lcd_bl_ctr ),
    61. .ct_int (ct_int ),
    62. .ct_sda (ct_sda ),
    63. .ct_scl (ct_scl ),
    64. .ct_rstn (ct_rstn )
    65. );
    66. //-----{实例化触摸屏}end
    67. //-----{从触摸屏获取输入}begin
    68. //根据实际需要输入的数修改此小节,
    69. //建议对每一个数的输入,编写单独一个always块
    70. //input_sel为00时,表示输入数控制信号,即alu_control
    71. always @(posedge clk)
    72. begin
    73. if (!resetn)
    74. begin
    75. alu_control <= 12'd0;
    76. end
    77. else if (input_valid && input_sel==2'b00)
    78. begin
    79. alu_control <= input_value[11:0];
    80. end
    81. end
    82. //input_sel为10时,表示输入数为源操作数1,即alu_src1
    83. always @(posedge clk)
    84. begin
    85. if (!resetn)
    86. begin
    87. alu_src1 <= 32'd0;
    88. end
    89. else if (input_valid && input_sel==2'b10)
    90. begin
    91. alu_src1 <= input_value;
    92. end
    93. end
    94. //input_sel为11时,表示输入数为源操作数2,即alu_src2
    95. always @(posedge clk)
    96. begin
    97. if (!resetn)
    98. begin
    99. alu_src2 <= 32'd0;
    100. end
    101. else if (input_valid && input_sel==2'b11)
    102. begin
    103. alu_src2 <= input_value;
    104. end
    105. end
    106. //-----{从触摸屏获取输入}end
    107. //-----{输出到触摸屏显示}begin
    108. //根据需要显示的数修改此小节,
    109. //触摸屏上共有44块显示区域,可显示4432位数据
    110. //44块显示区域从1开始编号,编号为1~44
    111. always @(posedge clk)
    112. begin
    113. case(display_number)
    114. 6'd1 :
    115. begin
    116. display_valid <= 1'b1;
    117. display_name <= "SRC_1";
    118. display_value <= alu_src1;
    119. end
    120. 6'd2 :
    121. begin
    122. display_valid <= 1'b1;
    123. display_name <= "SRC_2";
    124. display_value <= alu_src2;
    125. end
    126. 6'd3 :
    127. begin
    128. display_valid <= 1'b1;
    129. display_name <= "CONTR";
    130. display_value <={20'd0, alu_control};
    131. end
    132. 6'd4 :
    133. begin
    134. display_valid <= 1'b1;
    135. display_name <= "RESUL";
    136. display_value <= alu_result;
    137. end
    138. default :
    139. begin
    140. display_valid <= 1'b0;
    141. display_name <= 40'd0;
    142. display_value <= 32'd0;
    143. end
    144. endcase
    145. end
    146. //-----{输出到触摸屏显示}end
    147. //----------------------{调用触摸屏模块}end---------------------//
    148. endmodule

    调用乘法器的ALU(代码扔到末尾)

     这里结果我不知道怎么只显示希望的结果(出现了0,这个是个过程值,当时做乘法器的时候,看仿真的时候是配合着mult_end信号看的,我也不会把这个end信号调出来)


    slt sltu没看明白:(手册里有以后看 挖坑)

     指令(SLT,SLTI,SLTU,SLTIU)比较两个操作数然后设置目的寄存器,

                                                    如果就设置为1,否则就将目的寄存器设置为0。


    alu.v

    1. `timescale 1ns / 1ps
    2. module alu(
    3. input clk,
    4. input [12:0] alu_control,
    5. input [31:0] alu_src1,
    6. input [31:0] alu_src2,
    7. output [31:0] alu_result
    8. );
    9. reg [31:0] alu_result;
    10. wire alu_mul;//乘法
    11. wire alu_add; //加法
    12. wire alu_sub; //减法
    13. wire alu_slt; //有符号比较,小于置位
    14. wire alu_sltu; //无符号比较,小于置位
    15. wire alu_and; //按位与
    16. wire alu_nor; //按位或非
    17. wire alu_or; //按位或
    18. wire alu_xor; //按位异或
    19. wire alu_sll; //逻辑左移
    20. wire alu_srl; //逻辑右移
    21. wire alu_sra; //算数右移
    22. wire alu_lui; //高位加载
    23. assign alu_mul = alu_control[12];
    24. assign alu_add = alu_control[11];
    25. assign alu_sub = alu_control[10];
    26. assign alu_slt = alu_control[ 9];
    27. assign alu_sltu = alu_control[ 8];
    28. assign alu_and = alu_control[ 7];
    29. assign alu_nor = alu_control[ 6];
    30. assign alu_or = alu_control[ 5];
    31. assign alu_xor = alu_control[ 4];
    32. assign alu_sll = alu_control[ 3];
    33. assign alu_srl = alu_control[ 2];
    34. assign alu_sra = alu_control[ 1];
    35. assign alu_lui = alu_control[ 0];
    36. wire [31:0] mul_result;
    37. wire [31:0] add_sub_result; //加减结果,减法用加法来实现
    38. wire [31:0] slt_result;
    39. wire [31:0] sltu_result;
    40. wire [31:0] and_result;
    41. wire [31:0] nor_result;
    42. wire [31:0] or_result;
    43. wire [31:0] xor_result;
    44. wire [31:0] sll_result;
    45. wire [31:0] srl_result;
    46. wire [31:0] sra_result;
    47. wire [31:0] lui_result;
    48. wire signed [31:0] temp_src1; //带符号数的临时变量
    49. assign temp_src1 = alu_src1; //方便后面对alu_src1进行算数右移
    50. assign and_result = alu_src1 & alu_src2; //按位与
    51. assign or_result = alu_src1 | alu_src2; //按位或
    52. assign nor_result = ~or_result; //或非
    53. assign xor_result = alu_src1 ^ alu_src2; //异或
    54. assign lui_result = {alu_src2[15:0], 16'd0}; //高位加载,第二个操作数的低十六位加载到高十六位上
    55. assign sll_result = alu_src1 << alu_src2; //逻辑左移
    56. assign srl_result = alu_src1 >> alu_src2; //逻辑右移
    57. assign slt_result = adder_result[31] ? 1'b1 : 1'b0; // 带符号数小于置位
    58. assign sltu_result = adder_cout ? 1'b0 : 1'b1; //无符号数小于置位
    59. assign sra_result = temp_src1 >>> alu_src2; //算数右移
    60. wire [31:0] adder_operand1;
    61. wire [31:0] adder_operand2;
    62. wire adder_cin ;
    63. wire [31:0] adder_result ;
    64. wire adder_cout ;
    65. assign adder_operand1 = alu_src1;
    66. assign adder_operand2 = alu_add ? alu_src2 : ~alu_src2; //默认进行减法,为slt和sltu服务
    67. assign adder_cin = ~alu_add; //巧妙到我都以为代码有bug
    68. adder adder_module( //调用加法模块
    69. .A(adder_operand1),
    70. .B(adder_operand2),
    71. .Cin (adder_cin ),
    72. .S (adder_result ),
    73. .Cout (adder_cout )
    74. );
    75. assign add_sub_result = adder_result;
    76. wire clk; // 时钟
    77. // wire mult_begin; // 乘法开始信号
    78. wire [31:0] mult_op1; // 乘法源操作数1
    79. wire [31:0] mult_op2; // 乘法源操作数2
    80. wire [63:0] product; // 乘积
    81. wire mult_end ; // 乘法结束信号
    82. assign mult_op1 = alu_src1;
    83. assign mult_op2 =alu_src2;
    84. assign mult_begin=1;
    85. multiply multiply_module//调用乘法模块
    86. (
    87. .clk(clk),
    88. .mult_begin(mult_begin),
    89. .mult_op1 (alu_src1 ),
    90. .mult_op2 (alu_src2 ),
    91. .product ( product ),
    92. .mult_end ()
    93. );
    94. assign mul_result =product ;
    95. always@(*)
    96. begin
    97. if(alu_add | alu_sub)
    98. alu_result <= add_sub_result;
    99. else if(alu_mul)
    100. alu_result =mul_result;
    101. else if(alu_slt)
    102. alu_result <= slt_result;
    103. else if(alu_sltu)
    104. alu_result <= sltu_result;
    105. else if(alu_and)
    106. alu_result <= and_result;
    107. else if(alu_nor)
    108. alu_result <= nor_result;
    109. else if(alu_or)
    110. alu_result <= or_result;
    111. else if(alu_xor)
    112. alu_result <= xor_result;
    113. else if(alu_sll)
    114. alu_result <= sll_result;
    115. else if(alu_srl)
    116. alu_result <= srl_result;
    117. else if(alu_sra)
    118. alu_result <= sra_result;
    119. else if(alu_lui)
    120. alu_result <= lui_result;
    121. end
    122. endmodule

    alu.display (就改了个信号数组的范围)

    1. module alu_display(
    2. //时钟与复位信号
    3. input clk,
    4. input resetn, //后缀"n"代表低电平有效
    5. //拨码开关,用于选择输入数
    6. input [1:0] input_sel, //00:输入为控制信号(alu_control)
    7. //10:输入为源操作数1(alu_src1)
    8. //11:输入为源操作数2(alu_src2)
    9. //触摸屏相关接口,不需要更改
    10. output lcd_rst,
    11. output lcd_cs,
    12. output lcd_rs,
    13. output lcd_wr,
    14. output lcd_rd,
    15. inout[15:0] lcd_data_io,
    16. output lcd_bl_ctr,
    17. inout ct_int,
    18. inout ct_sda,
    19. output ct_scl,
    20. output ct_rstn
    21. );
    22. //-----{调用ALU模块}begin
    23. reg [12:0] alu_control; // ALU控制信号
    24. reg [31:0] alu_src1; // ALU操作数1
    25. reg [31:0] alu_src2; // ALU操作数2
    26. wire [31:0] alu_result; // ALU结果
    27. alu alu_module(
    28. .alu_control(alu_control),
    29. .alu_src1 (alu_src1 ),
    30. .alu_src2 (alu_src2 ),
    31. .alu_result (alu_result )
    32. );
    33. //-----{调用ALU模块}end
    34. //---------------------{调用触摸屏模块}begin--------------------//
    35. //-----{实例化触摸屏}begin
    36. //此小节不需要更改
    37. reg display_valid;
    38. reg [39:0] display_name;
    39. reg [31:0] display_value;
    40. wire [5 :0] display_number;
    41. wire input_valid;
    42. wire [31:0] input_value;
    43. lcd_module lcd_module(
    44. .clk (clk ), //10Mhz
    45. .resetn (resetn ),
    46. //调用触摸屏的接口
    47. .display_valid (display_valid ),
    48. .display_name (display_name ),
    49. .display_value (display_value ),
    50. .display_number (display_number),
    51. .input_valid (input_valid ),
    52. .input_value (input_value ),
    53. //lcd触摸屏相关接口,不需要更改
    54. .lcd_rst (lcd_rst ),
    55. .lcd_cs (lcd_cs ),
    56. .lcd_rs (lcd_rs ),
    57. .lcd_wr (lcd_wr ),
    58. .lcd_rd (lcd_rd ),
    59. .lcd_data_io (lcd_data_io ),
    60. .lcd_bl_ctr (lcd_bl_ctr ),
    61. .ct_int (ct_int ),
    62. .ct_sda (ct_sda ),
    63. .ct_scl (ct_scl ),
    64. .ct_rstn (ct_rstn )
    65. );
    66. //-----{实例化触摸屏}end
    67. //-----{从触摸屏获取输入}begin
    68. //根据实际需要输入的数修改此小节,
    69. //建议对每一个数的输入,编写单独一个always块
    70. //input_sel为00时,表示输入数控制信号,即alu_control
    71. always @(posedge clk)
    72. begin
    73. if (!resetn)
    74. begin
    75. alu_control <= 12'd0;
    76. end
    77. else if (input_valid && input_sel==2'b00)
    78. begin
    79. alu_control <= input_value[11:0];
    80. end
    81. end
    82. //input_sel为10时,表示输入数为源操作数1,即alu_src1
    83. always @(posedge clk)
    84. begin
    85. if (!resetn)
    86. begin
    87. alu_src1 <= 32'd0;
    88. end
    89. else if (input_valid && input_sel==2'b10)
    90. begin
    91. alu_src1 <= input_value;
    92. end
    93. end
    94. //input_sel为11时,表示输入数为源操作数2,即alu_src2
    95. always @(posedge clk)
    96. begin
    97. if (!resetn)
    98. begin
    99. alu_src2 <= 32'd0;
    100. end
    101. else if (input_valid && input_sel==2'b11)
    102. begin
    103. alu_src2 <= input_value;
    104. end
    105. end
    106. //-----{从触摸屏获取输入}end
    107. //-----{输出到触摸屏显示}begin
    108. //根据需要显示的数修改此小节,
    109. //触摸屏上共有44块显示区域,可显示4432位数据
    110. //44块显示区域从1开始编号,编号为1~44
    111. always @(posedge clk)
    112. begin
    113. case(display_number)
    114. 6'd1 :
    115. begin
    116. display_valid <= 1'b1;
    117. display_name <= "SRC_1";
    118. display_value <= alu_src1;
    119. end
    120. 6'd2 :
    121. begin
    122. display_valid <= 1'b1;
    123. display_name <= "SRC_2";
    124. display_value <= alu_src2;
    125. end
    126. 6'd3 :
    127. begin
    128. display_valid <= 1'b1;
    129. display_name <= "CONTR";
    130. display_value <={20'd0, alu_control};
    131. end
    132. 6'd4 :
    133. begin
    134. display_valid <= 1'b1;
    135. display_name <= "RESUL";
    136. display_value <= alu_result;
    137. end
    138. default :
    139. begin
    140. display_valid <= 1'b0;
    141. display_name <= 40'd0;
    142. display_value <= 32'd0;
    143. end
    144. endcase
    145. end
    146. //-----{输出到触摸屏显示}end
    147. //----------------------{调用触摸屏模块}end---------------------//
    148. endmodule

    testbench.v

    1. `timescale 1ns / 1ps
    2. module tb;
    3. // Inputs
    4. reg clk;
    5. reg [12:0] alu_control;
    6. reg [31:0] alu_src1;
    7. reg [31:0] alu_src2;
    8. // Outputs
    9. wire [31:0] alu_result;
    10. // Instantiate the Unit Under Test (UUT)
    11. //alu al(
    12. // input [11:0] alu_control,
    13. // input [31:0] alu_src1,
    14. // input [31:0] alu_src2,
    15. // output [31:0] alu_result
    16. // );
    17. alu alu_module(
    18. .clk(clk),
    19. .alu_control(alu_control),
    20. .alu_src1 (alu_src1 ),
    21. .alu_src2 (alu_src2 ),
    22. .alu_result (alu_result )
    23. );
    24. initial begin
    25. // Initialize Inputs
    26. clk = 0;
    27. alu_control = 0;
    28. alu_src1 = 32'H10001111;
    29. alu_src2 = 32'H00000004;
    30. // Wait 100 ns for global reset to finish
    31. #100;
    32. alu_control = 13'b00000_0000_0001;
    33. #400;
    34. alu_control = 13'b00000_0000_0010;
    35. #500;
    36. alu_control = 13'b00000_0000_0100;
    37. #400;
    38. alu_control = 13'b00000_0000_1000;
    39. #500;
    40. alu_control = 13'b00000_0001_0000;
    41. #400;
    42. alu_control = 13'b00000_0010_0000;
    43. #500;
    44. alu_control = 13'b00000_0100_0000;
    45. #400;
    46. alu_control = 13'b00000_1000_0000;
    47. #400;
    48. alu_control = 13'b00001_0000_0000;
    49. #400;
    50. alu_control = 13'b00010_0000_0000;
    51. #400;
    52. alu_control = 13'b00100_0000_0000;
    53. #400;
    54. alu_control = 13'b01000_0000_0000;
    55. #400;
    56. alu_control = 13'b10000_0000_0000;
    57. // Add stimulus here
    58. end
    59. always #5 clk = ~clk;
    60. endmodule

    multiply.v 和 add.v 之前的记录里有。


     

             一般认为“>>>”在Verilog里是算术右移指令,但实操中发现它有时会在右移时仍然补零,即使符号位为1。这是因为“>>>”会先判断这个操作数是否有符号数。如果是无符号数,则补零,是有符号数,才会补符号位。而一般使用的reg operand; 这种变量定义法默认所定义的变量为无符号数,因此只补零。

    Result = operandB >>> operandA;  //错误示范

        解决办法是利用Verilog的内置函数$signed(),将被移位的操作数转为有符号数类型。

    Result = ($signed(operandB)) >>> operandA;  //更正后

  • 相关阅读:
    XV6源码阅读——进程地址空间
    自己整理博哥爱运维0817-----k8s集成GitLab流水线---md文档
    Windows10电脑音频出现故障【开机小喇叭突然变红叉,我成功解决的方法】
    金仓数据库 KingbaseES V8.3至V8.6迁移最佳实践(2. KingbaseES V8.3和 V8.6 兼容性)
    猫头虎博主第5️⃣期赠书活动:《Java官方编程手册(第12版·Java 17)套装上下册》
    git提交设置忽略指定文件,文件夹
    Stream流使用——(未完)
    用DIV+CSS技术设计的网页与实现制作【体育文化】dreamweaver学生网页设计
    【MySQL】【牛客-SQL进阶挑战】06 其他常用操作
    两APP通信之AIDL使用。
  • 原文地址:https://blog.csdn.net/nahnah_/article/details/128003344