题目
实现数据位宽转换电路,实现24bit数据输入转换为128bit数据输出。其中,先到的数据应置于输出的高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 | 24 | 输入24bit数据 |
valid_out | reg | Output | 1 | 输出数据有效 |
data_out | reg | Output | 128 | 输出128比特数据 |
答案
在这里,输入数据的位宽是24比特,而输出数据的位宽是128比特,不是输入数据的整数倍,那么就需要计算输入数据位宽和输出数据位宽的最小公倍数,24与128的最小公倍数为384,也就是说每输入16个数据,为一轮,就可以产生3个完整的128比特输出,如下图所示。
`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] r_cnt;
reg [119:0] r_data_in;
reg r_valid_out;
//输入数据计数器
always @(posedge clk or negedge rst_n)
if(!rst_n)
r_cnt <= 4'd0;
else if(valid_in)
if(r_cnt == 4'd15)
r_cnt <= 4'd15;
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 <= 'd0;
else if(valid_in)
r_data_in <= {r_data_in,data_in};
else
r_data_in <= r_data_in;
//输出128比特数据
always @(posedge clk or negedge rst_n)
if(!rst_n)
data_out <= 'd0;
else if(r_valid_out)
if(r_cnt == 4'd5)
data_out <= {r_data_in[119:0],data_in[23:16]};
else if(r_cnt == 4'd10)
data_out <= {r_data_in[111:0],data_in[23:8]};
else if(r_cnt == 4'd15)
data_out <= {r_data_in[103:0],data_in};
else
data_out <= data_out;
else
data_out <= data_out;
//输出有效信号(组合逻辑)
always @(*)
if(valid_in && (r_cnt==4'd5 || r_cnt==4'd10 || r_cnt==4'd15))
r_valid_out = 1'b1;
else
r_valid_out = 1'b0;
//输出有效信号
always @(posedge clk or negedge rst_n)
if(!rst_n)
valid_out <= 1'b0;
else
valid_out <= r_valid_out;
endmodule