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

整数倍数据位宽转换8to16

http://www.nowcoder.com/practice/f1fb03cb0baf46ada2969806114bce5e

简析

输入:valid_in , data_in[7:0]
输出:valid_out, data_out[15:0]
将两个有效的输入数据拼接并输出。

由于只用处理两个有效数据,所以将第一个有效数据暂存,然后第二个有效数据输入后,拼接起来就可以得到输出。
首先设置数据暂存器data_r,暂存第一个有效数据。

reg [7:0] data_r;
always@(posedge clk or negedge rst_n) begin
    if(~rst_n)
      	data_r <= 0;
    else
      	data_r <= valid_in&&~flag? data_in: data_r;
end

flag标志位用来指示下一个输入的有效数据是否是第一个有效数据。flag==0表示下一个输入的有效数据是第一个数据。

always@(posedge clk or negedge rst_n) begin
    if(~rst_n)
      	flag <= 0;
    else
      	flag <= valid_in? ~flag: flag;
end

如果valid_inflag==1时拉高,说明两个有效数据都已经输入。

always@(posedge clk or negedge rst_n) begin
    if(~rst_n)
      	data_out <= 0;
    else
      	data_out <= flag&&valid_in? {data_r, data_in}: data_out;
end
    
always@(posedge clk or negedge rst_n) begin
    if(~rst_n)
      	valid_out <= 0;
    else
      	valid_out <= flag&&valid_in;
end

代码

`timescale 1ns/1ns

module width_8to16(
	input 				   clk 		,   
	input 				   rst_n	,
	input				   valid_in	,
    input	    [7:0]	   data_in	,
 
 	output	reg			   valid_out,
    output  reg [15:0]	   data_out
);
    reg [7:0] data_r;
    reg       flag;
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            flag <= 0;
        else
            flag <= valid_in? ~flag: flag;
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            data_r <= 0;
        else
            data_r <= valid_in? data_in: data_r;
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            data_out <= 0;
        else
            data_out <= flag&&valid_in? {data_r, data_in}: data_out;
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            valid_out <= 0;
        else
            valid_out <= flag&&valid_in;
    end
endmodule
Verilog篇题解 文章被收录于专栏

本人对牛客网verilog篇题目一些理解

全部评论

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
8 1 评论
分享
牛客网
牛客企业服务