题解 | #非整数倍数据位宽转换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 四川

相关推荐

05-16 11:16
已编辑
东华理工大学 Java
牛客73769814...:盲猜几十人小公司,庙小妖风大,咋不叫她去4️⃣呢😁
牛客创作赏金赛
点赞 评论 收藏
分享
06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 18:22
投了几百份简历,专业和方向完全对口,都已读不回。尝试改了一下学校,果然有奇效。
steelhead:这不是很正常嘛,BOSS好的是即便是你学院本可能都会和聊几句,牛客上学院本机会很少了
点赞 评论 收藏
分享
评论
15
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务