https://blackmesalabs.wordpress.com/2016/12/22/sump2-100-msps-32bit-logic-analyzer...
[BML_sump2] / sump2 / source / mesa2ctrl.v
1 /* ****************************************************************************\r
2 -- (C) Copyright 2015 Kevin M. Hubbard @ Black Mesa Labs\r
3 -- Source file: mesa2ctrl.v                \r
4 -- Date:        October 4, 2015   \r
5 -- Author:      khubbard\r
6 -- Language:    Verilog-2001 \r
7 -- Description: The Mesa Bus to Control Bus translator. Decodes all subslot  \r
8 --              command nibbles for this slot. Write Only Operations.\r
9 -- License:     This project is licensed with the CERN Open Hardware Licence\r
10 --              v1.2.  You may redistribute and modify this project under the\r
11 --              terms of the CERN OHL v.1.2. (http://ohwr.org/cernohl).\r
12 --              This project is distributed WITHOUT ANY EXPRESS OR IMPLIED\r
13 --              WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY\r
14 --              AND FITNESS FOR A PARTICULAR PURPOSE. Please see the CERN OHL\r
15 --              v.1.2 for applicable Conditions.\r
16 --\r
17 --    "\n"..."FFFF"."(F0-12-34-04)[11223344]\n" : \r
18 --        0xFF = Bus Idle ( NULLs )\r
19 --  B0    0xF0 = New Bus Cycle to begin ( Nibble and bit orientation )\r
20 --  B1    0x12 = Slot Number, 0xFF = Broadcast all slots, 0xFE = NULL Dest\r
21 --  B2    0x3  = Sub-Slot within the chip (0-0xF)\r
22 --        0x4  = Command Nibble for Sub-Slot\r
23 --  B3    0x04 = Number of Payload Bytes (0-255)\r
24 --        0x11223344 = Payload\r
25 --\r
26 --    Slot 0xFF    = Broadcast all slots\r
27 --    Sub-Slot 0x0 = User Local Bus Access\r
28 --    Sub-Slot 0xE = PROM Local Bus Access\r
29 --                   0x0 = Bus Write\r
30 --                   0x1 = Bus Read\r
31 --                   0x2 = Bus Write Repeat ( burst to single address )\r
32 --                   0x3 = Bus Read  Repeat ( burst read from single address )\r
33 --    Sub-Slot 0xF = Power and Pin Control ( Write Only )\r
34 -- \r
35 -- Revision History:\r
36 -- Ver#  When      Who      What\r
37 -- ----  --------  -------- ---------------------------------------------------\r
38 -- 0.1   10.04.15  khubbard Creation\r
39 -- ***************************************************************************/\r
40 `default_nettype none // Strictly enforce all nets to be declared\r
41                                                                                 \r
42 module mesa2ctrl\r
43 (\r
44   input  wire         clk,\r
45   input  wire         reset,\r
46   input  wire         rx_byte_start,\r
47   input  wire         rx_byte_stop,\r
48   input  wire         rx_byte_rdy,\r
49   input  wire [7:0]   rx_byte_d,\r
50   output reg  [8:0]   subslot_ctrl\r
51 ); // module mesa2ctrl\r
52 \r
53   reg [3:0]     byte_cnt;\r
54   reg [31:0]    dword_sr;\r
55   reg           rx_byte_rdy_p1;\r
56   reg           rx_byte_rdy_p2;\r
57   reg           rx_byte_rdy_p3;\r
58   reg           rx_byte_stop_p1;\r
59   reg           rx_byte_stop_p2;\r
60   reg           rx_byte_stop_p3;\r
61 \r
62 \r
63 //-----------------------------------------------------------------------------\r
64 // Shift a nibble into a byte shift register. \r
65 //        |---- Header ----|--- Payload ---|\r
66 //           0   1   2   3\r
67 // Write : <F0><00><00><08>[<ADDR><DATA>]\r
68 // Read  : <F0><00><00><08>[<ADDR><Length>]\r
69 //-----------------------------------------------------------------------------\r
70 always @ ( posedge clk ) begin : proc_lb1\r
71  rx_byte_rdy_p1  <= rx_byte_rdy;\r
72  rx_byte_rdy_p2  <= rx_byte_rdy_p1;\r
73  rx_byte_rdy_p3  <= rx_byte_rdy_p2;\r
74  rx_byte_stop_p1 <= rx_byte_stop;\r
75  rx_byte_stop_p2 <= rx_byte_stop_p1;\r
76  rx_byte_stop_p3 <= rx_byte_stop_p2;\r
77 \r
78  if ( rx_byte_start == 1 ) begin\r
79    byte_cnt   <= 4'd0;\r
80  end else if ( rx_byte_rdy == 1 ) begin \r
81    if ( byte_cnt != 4'd4 ) begin\r
82      byte_cnt   <= byte_cnt + 1; \r
83    end\r
84  end \r
85 \r
86  // Shift bytes into a 32bit SR\r
87  if ( rx_byte_rdy == 1 ) begin \r
88    dword_sr[31:0] <= { dword_sr[23:0], rx_byte_d[7:0] };\r
89  end\r
90 \r
91  subslot_ctrl[8] <= 0;// Strobe \r
92  // Accept single DWORD packets for Slot-00 (this) or Slot-FF (all)\r
93  if ( rx_byte_rdy_p2 == 1 && byte_cnt[3:0] == 4'd3 ) begin\r
94    if ( dword_sr[31:16] == 16'hF000 || \r
95         dword_sr[31:16] == 16'hF0FF    ) begin\r
96      // Payload must be 0x00 length\r
97      if ( dword_sr[7:0] == 8'h00 ) begin\r
98        subslot_ctrl <= { 1'b1, dword_sr[15:8] };// D(8) is Strobe\r
99      end\r
100    end\r
101  end\r
102 \r
103  if ( reset == 1 ) begin\r
104    byte_cnt   <= 4'd0;\r
105  end\r
106  \r
107 end // proc_lb1\r
108 \r
109 \r
110 endmodule // mesa2ctrl\r