题目
实现数据位宽转换电路,实现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