题解 | 数据串转并电路
数据串转并电路
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刷题记录 文章被收录于专栏
记录自己最近刷题掌握的点滴