题解 | 非整数倍数据位宽转换24to128

非整数倍数据位宽转换24to128

https://www.nowcoder.com/practice/6312169e30a645bba5d832c7313c64cc

`timescale 1ns/1ns
`define D_FILIP_FLOP(clk, rst_n, data_d, data_q, enable) \
always @(posedge clk or negedge rst_n) begin         \
    if (~rst_n)                                      \
        data_q <= 0;                                 \
    else if (enable)                                 \
        data_q <= data_d;                            \
end



module width_24to128(
	input 				clk 		,   
	input 				rst_n		,
	input				valid_in	,
	input	[23:0]		data_in		,
 
 	output	reg			valid_out	,
	output  reg [127:0]	data_out
);

	wire [119:0] Container_d;
	reg  [119:0] Container_q;
	wire [3:0]   Cnt_d;
	reg  [3:0]   Cnt_q;
	wire valid_allow;

	assign valid_allow = valid_in && (Cnt_q == 4'd5 | Cnt_q == 4'd10 | Cnt_q == 4'd15 );


	//Cnt_Conuter
	`D_FILIP_FLOP(clk,rst_n,Cnt_d,Cnt_q,valid_in)

	//Shitfer Logic
	`D_FILIP_FLOP(clk,rst_n,Container_d,Container_q,valid_in)

	assign Cnt_d       = Cnt_q + 1'b1;
	assign Container_d = valid_in ? {Container_q[103:0],data_in}:Container_q;

	//output logic

    reg [127:0] data_out_d;
	always@(*) begin
		case(Cnt_q)
		4'd5  : data_out_d = {Container_q[119:0],data_in[23:16]};
		4'd10 : data_out_d = {Container_q[111:0],data_in[23:8]};
		4'd15 : data_out_d = {Container_q[103:0],data_in[23:0]};
		default: data_out_d = data_out;
		endcase 
	end

	`D_FILIP_FLOP(clk,rst_n,data_out_d,data_out,valid_in)
	`D_FILIP_FLOP(clk,rst_n,valid_allow,valid_out,1'b1)

endmodule

常规思路,找一个和128最近的成倍数的寄存器一直移位,在不同的情况下进行判断,第一次移入5个,120位移满了,加新来的数据额外8位,第二次再移入五个,注意这个时候最高位的8位是上一次输出的了,就不再需要。第三次依次类推,注意他的valid和结果都是寄存器输出

全部评论

相关推荐

点赞 评论 收藏
分享
03-23 21:23
东南大学 Java
这虾皮笔试是人能出出来的呀?真的人才,真红温了,三题都会做,结果一个层序遍历的返回值用数组???又不能改返回值,改了就执行错误????用数组就会有默认0,直接过不了
Makabaka_307:沙雕虾皮ide,我在线上ide跑完测试样例,在那个调试页面有个提交答案。我点完就直接交卷了。
投递虾皮信息等公司10个岗位 >
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务