• FPGA - Verilog题目: 非整数倍数据位宽转换24to128


    题目描述:

    实现数据位宽转换电路,实现24bit数据输入转换为128bit数据输出。其中,先到的数据应置于输出的高bit位。

    电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出data_out的有效性;clk是时钟信号;rst_n是异步复位信号。

    接口示意图

           接口时序示意图 

    输入描述:

        input                         clk                ,           
        input                         rst_n            ,
        input                        valid_in         ,
        input    [23:0]           data_in        

    输出描述:

        output          reg                            valid_out    ,
        output          reg         [127:0]        data_out

    分析:

    输入数据是24bit,输出数据是128bit,输出数据位宽不是输入数据位宽的整数倍,该如何解决呢?

    那么就需要计算输入数据位宽输出数据位宽最小公倍数,根据公倍数得到倍数关系,进行位宽拼接转换。

    在这里,24128的最小公倍数为384,也就是说每输入16个数据,为一轮,就可以产生3个完整的128比特输出,如下图所示。

     根据此分析编写代码

    代码:

    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] data_cnt;
    11. reg [119:0] data_temp;
    12. always@(posedge clk or negedge rst_n)
    13. if(!rst_n)
    14. data_cnt <= 0;
    15. else if (valid_in)
    16. data_cnt <= data_cnt +1;
    17. else
    18. data_cnt <= data_cnt;
    19. always@(posedge clk or negedge rst_n)
    20. if(!rst_n)
    21. data_temp <= 0;
    22. else if(valid_in)
    23. data_temp <= {data_temp[95:0],data_in};
    24. always@(posedge clk or negedge rst_n)
    25. if(!rst_n)
    26. data_out <= 0;
    27. else if(data_cnt == 5)
    28. data_out <= {data_temp,data_in[23:16]};
    29. else if(data_cnt == 10)
    30. data_out <= {data_temp[111:0], data_in[23:8]};
    31. else if(data_cnt == 15)
    32. data_out <= {data_temp[103:0], data_in};
    33. else
    34. data_out <= data_out;
    35. always@(posedge clk or negedge rst_n)
    36. if(!rst_n)
    37. valid_out <= 0;
    38. else if (data_cnt == 5)
    39. valid_out <= 1;
    40. else if (data_cnt == 10)
    41. valid_out <= 1;
    42. else if (data_cnt == 15)
    43. valid_out <= 1;
    44. else
    45. valid_out <= 0;
    46. endmodule

  • 相关阅读:
    Pr 时间重映射卡点
    第三讲 Linux测试
    ROS2在Windows操作系统下的应用
    【lambda表达式】Comparator接口
    Stable Diffusion绘图,lora选择
    NextJS开发:nextjs中使用CkEditor5
    解读APS及其效益
    【Git】深入了解Git及其常用命令
    提分必练!中创教育PMP全真模拟题分享来喽
    C#中=> “Lambda运算符”
  • 原文地址:https://blog.csdn.net/weixin_46897065/article/details/139701267