赞
踩
实现数据位宽转换电路,实现8bit数据输入转换为12bit数据输出。其中,先到的数据应置于输出的高bit位。
电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出data_out的有效性;clk是时钟信号;rst_n是异步复位信号。
接口时序示意图如下。
输入输出描述:
信号 | 类型 | 输入/输出 | 位宽 | 描述 |
---|---|---|---|---|
clk | wire | Intput | 1 | 系统时钟信号 |
rst_n | wire | Intput | 1 | 异步复位信号,低电平有效 |
valid_in | wire | Intput | 1 | 输入数据有效 |
data_in | wire | Intput | 8 | 输入8bit数据 |
valid_out | reg | Output | 1 | 输出数据有效 |
data_out | reg | Output | 12 | 输出12比特数据 |
在这里,输入数据的位宽是24比特,而输出数据的位宽是128比特,不是输入数据的整数倍,那么就需要计算输入数据位宽和输出数据位宽的最小公倍数,24与128的最小公倍数为384,也就是说每输入16个数据,为一轮,就可以产生3个完整的128比特输出,如下图所示。
`timescale 1ns/1ns module width_8to12( input clk , input rst_n , input valid_in , input [7:0] data_in , output reg valid_out, output reg [11:0] data_out ); reg [1:0] r_cnt; reg [7:0] r_data_in; always @(posedge clk or negedge rst_n) if(!rst_n) r_cnt <= 2'd0; else if(valid_in) if(r_cnt == 2'd2) r_cnt <= 2'd0; else r_cnt <= r_cnt + 1'd1; else r_cnt <= r_cnt; always @(posedge clk or negedge rst_n) if(!rst_n) r_data_in <= 8'd0; else if(valid_in) r_data_in <= data_in; else r_data_in <= r_data_in; always @(posedge clk or negedge rst_n) if(!rst_n) valid_out <= 1'b0; else if( valid_in && (r_cnt == 2'd1 || r_cnt == 2'd2)) valid_out = 1'b1; else valid_out = 1'b0; always @(posedge clk or negedge rst_n) if(!rst_n) data_out <= 12'd0; else if(valid_in) if(r_cnt == 2'd1) data_out <= {r_data_in,data_in[7:4]}; else if(r_cnt == 2'd2) data_out <= {r_data_in[3:0],data_in}; else data_out <= data_out; else data_out <= data_out; endmodule
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。