188 lines
3.2 KiB
Verilog
188 lines
3.2 KiB
Verilog
module bldc (
|
|
input clk,
|
|
output dbg_tx,
|
|
output if_int,
|
|
|
|
output adc_ss,
|
|
output adc_sck,
|
|
input adc_so,
|
|
output adc_si,
|
|
|
|
input drv_fault_n,
|
|
output drv_en,
|
|
|
|
output drv_cs_n,
|
|
output drv_sck,
|
|
output drv_sdi,
|
|
input drv_sdo
|
|
);
|
|
|
|
reg [7:0] dbg_buf = 0;
|
|
reg dbg_buf_vld = 0;
|
|
wire dbg_tx_rdy;
|
|
|
|
reg [15:0] adc_vals[3:0];
|
|
reg [1:0] vals_idx = 0;
|
|
initial begin
|
|
adc_vals[0] = 0;
|
|
adc_vals[1] = 0;
|
|
adc_vals[2] = 0;
|
|
adc_vals[3] = 0;
|
|
end
|
|
|
|
wire [1:0] adc_channel;
|
|
wire [11:0] adc_val;
|
|
wire adc_vld;
|
|
reg adc_ack = 0;
|
|
|
|
reg stop = 0;
|
|
reg coast_nbrake = 0;
|
|
reg clear_fault = 0;
|
|
|
|
wire drv_rdy;
|
|
wire fault_a;
|
|
wire fault_b;
|
|
wire fault_c;
|
|
|
|
adc_driver adc0(
|
|
.clk(clk),
|
|
.rst(1'b0),
|
|
.so(adc_so),
|
|
.si(adc_si),
|
|
.ss(adc_ss),
|
|
.sck(adc_sck),
|
|
|
|
.channel(adc_channel),
|
|
.val(adc_val),
|
|
.vld(adc_vld),
|
|
.ack(adc_ack)
|
|
);
|
|
|
|
drv8353r_driver driver0(
|
|
.clk(clk),
|
|
.rst(1'b0),
|
|
.en(1'b1),
|
|
|
|
.drv_fault_n(drv_fault_n),
|
|
.drv_en(drv_en),
|
|
|
|
.drv_cs_n(drv_cs_n),
|
|
.drv_sck(drv_sck),
|
|
.drv_sdi(drv_sdi),
|
|
.drv_sdo(drv_sdo),
|
|
|
|
.stop(stop),
|
|
.coast_nbrake(coast_nbrake),
|
|
.clear_fault(clear_fault),
|
|
|
|
.rdy(drv_rdy),
|
|
.fault_a(fault_a),
|
|
.fault_b(fault_b),
|
|
.fault_c(fault_c)
|
|
);
|
|
|
|
uart_tx_115200 dbg(
|
|
.clk_25mhz(clk),
|
|
.rst(1'b0),
|
|
.tx(dbg_tx),
|
|
.tx_buf(dbg_buf),
|
|
.vld(dbg_buf_vld),
|
|
.rdy(dbg_tx_rdy)
|
|
);
|
|
|
|
reg [7:0] tmp3 = 0;
|
|
reg [7:0] tmp2 = 0;
|
|
reg [7:0] tmp = 0;
|
|
assign if_int = tmp[3];
|
|
|
|
reg uart_end = 0;
|
|
reg uart_bsy = 0;
|
|
|
|
// stores {cur_channel_idx, cur_nibble}
|
|
reg [3:0] cur_idx = 0;
|
|
|
|
reg [15:0] cur_channel;
|
|
reg [3:0] cur_nibble;
|
|
reg [7:0] nibble_hex;
|
|
|
|
always @(posedge clk) begin
|
|
cur_channel <= adc_vals[cur_idx[3:2]];
|
|
|
|
case (cur_idx[1:0])
|
|
2'b11: cur_nibble <= cur_channel[3:0];
|
|
2'b10: cur_nibble <= cur_channel[7:4];
|
|
2'b01: cur_nibble <= cur_channel[11:8];
|
|
2'b00: cur_nibble <= cur_channel[15:12];
|
|
endcase
|
|
|
|
case (cur_nibble)
|
|
4'h0: nibble_hex <= 48;
|
|
4'h1: nibble_hex <= 49;
|
|
4'h2: nibble_hex <= 50;
|
|
4'h3: nibble_hex <= 51;
|
|
4'h4: nibble_hex <= 52;
|
|
4'h5: nibble_hex <= 53;
|
|
4'h6: nibble_hex <= 54;
|
|
4'h7: nibble_hex <= 55;
|
|
4'h8: nibble_hex <= 56;
|
|
4'h9: nibble_hex <= 57;
|
|
4'ha: nibble_hex <= 97;
|
|
4'hb: nibble_hex <= 98;
|
|
4'hc: nibble_hex <= 99;
|
|
4'hd: nibble_hex <= 100;
|
|
4'he: nibble_hex <= 101;
|
|
4'hf: nibble_hex <= 102;
|
|
endcase
|
|
end
|
|
|
|
always @(posedge clk) begin
|
|
tmp <= tmp + 1;
|
|
if (&tmp) begin
|
|
tmp2 <= tmp2 + 1;
|
|
if (&tmp2)
|
|
tmp3 <= tmp3 + 1;
|
|
end
|
|
|
|
// 25 MHz / 2^(8+8+7) = 3 Hz
|
|
if (&tmp & &tmp2 & &tmp3[6:0]) begin
|
|
uart_bsy <= 1;
|
|
cur_idx <= 0;
|
|
end
|
|
|
|
if (dbg_tx_rdy) begin
|
|
if (uart_bsy & ~dbg_buf_vld) begin
|
|
if (~uart_end) begin
|
|
// write the ADC data to the UART
|
|
//dbg_buf <= cur_idx;
|
|
dbg_buf <= nibble_hex;
|
|
dbg_buf_vld <= 1;
|
|
|
|
cur_idx <= cur_idx + 1;
|
|
if (&cur_idx)
|
|
uart_end <= 1;
|
|
end else begin
|
|
// write newline
|
|
dbg_buf <= 8'h0d;
|
|
dbg_buf_vld <= 1;
|
|
|
|
uart_end <= 0;
|
|
uart_bsy <= 0;
|
|
end
|
|
end
|
|
end else begin
|
|
dbg_buf_vld <= 0;
|
|
end
|
|
|
|
if (adc_vld) begin
|
|
adc_ack <= 1;
|
|
vals_idx <= vals_idx + 1;
|
|
if (~uart_bsy) begin
|
|
adc_vals[vals_idx] <= {adc_channel, adc_val};
|
|
end
|
|
end else begin
|
|
adc_ack <= 0;
|
|
end
|
|
end
|
|
|
|
endmodule
|