题解 | #非整数倍数据位宽转换8to12#
非整数倍数据位宽转换8to12
https://www.nowcoder.com/practice/11dfedff55fd4c24b7f696bed86190b1
`timescale 1ns/1ns //串转并的方式有很多种: //(1)单比特转多比特。这个比较容易,只需使用移位寄存器寄存,然后计数,在相同同的计数值输出结果即可。 //(2)多比特转多比特有两种可能,一种可能输出是输入的倍数,另一种可能是输出不是输入的倍数。 //(3)输出是输入的倍数,只需使用移位寄存器寄存,然后计数,在相同的计数值输出结果。 //(4)输出不是输入的倍数,使用移位寄存器寄存,找到输入和输出的最小公倍数,然后计数,在不同的计数值输出结果。 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 ); // 8bit to 12bit ; 8*3==12*2 reg[1:0 ] cnt; reg[11:0] data_reg; always@(posedge clk or negedge rst_n)begin if(!rst_n) cnt<=0; else if(valid_in) if(cnt==2) cnt<=0; else cnt <=cnt+1; else cnt<=cnt; end always@(posedge clk or negedge rst_n)begin if(!rst_n) data_reg <=0; else if(valid_in) data_reg <= {data_reg[11:8],data_in}; else data_reg <= data_reg; end always@(posedge clk or negedge rst_n)begin if(!rst_n) valid_out <=0; else if(valid_in&&(cnt==1||cnt==2)) valid_out <=1; else valid_out <=0; end always@(posedge clk or negedge rst_n)begin if(!rst_n) data_out <=0; else if(valid_in&&(cnt==1)) data_out <={data_reg[7:0],data_in[7:4]}; else if(valid_in&&(cnt==2)) data_out <={data_reg[3:0],data_in[7:0]}; else data_out <=data_out; end endmodule