Verilog实现XY2-100


zynq实现对振镜的控制,通过XY2-100协议,该协议和SPI的CPOL=0/CPHA=1的模式很接近,先用verilog实现SPI再实现XY2-100。

SPI实现

verilog包括几个部分,引脚定义、状态机和代码实现。

引脚定义

除了SPI本身的4路信号:O_CLK,O_CS,O_MOSI,I_MISO,和FPGA必须的SYS_CLK和RSTN,还有有用与状态判断的I_TXEN,I_RXEN,O_TXDONE,O_RXDONE,和传输的并行数据I_DATAIN,O_DATAOUT。
其中
I_TXEN为主机给从机发送数据的使能信号,其为高时主机才会发送信号;
I_RXEN为主机给从机接收数据的使能信号,其为高时主机才会接收信号;
O_TXDONE为主机给从机发送数据完毕的标志位,发送完毕后给一个高电平脉冲;
O_RXDONE为为主机给从机接收数据完毕的标志位,接收完毕后给一个高电平脉冲。

状态机

先贴一下CPOL=0/CPHA=0模式的图。在这里插入图片描述

主机实现一个8bit数据的发送,需要将片选信号O_CS置低后完成以下16个状态。在完成16个状态之后发送标志位O_TXDONE并将O_CS置高。

状态0:SCK为0,MOSI为要发送的数据的最高位,即I_data_in[7]
状态1:SCK为1,

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
XY2_100是一种常见的串行通信协议,用于连接PLC和外部设备。下面是一个简单的Verilog代码示例,用于实现基本的XY2_100协议: ```verilog module xy2_100 ( input rst, input clk, input tx_en, input [7:0] tx_data, output reg rx_en, output reg [7:0] rx_data ); reg [2:0] state; reg [7:0] tx_reg; reg [7:0] rx_reg; reg bit tx_done; reg bit rx_done; parameter IDLE = 3'd0; parameter TX_START = 3'd1; parameter TX_DATA = 3'd2; parameter TX_STOP = 3'd3; parameter RX_START = 3'd4; parameter RX_DATA = 3'd5; parameter RX_STOP = 3'd6; always @(posedge clk, posedge rst) begin if (rst) begin state <= IDLE; tx_reg <= 8'h00; tx_done <= 1'b0; rx_reg <= 8'h00; rx_done <= 1'b0; rx_en <= 1'b0; rx_data <= 8'h00; end else begin case (state) IDLE: begin if (tx_en) begin state <= TX_START; tx_reg <= tx_data; tx_done <= 1'b0; end else if (rx_done) begin state <= RX_START; rx_done <= 1'b0; end end TX_START: begin tx_done <= 1'b0; state <= TX_DATA; tx_reg <= tx_data; end TX_DATA: begin if (!tx_done) begin tx_done <= 1'b1; tx_reg <= 8'hFF; end else begin tx_done <= 1'b0; state <= TX_STOP; tx_reg <= 8'h00; end end TX_STOP: begin state <= IDLE; tx_done <= 1'b0; end RX_START: begin rx_done <= 1'b0; rx_en <= 1'b1; state <= RX_DATA; end RX_DATA: begin if (rx_en) begin rx_reg <= rx_data; rx_done <= 1'b1; rx_en <= 1'b0; state <= RX_STOP; end end RX_STOP: begin state <= IDLE; rx_done <= 1'b0; end endcase end end assign rx_data = rx_reg; endmodule ``` 该XY2_100模块接受四个输入信号:复位信号(rst)、时钟信号(clk)、发送使能(tx_en)和发送数据(tx_data)。它还生成两个输出信号:接收使能(rx_en)和接收数据(rx_data)。 该代码使用一个有限状态机来实现XY2_100协议。状态机有七个状态,分别对应于空闲状态、发送起始位、发送数据、发送停止位、接收起始位、接收数据和接收停止位的七个可能状态。 在每个状态中,输出信号将被更新以反映当前状态。在发送数据时,发送数据将被存储在一个寄存器(tx_reg)中,并在状态机中传输。在接收数据时,接收数据将被存储在另一个寄存器(rx_reg)中,并在状态机中传输。 请注意,这只是一个基本的XY2_100协议实现,具体实现方法可能会因系统要求而有所不同。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值