题解 | 非整数倍数据位宽转换8to12
非整数倍数据位宽转换8to12
https://www.nowcoder.com/practice/11dfedff55fd4c24b7f696bed86190b1
非整数倍数据位宽转换8to12
应该没有比我这思路更清晰的解法了吧,自吹自擂,哈哈哈哈!!!
嘿嘿嘿,也看了大家的题解,也有思路非常棒的小伙伴呀。
大家多多分享哈。
欢迎评论,欢迎多交流
代码
`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;
always@(posedge clk , negedge rst_n)begin
if(rst_n==0) cnt<=0;
else if(cnt==3 & valid_in) cnt<=1;//后面的data_out和valid_out都是由这个cnt决定的,所以cnt正确与否至关重要
else if(valid_in)cnt<= cnt+1;
else cnt<=cnt;
end
reg [15:0] data_shift_in;
always@(posedge clk , negedge rst_n)begin
if(rst_n==0) data_shift_in<=0;
else if(valid_in) data_shift_in<= {data_shift_in[7:0],data_in} ;
else data_shift_in<=data_shift_in;
end
always@(*) begin
if(rst_n==0) data_out=0;
else if(cnt==2) data_out = data_shift_in[15:4];
else if(cnt==3) data_out = data_shift_in[11:0];
else data_out =data_out;
end
always@(posedge clk , negedge rst_n)begin
if(rst_n==0) valid_out<=0;
else if((cnt==1 | cnt==2) & valid_in) valid_out<= 1 ;
else if((cnt==2 | cnt==3) & valid_out) valid_out<= 0;
else valid_out<=0;
end
endmodule
#Verilog进阶#