0%

『NC』verilog 数据串并转换

数据串并转换的练习。这里做了许多简化,不用考虑阻塞的情况:即上游使用 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
);
// 握手机制
// valid-ready <---> valid-only
// 两者之间的对比如何

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;

// a counter
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

// deal with buffer
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

// deal with output
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