简单的verilog来控制MD1715超声波驱动器
Simple verilog to control MD1715 ultrasound driver
我正在尝试控制 TC8020 mosfet (http://ww1.microchip.com/downloads/en/DeviceDoc/tc8020.pdf) through a md1715 ultrasound driver (http://ww1.microchip.com/downloads/en/DeviceDoc/md1715.pdf) 以最终控制超声波传感器。
即FPGA --> MD1715 --> TC8020 --> 发送器
从我在 md1715 真值表(md1715.pdf 第 4 页)中可以看出,我应该能够通过类似 SEL=1、POS=1、NEG=0 的方式驱动输出电压?
我正尝试在我的 verilog 代码中做类似的事情,但我已经有很长时间没有使用 HDL 了。这样的事情有意义吗?我不确定如何更改频率等
module main(input ADC0CLK,
output SELA, //pin mappings set up to fpga
output POSA,
output NEGA
);
reg r_sel_a;
reg r_pos_a;
reg r_neg_a;
/*
// Hardwire for now just to test output.
// From what I can tell this should drive a constant voltage of 1?
assign SELA = 1'b1;
assign POSA = 1'b1;
assign NEGA = 0;
*/
assign SELA = r_sel_a;
assign POSA = r_pos_a;
assign NEGA = r_neg_a;
always @ (posedge ADC0CLK or negedge ADC0CLK)
begin: TRANSMITA
if (ADC0CLK == 1) begin
r_sel_a <= 1'b1;
r_pos_a <= 1'b1;
r_neg_a <= 0;
end else if (ADC0CLK == 0) begin
r_sel_a <= 1'b1;
r_pos_a <= 0;
r_neg_a <= 1'b1;
end
end
endmodule
非常感谢
此代码不可合成。你不能有一个进程(总是)在时钟的两个边缘上工作。我在这里看到两个选项:
您可以使用快 2 倍的时钟,然后您的进程将仅在这个更快的时钟的 posedge 上运行。
您可以使用 ODDR 原语。 ODDR 是用于在两个时钟边沿上驱动数据的赛灵思原语,here 您可以找到赛灵思 7 系列 IO 资源的描述。如果您使用其他供应商的 FPGA,那么您必须搜索这样的原语,我发现 altera 有 ALTDDIO_OUT ipcore,但我从未使用过它。
Imo 选项 2 更好,您应该不会出现在第一个选项中可能出现的计时问题。
我正在尝试控制 TC8020 mosfet (http://ww1.microchip.com/downloads/en/DeviceDoc/tc8020.pdf) through a md1715 ultrasound driver (http://ww1.microchip.com/downloads/en/DeviceDoc/md1715.pdf) 以最终控制超声波传感器。
即FPGA --> MD1715 --> TC8020 --> 发送器
从我在 md1715 真值表(md1715.pdf 第 4 页)中可以看出,我应该能够通过类似 SEL=1、POS=1、NEG=0 的方式驱动输出电压?
我正尝试在我的 verilog 代码中做类似的事情,但我已经有很长时间没有使用 HDL 了。这样的事情有意义吗?我不确定如何更改频率等
module main(input ADC0CLK,
output SELA, //pin mappings set up to fpga
output POSA,
output NEGA
);
reg r_sel_a;
reg r_pos_a;
reg r_neg_a;
/*
// Hardwire for now just to test output.
// From what I can tell this should drive a constant voltage of 1?
assign SELA = 1'b1;
assign POSA = 1'b1;
assign NEGA = 0;
*/
assign SELA = r_sel_a;
assign POSA = r_pos_a;
assign NEGA = r_neg_a;
always @ (posedge ADC0CLK or negedge ADC0CLK)
begin: TRANSMITA
if (ADC0CLK == 1) begin
r_sel_a <= 1'b1;
r_pos_a <= 1'b1;
r_neg_a <= 0;
end else if (ADC0CLK == 0) begin
r_sel_a <= 1'b1;
r_pos_a <= 0;
r_neg_a <= 1'b1;
end
end
endmodule
非常感谢
此代码不可合成。你不能有一个进程(总是)在时钟的两个边缘上工作。我在这里看到两个选项:
您可以使用快 2 倍的时钟,然后您的进程将仅在这个更快的时钟的 posedge 上运行。
您可以使用 ODDR 原语。 ODDR 是用于在两个时钟边沿上驱动数据的赛灵思原语,here 您可以找到赛灵思 7 系列 IO 资源的描述。如果您使用其他供应商的 FPGA,那么您必须搜索这样的原语,我发现 altera 有 ALTDDIO_OUT ipcore,但我从未使用过它。
Imo 选项 2 更好,您应该不会出现在第一个选项中可能出现的计时问题。