题解 | #非整数倍数据位宽转换8to12#
非整数倍数据位宽转换8to12
https://www.nowcoder.com/practice/11dfedff55fd4c24b7f696bed86190b1
//注意valid_out的输出与valid_in的判断逻辑有关
`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] cnt ;
reg [7 :0] data_tempt ;
///cnt
always @ (posedge clk or negedge rst_n)
begin//valid_in期间计数,在0-2之间轮续
if(!rst_n)
cnt <= 2'd0 ;
else if(valid_in)
begin
if(cnt == 2'd2)
cnt <= 2'd0 ;
else
cnt <= cnt + 1'b1 ;
end
end
///data_tempt
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
data_tempt <= 8'd0 ;
else if(valid_in)
data_tempt <= data_in ;
end
///data_out & valid_out
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n) begin
data_out <= 12'd0;
valid_out <= 1'b0 ;
end
else begin
if(cnt == 2'd1 & valid_in)begin
valid_out <= 1'b1 ;
data_out <= {data_tempt, data_in[7:4]} ;
end
else if(cnt == 2'd2 & valid_in)begin
valid_out <= 1'b1 ;
data_out <= {data_tempt[3:0], data_in} ;
end
else begin
valid_out <= 1'b0 ;
data_out <= data_out ;
end
end
end
endmodule
腾讯云智研发成长空间 5068人发布