AXI数据流计算CRC16的代码


module crc16_coder_8bit(
input 				clk,
input 				rst_n,
input 				din_last,
input				din_valid,
input		[7:0]	din_data,
output 	reg			dout_last,
output	reg			dout_valid,
output 	reg	[7:0]	dout_data
);

parameter [15:0]	POLY = 16'h1021;// or 16'h8005

reg	[15:0]		crc_remainder;
reg	[2:0]		state;
reg	[3:0]		bit_cnt;

wire	[15:0]	tmp[8:0];

wire	[7:0]	shift_in = (state==2)? 8'd0:din_data;

assign	tmp[0] = crc_remainder;
assign	tmp[1] = tmp[0][15]? {tmp[0][14:0],shift_in[7]}^POLY : {tmp[0][14:0],shift_in[7]};
assign	tmp[2] = tmp[1][15]? {tmp[1][14:0],shift_in[6]}^POLY : {tmp[1][14:0],shift_in[6]};
assign	tmp[3] = tmp[2][15]? {tmp[2][14:0],shift_in[5]}^POLY : {tmp[2][14:0],shift_in[5]};
assign	tmp[4] = tmp[3][15]? {tmp[3][14:0],shift_in[4]}^POLY : {tmp[3][14:0],shift_in[4]};
assign	tmp[5] = tmp[4][15]? {tmp[4][14:0],shift_in[3]}^POLY : {tmp[4][14:0],shift_in[3]};
assign	tmp[6] = tmp[5][15]? {tmp[5][14:0],shift_in[2]}^POLY : {tmp[5][14:0],shift_in[2]};
assign	tmp[7] = tmp[6][15]? {tmp[6][14:0],shift_in[1]}^POLY : {tmp[6][14:0],shift_in[1]};
assign	tmp[8] = tmp[7][15]? {tmp[7][14:0],shift_in[0]}^POLY : {tmp[7][14:0],shift_in[0]};

reg	din_last_r;
always @ (posedge clk)
	din_last_r<=din_last;

always @ (posedge clk or negedge rst_n)
begin
	if(~rst_n) begin
		crc_remainder<=0;
		state<=0;
		dout_last<=1;
		dout_data<=0;
		dout_valid<=0;
		bit_cnt<=0;
	end
	else begin
		case(state)
		//开始运算
		0:begin
			if({din_last_r,din_last}==2'b10) begin
				dout_last<=0;
				dout_data<=din_data;
				dout_valid<=din_valid;
				state<=1;
				crc_remainder<=din_valid? {8'd0,din_data} : 16'd0;
			end
		end
		//运算过程
		1:begin
			dout_data<=din_data;
			dout_valid<=din_valid;
			if(din_valid) crc_remainder<=tmp[8];
			if(din_last) begin
				bit_cnt<=0;
				state<=2;
			end
		end
		//尾部补16个0继续运算,算出余数
		2:begin
			dout_valid<=0;
			crc_remainder<=tmp[8];
			if(bit_cnt<8)
				bit_cnt<=bit_cnt+8;
			else
				state<=3;
		end
		//输出余数
		3:begin
			dout_data<=crc_remainder>>bit_cnt;
			dout_valid<=1;
			bit_cnt<=bit_cnt-8;
			if(bit_cnt==0) begin
				dout_last<=1;
				state<=4;
			end
		end
		4:begin
			dout_valid<=0;
			state<=0;
		end
		default:state<=0;
		endcase
	end
end

endmodule

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的Verilog代码示例,用于实现AXI DMA数据传输: ``` module dma_copy ( input aclk, aclkrst, input [31:0] src_addr, input [31:0] dst_addr, input [31:0] length, input start, output done ); // AXI DMA control registers reg [31:0] control; reg [31:0] status; // AXI DMA writer interface wire [31:0] axi_waddr; wire [31:0] axi_wdata; wire [3:0] axi_wstrb; wire axi_wvalid; wire axi_wready; // AXI DMA reader interface wire [31:0] axi_raddr; wire [31:0] axi_rdata; wire [3:0] axi_rstrb; wire axi_rvalid; wire axi_rready; // Internal read/write pointers and length counter reg [31:0] src_ptr; reg [31:0] dst_ptr; reg [31:0] len_count; // State machine states parameter IDLE = 0; parameter READ = 1; parameter WRITE = 2; reg [1:0] state; // Initialize state machine always @(posedge aclk) begin if (aclkrst) begin state <= IDLE; control <= 0; status <= 0; src_ptr <= 0; dst_ptr <= 0; len_count <= 0; end else begin case (state) IDLE: begin if (start) begin state <= READ; control <= 0x10002; // Start DMA transfer src_ptr <= src_addr; dst_ptr <= dst_addr; len_count <= length; end end READ: begin if (axi_rvalid) begin status <= axi_rdata; // Save DMA status state <= WRITE; end axi_raddr <= src_ptr; axi_rstrb <= 4'b1111; axi_rready <= 1; end WRITE: begin if (axi_wvalid) begin len_count <= len_count - 4; // Decrement length counter if (len_count == 0) begin state <= IDLE; control <= 0x10004; // Stop DMA transfer done <= 1; end else begin src_ptr <= src_ptr + 4; // Increment read pointer dst_ptr <= dst_ptr + 4; // Increment write pointer state <= READ; end end axi_waddr <= dst_ptr; axi_wdata <= axi_rdata; axi_wstrb <= 4'b1111; axi_wvalid <= axi_rvalid; axi_wready <= 1; end endcase end end // Connect AXI DMA writer interface axi_lite_slave #( .C_S_AXI_DATA_WIDTH(32), .C_S_AXI_ADDR_WIDTH(32) ) axi_writter ( .aresetn(aclkrst), .aclk(aclk), .awaddr(axi_waddr), .awprot(3'b000), .awvalid(axi_wvalid), .awready(axi_wready), .awlen(0), .awsize(2), .awburst(2), .wdata(axi_wdata), .wstrb(axi_wstrb), .wvalid(axi_wvalid), .wready(axi_wready), .bresp(2'b00), .bvalid(), .bready() ); // Connect AXI DMA reader interface axi_lite_slave #( .C_S_AXI_DATA_WIDTH(32), .C_S_AXI_ADDR_WIDTH(32) ) axi_reader ( .aresetn(aclkrst), .aclk(aclk), .araddr(axi_raddr), .arprot(3'b000), .arvalid(axi_rvalid), .arready(axi_rready), .arlen(0), .arsize(2), .arburst(2), .rdata(axi_rdata), .rvalid(axi_rvalid), .rready(axi_rready), .rresp(2'b00), .rlast() ); endmodule ``` 此代码使用AXI DMA接口在两个地址之间传输数据。 输入参数包括源地址,目标地址和数据长度,以及一个启动信号(start)和一个完成信号(done)。 AXI DMA控制寄存器和状态寄存器分别保存DMA传输的控制信息和状态信息。 在状态机中,从源地址读取数据并将其写入目标地址,直到数据传输完成。状态机的状态IDLE,READ和WRITE分别表示空闲,读取和写入。 AXI DMA的读取和写入接口分别连接到axi_reader和axi_writer模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰冻土卫二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值