题解 | #非整数倍数据位宽转换8to12#

非整数倍数据位宽转换8to12

http://www.nowcoder.com/practice/11dfedff55fd4c24b7f696bed86190b1

非整数倍的数据位宽转换 题型,第一,找最大倍数关系,比如24->128,则中间缓存大小为24*5=120,本题8->12,中间缓存大小为8。采用缓存buff保存data_in。第二,确定计数周期,在每次valid有效的时钟下,cnt自增1,当cnt=1,2时,data_out都会输出一次,那么计数周期就为0-2。第三,在每次输出时,使用拼接运算符拼接buff和data_in来输出data_out,并将未输出的data_in保存在缓存buff(在line34没有保存是因为此时data_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[7:0] buff;
    reg[1:0] cnt;
    always@(negedge rst_n or posedge clk)begin
        if(~rst_n)
            cnt <= 0;
        else if(valid_in)
            if(cnt == 2)
                cnt <= 0;
            else
                cnt <= cnt + 1;
    end
    always@(negedge rst_n or posedge clk)begin
        if(~rst_n)begin
            buff <= 0;
            data_out <= 0;
        end
        else if(valid_in)begin
            if(cnt == 1)begin
                data_out <= {buff, data_in[7:4]};
                buff[3:0] <= data_in[3:0];
            end
            else if(cnt == 2)begin
                data_out <= {buff[3:0], data_in};
            end
            else
                buff <= data_in;
            end
    end
    always@(negedge rst_n or posedge clk)begin
        if(~rst_n)
            valid_out <= 0;
        else if(valid_in && (cnt == 1 || cnt == 2))
            valid_out <= 1;
        else
            valid_out <= 0;
    end     
endmodule

全部评论
喜欢这个编码方式
点赞 回复 分享
发布于 2022-08-29 11:27 四川

相关推荐

已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
评论
14
收藏
分享
牛客网
牛客企业服务