ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【FPGA学习笔记】VL32 非整数倍数据位宽转换24to128

2022-07-04 13:31:44  阅读:245  来源: 互联网

标签:cnt FPGA 24to128 else valid 数据位 rst data out


描述

实现数据位宽转换电路,实现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   输入:valid_in, data_in[23:0]
输出:valid_out,data_out[127:0]
输入数据是24bit,输出数据是128bit。因为<span class="katex"><span class="katex-mathml">128&times;3=24&times;16128\times3=24\times16<span class="katex-html"><span class="base"><span class="strut"><span class="mord">1<span class="mord">2<span class="mord">8<span class="mspace"><span class="mbin">&times;<span class="mspace"><span class="base"><span class="strut"><span class="mord">3<span class="mspace"><span class="mrel">=<span class="mspace"><span class="base"><span class="strut"><span class="mord">2<span class="mord">4<span class="mspace"><span class="mbin">&times;<span class="mspace"><span class="base"><span class="strut"><span class="mord">1<span class="mord">6,所以每输入16个有效数据,就可以产生三个完整的输出。因此设置一个仅在输入数据有效时工作的计数器<code>cnt</code>,计数范围是0-15。
1 2 3 4 5 6 7 8 9 reg [3:0]   cnt; always@(posedge clk or negedge rst_n) begin     if(~rst_n)         cnt <= 0;     else         cnt <= ~valid_in? cnt:                cnt==15  0  :                cnt+1; end

然后设置一个数据暂存器data_lock,每当输入有效时,将数据从低位移入。

 
1 2 3 4 5 6 7 reg [127:0] data_lock; always@(posedge clk or negedge rst_n) begin     if(~rst_n)         data_lock <= 0;     else         data_lock <= valid_in? {data_lock[103:0], data_in}: data_lock; end  

 

 

由上图易得,每当计数器cnt计数到5、10、15时,data_out要进行更新,并拉高valid_out一个周期。

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 always@(posedge clk or negedge rst_n) begin     if(~rst_n)         valid_out <= 0;     else         valid_out <= (cnt==5 || cnt==10 || cnt==15)&&valid_in; end    always@(posedge clk or negedge rst_n) begin     if(~rst_n)         data_out <= 0;     else if(cnt==5)         data_out <= valid_in? {data_lock[119:0], data_in[23:16]}: data_out;     else if(cnt==10)         data_out <= valid_in? {data_lock[111:0], data_in[238]}: data_out;     else if(cnt==15)         data_out <= valid_in? {data_lock[103:0], data_in[230]}: data_out;     else         data_out <= data_out; end

代码

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 `timescale 1ns/1ns   module width_24to128(     input               clk         ,       input               rst_n       ,     input               valid_in    ,     input   [23:0]      data_in     ,        output  reg         valid_out   ,     output  reg [127:0] data_out );     reg [3:0]   cnt;     reg [127:0] data_lock;           always@(posedge clk or negedge rst_n) begin         if(~rst_n)             cnt <= 0;         else             cnt <= ~valid_in? cnt:cnt+1;     end           always@(posedge clk or negedge rst_n) begin         if(~rst_n)             valid_out <= 0;         else             valid_out <= (cnt==5 || cnt==10 || cnt==15)&&valid_in;     end           always@(posedge clk or negedge rst_n) begin         if(~rst_n)             data_lock <= 0;         else             data_lock <= valid_in? {data_lock[103:0], data_in}: data_lock;     end           always@(posedge clk or negedge rst_n) begin         if(~rst_n)             data_out <= 0;         else if(cnt==5)             data_out <= valid_in? {data_lock[119:0], data_in[23:16]}: data_out;         else if(cnt==10)             data_out <= valid_in? {data_lock[111:0], data_in[238]}: data_out;         else if(cnt==15)             data_out <= valid_in? {data_lock[103:0], data_in[230]}: data_out;         else             data_out <= data_out;     end endmodule

标签:cnt,FPGA,24to128,else,valid,数据位,rst,data,out
来源: https://www.cnblogs.com/mahaidong/p/16442639.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有