题目
实现数据位宽转换电路,实现8bit数据输入转换为16bit数据输出。其中,先到的8bit数据应置于输出16bit的高8位。
电路的接口如下图所示。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 | 16 | 输出16比特数据 |
答案
`timescale 1ns/1ns
module width_8to16(
input clk ,
input rst_n ,
input valid_in ,
input [7:0] data_in ,
output reg valid_out,
output reg [15:0] data_out
);
reg cnt;
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt <= 1'b0;
else if(valid_in)
if(cnt==1'b1)
cnt <= 1'b0;
else
cnt <= cnt + 1'b1;
else
cnt <= cnt;
wire s_valid_out;
assign s_valid_out = (valid_in&&cnt==1'b1);
always @(posedge clk or negedge rst_n)
if(!rst_n)
valid_out <= 1'b0;
else
valid_out <= s_valid_out;
reg [15:0] sr_data_out;
always @(posedge clk or negedge rst_n)
if(!rst_n)
sr_data_out <= 'd0;
else if(valid_in)
sr_data_out <= {sr_data_out,data_in};
else
sr_data_out <= sr_data_out;
always @(posedge clk or negedge rst_n)
if(!rst_n)
data_out <= 'd0;
else if(s_valid_out)
data_out <= {sr_data_out,data_in};
else
data_out <= data_out;
endmodule