• 牛客刷题<32~34>非整数倍数和整数倍数数据位宽转换


    解题方法:先分析倍数关系,确定需要几次转换,且先到的数据要置于输出的高位,再把每次未传输完的数据锁存起来,在下一个时钟周期继续进行传输,且剩下的数据也要置于高位,然后继续补充输入。此时数据输出有效。

    8to16 刚好转换两次

    1. `timescale 1ns/1ns
    2. module width_8to16(
    3. input clk ,
    4. input rst_n ,
    5. input valid_in ,
    6. input [7:0] data_in ,
    7. output reg valid_out,
    8. output reg [15:0] data_out
    9. );
    10. reg cnt;
    11. always@(posedge clk or negedge rst_n)begin
    12. if(!rst_n)
    13. cnt <= 1'b0;
    14. else begin
    15. if(valid_in)begin
    16. cnt <= cnt + 1'b1;
    17. end
    18. end
    19. end
    20. reg [7:0] data_reg;
    21. always@(posedge clk or negedge rst_n)begin
    22. if(!rst_n)begin
    23. data_out <= 16'b0;
    24. valid_out <= 1'b0;
    25. end
    26. else begin
    27. if(valid_in)begin
    28. if(cnt == 1'b0)begin
    29. data_reg <= data_in;
    30. valid_out <= 1'b0;
    31. end
    32. else begin
    33. data_out <= {data_reg,data_in};//先到的数据置于输出数据的高位,后到的置于低位
    34. valid_out <= 1'b1;
    35. end
    36. end
    37. else begin
    38. valid_out <= 1'b0;
    39. end
    40. end
    41. end
    42. endmodule

    8to12  注释非常好,易于理解

    1. `timescale 1ns/1ns
    2. module width_8to12(
    3. input clk,
    4. input rst_n,
    5. input valid_in,
    6. input [7:0] data_in,
    7. output reg valid_out,
    8. output reg [11:0] data_out
    9. );
    10. reg [1:0] cnt;
    11. always@(posedge clk or negedge rst_n)begin
    12. if(!rst_n)
    13. cnt <= 2'b0;
    14. else if(valid_in)begin
    15. if(cnt == 2'd2)
    16. cnt <= 2'd0;
    17. else
    18. cnt <= cnt + 2'd1;
    19. end
    20. end
    21. reg [7:0] data_reg;
    22. always@(posedge clk or negedge rst_n)begin
    23. if(!rst_n)begin
    24. data_out <= 12'd0;
    25. valid_out <= 1'b0;
    26. data_reg <= 8'b0;
    27. end
    28. else begin
    29. if(valid_in)begin
    30. case(cnt)
    31. 2'd0:begin
    32. data_reg <= data_in; //先高8
    33. valid_out <= 1'd0;
    34. end
    35. 2'd1:begin
    36. data_out <= {data_out[7:0],data_in[7:4]}; //后低四位
    37. data_reg[3:0] <= data_in[3:0]; //剩余data_in的低四位先暂存
    38. valid_out <= 1'b1;
    39. end
    40. 2'd2:begin
    41. data_out <= {data_reg[3:0],data_in[7:0]}; //暂存的四位放在高位,新添加8位输入
    42. valid_out <= 1'b1;
    43. end
    44. default:begin
    45. data_reg <= 8'b0;
    46. data_out <= 12'b0;
    47. valid_out <= 1'b0;
    48. end
    49. endcase
    50. end
    51. else begin
    52. valid_out <= 1'b0;
    53. end
    54. end
    55. end
    56. endmodule

    非整数倍数数据位宽转换24to128 需要转换3次128*3=24*16

    1. `timescale 1ns/1ns
    2. module width_24to128(
    3. input clk,
    4. input rst_n,
    5. input valid_in,
    6. input [23:0] data_in,
    7. output reg valid_out,
    8. output reg [127:0] data_out
    9. );
    10. reg [3:0] cnt;
    11. always@(posedge clk or negedge rst_n)begin
    12. if(!rst_n)
    13. cnt <= 4'd0;
    14. else if(valid_in==1'd1)
    15. cnt <= cnt + 4'd1;
    16. end
    17. reg [15:0] data_reg;
    18. reg [127:0] data_out_r;
    19. always@(posedge clk or negedge rst_n)begin
    20. if(!rst_n) begin
    21. data_out <= 128'b0;
    22. valid_out <= 1'b0;
    23. data_out_r <= 128'b0;
    24. end
    25. else begin
    26. if(valid_in)begin
    27. case(cnt)
    28. 4'd0:begin
    29. data_out_r[127:104] <= data_in;
    30. valid_out <= 1'b0;
    31. end
    32. 4'd1:begin
    33. data_out_r[103:80] <= data_in;
    34. valid_out <= 1'b0;
    35. end
    36. 4'd2:begin
    37. data_out_r[79:56] <= data_in;
    38. valid_out <= 1'b0;
    39. end
    40. 4'd3:begin
    41. data_out_r[55:32] <= data_in;
    42. valid_out <= 1'b0;
    43. end
    44. 4'd4:begin
    45. data_out_r[31:8] <= data_in;
    46. valid_out <= 1'b0;
    47. end
    48. 4'd5:begin //剩余8位,将输入的高8位置于输出的低位
    49. data_out <= {data_out_r[127:8],data_in[23:16]};
    50. data_out_r[127:112] <= data_in[15:0];//将剩余输入的低16位锁存到输出锁存器中
    51. valid_out <= 1'b1;
    52. end
    53. 4'd6:begin
    54. data_out_r[111:88] <= data_in[23:0];
    55. valid_out <= 1'b0;
    56. end
    57. 4'd7:begin
    58. data_out_r[87:64] <= data_in[23:0];
    59. valid_out <= 1'b0;
    60. end
    61. 4'd8:begin
    62. data_out_r[63:40] <= data_in[23:0];
    63. valid_out <= 1'b0;
    64. end
    65. 4'd9:begin
    66. data_out_r[39:16] <= data_in[23:0];
    67. valid_out <= 1'b0;
    68. end
    69. 4'd10:begin //剩余16位,将输入的高16位置于输出的低位
    70. data_out <= {data_out_r[127:16],data_in[23:8]};
    71. data_out_r[127:120] <= data_in[7:0];//将剩余输入的低8位锁存到输出锁存器中
    72. valid_out <= 1'b1;
    73. end
    74. 4'd11:begin
    75. data_out_r[119:96] <= data_in[23:0];
    76. valid_out <= 1'b0;
    77. end
    78. 4'd12:begin
    79. data_out_r[95:72] <= data_in[23:0];
    80. valid_out <= 1'b0;
    81. end
    82. 4'd13:begin
    83. data_out_r[71:48] <= data_in[23:0];
    84. valid_out <= 1'b0;
    85. end
    86. 4'd14:begin
    87. data_out_r[47:24] <= data_in[23:0];
    88. valid_out <= 1'b0;
    89. end
    90. 4'd15:begin//无剩余位,将新的输入的24位完整赋值到输出
    91. data_out_r[23:0] <= data_in[23:0];
    92. data_out <= {data_out_r[127:24],data_in[23:0]};
    93. valid_out <= 1'b1;
    94. end
    95. endcase
    96. end
    97. else begin
    98. valid_out <= 1'b0;
    99. end
    100. end
    101. end
    102. endmodule

  • 相关阅读:
    matlab之数组排序的方法和函数
    什么是多域名证书?
    计算机网络相关知识点总结(二)
    基于jsp+mysql+ssm的校园OTO超市系统-计算机毕业设计
    软考高级系统架构设计师系列之:案例分析典型试题二
    后端技术知识点内容-全部内容-面试宝典-后端面试知识点
    大数据业务场景
    如何在小程序里实现一个随机关注列表?
    Dense embedding model 和 sparse embedding model 对比
    一起Talk Android吧(第三百六十八回:多线程之精准唤醒)
  • 原文地址:https://blog.csdn.net/mxh3600/article/details/126942449