基于Verilog的HDLC发送程序
时间: 2023-08-14 18:05:09 浏览: 101
RS232发送Verilog HDL程序
3星 · 编辑精心推荐
以下是一个基于Verilog的HDLC发送程序的示例代码:
```
module hdlc_sender(
input clk, rst_n,
input [7:0] data_in,
input start,
output reg tx_data_out,
output reg tx_en,
output reg [3:0] state,
output reg crc[15:0]
);
parameter IDLE = 4'b0000;
parameter SEND_FLAG = 4'b0001;
parameter SEND_DATA = 4'b0010;
parameter SEND_CRC = 4'b0011;
parameter SEND_FLAG2 = 4'b0100;
reg [15:0] crc_reg;
reg [3:0] next_state;
assign tx_data_out = tx_en ? (state == SEND_FLAG || state == SEND_FLAG2) ? 8'h7E : (state == SEND_CRC) ? crc_reg[15:8] : (state == SEND_CRC + 1) ? crc_reg[7:0] : data_in : 8'h00;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
crc_reg <= 16'hFFFF;
next_state <= IDLE;
end else begin
case (state)
IDLE: begin
tx_en <= 1'b0;
crc_reg <= 16'hFFFF;
if (start) begin
next_state <= SEND_FLAG;
end else begin
next_state <= IDLE;
end
end
SEND_FLAG: begin
tx_en <= 1'b1;
next_state <= SEND_DATA;
crc_reg <= crc16(8'h7E, crc_reg);
end
SEND_DATA: begin
tx_en <= 1'b1;
next_state <= SEND_CRC;
crc_reg <= crc16(data_in, crc_reg);
end
SEND_CRC: begin
tx_en <= 1'b1;
next_state <= SEND_CRC + 1;
end
SEND_CRC + 1: begin
tx_en <= 1'b1;
crc <= crc_reg;
next_state <= SEND_FLAG2;
end
SEND_FLAG2: begin
tx_en <= 1'b1;
next_state <= IDLE;
crc_reg <= 16'hFFFF;
end
endcase
end
end
function [15:0] crc16(input [7:0] data, input [15:0] crc_reg);
reg [7:0] i;
reg [15:0] crc_next;
begin
crc_next = crc_reg;
for (i = 0; i < 8; i = i+1) begin
if ((crc_next[15] ^ data[i]) == 1) begin
crc_next[15:0] = {crc_next[14:0], 1'b0} ^ 16'h1021;
end else begin
crc_next[15:0] = {crc_next[14:0], 1'b0};
end
end
crc16 = crc_next;
end
endfunction
endmodule
```
该程序实现了一个基本的HDLC发送器,可以将输入的数据转换为HDLC格式并发送。它包括一个状态机和一个CRC计算模块。在每个时钟周期中,状态机根据当前状态和输入数据计算下一个状态,并生成一个8位输出信号。如果状态机处于发送数据状态,则输入数据将被传输到CRC计算模块中,以计算16位CRC。最后,CRC值会被发送到输出信号中,并发送器进入空闲状态。
阅读全文