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

相关推荐

程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
06-20 17:42
东华大学 Java
凉风落木楚山秋:要是在2015,你这简历还可以月入十万,可惜现在是2025,已经跟不上版本了
我的简历长这样
点赞 评论 收藏
分享
评论
14
收藏
分享

创作者周榜

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