Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- `timescale 1ns / 1ps
- //////////////////////////////////////////////////////////////////////////////////
- // Company:
- // Engineer: Chris Seto
- //
- // Create Date: 14:14:30 01/23/2011
- // Design Name:
- // Module Name: PPM
- // Project Name: PPM Decoder
- // Target Devices:
- // Tool versions:
- // Description: An I2C PPM decoder
- //
- // Dependencies: I2C Slave
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //////////////////////////////////////////////////////////////////////////////////
- module PPM(
- Clk,
- SDA,
- SCL,
- PPMIN
- );
- input Clk;
- inout SDA;
- input SCL;
- input PPMIN;
- wire [7:0] I2C_Out;
- wire [7:0] I2C_In;
- wire [7:0] I2C_Addr;
- wire I2C_WEn;
- reg UsClk;
- reg [4:0] MclkDiv_Count;
- reg [15:0] Channel[7:0];
- reg [2:0] ChannelSelect = 0;
- reg LastPosition = 0;
- reg [15:0] CurrentCount = 0;
- i2cSlave u_i2cSlave(
- .clk(Clk),
- .rst(0),
- .sda(SDA),
- .scl(SCL),
- .Out(I2C_Out),
- .In(I2C_In),
- .Addr(I2C_Addr),
- .WEn(I2C_WEn)
- );
- //assign I2C_In = (I2C_Addr[0]==0)?Channel[I2C_Addr[7:1]][7:0]:Channel[I2C_Addr[7:1]][15:8];
- if (I2C_Addr[0]==0) begin
- assign I2C_In = Channel[I2C_Addr[7:1]][7:0];
- end
- else begin
- assign I2C_In = Channel[I2C_Addr[7:1]][15:8];
- end
- // 1us counter
- always @(posedge Clk) begin
- if (MclkDiv_Count==25) begin
- MclkDiv_Count <= 5'h00;
- UsClk <= !UsClk;
- end
- else
- MclkDiv_Count <= MclkDiv_Count+1;
- end
- // Process the PPM signal
- always @(posedge UsClk) begin
- LastPosition <= PPMIN;
- if ((PPMIN==1) & (LastPosition==0))
- begin
- if (CurrentCount > 2500) begin
- CurrentCount = 0;
- ChannelSelect = 0;
- end
- else begin
- Channel[ChannelSelect] = CurrentCount;
- CurrentCount = 0;
- ChannelSelect = ChannelSelect + 1;
- end
- end
- else begin
- CurrentCount = CurrentCount + 1;
- end
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement