题解 | #整数倍数据位宽转换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_in
在flag==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篇题目一些理解