用SV书写7位数据位,1位偶校验,115200bps的串行发送端(随机填充或者手工输入) 用SV书写对应的行为模型(接收端),并输出激励中的字节值,奇偶性错误的,输出校验错误
时间: 2024-05-27 15:14:14 浏览: 84
以下是用SystemVerilog编写的行为模型(接收端):
module serial_receiver (
input logic clk,
input logic rst,
input logic rx,
output logic [6:0] data_out,
output logic parity_error
);
// 状态定义
typedef enum logic [2:0] {
IDLE,
START_BIT,
DATA_BITS,
PARITY_BIT
} state_t;
state_t state;
logic [7:0] shift_reg;
logic [2:0] bit_count;
logic [6:0] data;
logic parity;
always_ff @(posedge clk or negedge rst) begin
if (~rst) begin
state <= IDLE;
shift_reg <= 8'b0;
bit_count <= 3'b0;
data <= 7'b0;
parity <= 1'b0;
data_out <= 7'b0;
parity_error <= 1'b0;
end else begin
case (state)
IDLE:
if (!rx) begin
state <= START_BIT;
bit_count <= 3'b0;
end
START_BIT:
shift_reg <= {shift_reg[6:0], rx};
bit_count <= bit_count + 1;
if (bit_count == 3) begin
state <= DATA_BITS;
bit_count <= 3'b0;
end
DATA_BITS:
shift_reg <= {shift_reg[6:0], rx};
bit_count <= bit_count + 1;
if (bit_count == 7) begin
state <= PARITY_BIT;
bit_count <= 3'b0;
data <= shift_reg[6:0];
end
PARITY_BIT:
shift_reg <= {shift_reg[6:0], rx};
bit_count <= bit_count + 1;
if (bit_count == 1) begin
state <= IDLE;
parity <= shift_reg[6];
data_out <= data;
if (parity != ^data) begin
parity_error <= 1'b1;
end else begin
parity_error <= 1'b0;
end
end
endcase
end
end
endmodule
在这个模型中,我们使用一个状态机来模拟接收端的行为。状态机有四个状态:
- IDLE:等待接收到起始位。
- START_BIT:接收起始位,开始接收数据位。
- DATA_BITS:接收数据位。
- PARITY_BIT:接收奇偶校验位,并判断校验是否正确。
我们还定义了一些变量来保存接收到的数据和奇偶校验位的状态。在每个时钟周期中,状态机会根据当前状态和输入的信号进行状态转移和数据处理。
最后,我们在输出中包含了接收到的数据和奇偶校验错误的状态。如果接收到的数据和奇偶校验位的异或结果不为零,那么说明接收到的数据存在校验错误。
阅读全文