题解 | 数据串转并电路

数据串转并电路

https://www.nowcoder.com/practice/6134dc3c8d0741d08eb522542913583d

`timescale 1ns/1ns
module s_to_p(
	input clk,
	input rst_n,
	input valid_a,//输入数据有效的信号
	input data_a,//单比特的输入数据

	output reg ready_a,//接收数据有效信号,这里默认除了复位一直有效
	output reg valid_b,//输出数据有效信号
	output reg [5:0] data_b//输出拼接好的并行数据
);

reg [5:0] data_reg;//临时存储接受到的单比特有效信号用于拼接
reg [2:0] data_cnt;//记录已存储的单比特数据个数

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		ready_a <= 'd0;
	else
		ready_a <= 1'd1;
end

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		data_cnt <= 'd0;
	else if(valid_a && ready_a)
		data_cnt <= (data_cnt == 3'd5) ? 'd0 : (data_cnt + 1'd1);
		//如若拼接满六位,在下一个valid来临时将计数器清零
end

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		data_reg <= 'd0;
	else if(valid_a && ready_a)
		data_reg <= {data_a, data_reg[5:1]};//原来数据寄存位高五位依次向右移一位
end

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin
		valid_b <= 'd0;
		data_b <= 'd0;
	end
	else if(data_cnt == 3'd5)begin
		valid_b <= 1'd1;
		data_b <= {data_a, data_reg[5:1]};
	end
	else
		valid_b <= 'd0;
end

endmodule


verilog刷题记录 文章被收录于专栏

记录自己最近刷题掌握的点滴

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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