数据串并转换的练习。这里做了许多简化,不用考虑阻塞的情况:即上游使用 valid-ready,下游使用 valid-only 的握手机制,因此不会出现阻塞。如果上下游均使用 valid-ready 握手机制,那么需要处理阻塞的情况,这个问题会在后续有所考虑。
原题链接:VL30 数据串并转换电路

code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| `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 );
wire valid_in; wire valid_out;
assign valid_in = ready_a && valid_a;
reg [5:0] buffer; reg [2:0] cnt; wire cntdone = cnt == 3'd5;
always @(posedge clk or negedge rst_n) begin if (rst_n == 1'b0) cnt <= 0; else if (valid_in && cntdone) cnt <= 0; else if (valid_in) cnt <= cnt + 1'b1; else cnt <= cnt; end
always @(posedge clk or negedge rst_n) begin if (rst_n == 1'b0) buffer <= 0; else if (valid_in) buffer <= {data_a, buffer[5:1]}; end
always @(posedge clk or negedge rst_n ) begin if (rst_n == 1'b0) ready_a <= 0; else ready_a <= 1'b1; end
always @(posedge clk or negedge rst_n) begin if (rst_n == 1'b0) data_b <= 0; else if (valid_in && cntdone) data_b <= {data_a, buffer[5:1]}; else data_b <= data_b; end
always @(posedge clk or negedge rst_n) begin if (rst_n == 1'b0) valid_b <= 0; else if (valid_in && cntdone) valid_b <= 1'b1; else valid_b <= 0; end endmodule
|