XDC:
set_property -dict {PACKAGE_PIN AP10 IOSTANDARD LVCMOS33} [get_ports mcp41_cs_n]
set_property -dict {PACKAGE_PIN AL10 IOSTANDARD LVCMOS33} [get_ports mcp41_sclk]
set_property -dict {PACKAGE_PIN AM10 IOSTANDARD LVCMOS33} [get_ports mcp41_mosi]
set_property -dict {PACKAGE_PIN AN9 IOSTANDARD LVCMOS33} [get_ports mcp41_miso]
set_property -dict {PACKAGE_PIN AP9 IOSTANDARD LVCMOS33} [get_ports mcp41_rst]
top层
mcp41xxx_spi spi_inst (
.clk (clk_10m),
.rst_n (rst_n),
.spi_data (16’h1255),
.cs_n (mcp41_cs_n),
.sdo (mcp41_mosi)
);
模块层:
module mcp41xxx_spi (
input wire clk, // FPGA主时钟 (e.g. 50MHz)
input wire rst_n, // 复位信号
input wire [15:0] spi_data, // 待发送的16位数据 (命令+数据)
//input wire trigger, // 开始传输信号
output reg cs_n, // 片选信号 (低有效)
output reg sdo // 主输出数据
);
//reg [1:0] tri_sync;
//wire tri_pos;
//wire tri_neg;
// 状态机定义
wire [15:0] wr_reg1;
reg [15:0] data_hold; // 数据移位寄存器
reg [7:0] state;
reg [7:0] cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
state <= 8’d0;
cs_n <= 1’b1;
cnt <= 8’d15;
sdo <= 1’d0;
end
else
begin
case(state)
8’d0:begin
state <= 8’d1;
cs_n <= 1’b1;
cnt <= 8’d15;
data_hold <= spi_data;
sdo <= 1’d0;
end
8’d1:begin //写入14bit寄存器数据MSB
cs_n <= 1’d0;
sdo <= data_hold[15]; // 输出最高位
if(cnt == 8’d0)
cnt <= 8’d15;
else
cnt <= cnt – 1’d1;
if(cnt == 8’d0)
state <= 8’d2;
else begin
cnt <= cnt – 1;
sdo <= data_hold[15]; // 输出最高位
// 数据左移(关键修复)
data_hold <= {data_hold[14:0], 1’b0};
end
end
8’d2:begin
state <= 8’d0;
cs_n <= 1’b1;
cnt <= 8’d15;
sdo <= 1’d0;
end
default:begin
state <= 8’d0;
cs_n <= 1’b1;
cnt <= 8’d15;
sdo <= 1’d0;
end
endcase
end
end
endmodule
功能为数字电位器。以上代码,用VIVADO调试时,用ILA观察,CS始终为高电平,数据也没有。输出始终为1.67V(中点)。调试了3天了,还是不行。高手能帮着看一下吗,到底问题在哪呢?选通取决于状态机,但也不至于一点都拉不低吧(把它当Io口对待,测试可以拉低)。CPU为KU060
没有回复内容