0

我有一个用于 SPI 多路复用器的 Lattice Diamond 项目,它具有以下模块定义:

module spimux
(
input bmck,
input bssel,
input bmosi,
output bmiso,
input[3:0] a,
output[13:0] mck,
output[13:0] ssel,
output[13:0] mosi,
input[13:0] miso,
output reg[7:0] LED
);

OutputMux bmiso_mux (
    .clk(osc_clk),
    .out(bmiso),
    .a(a),
    .in(miso)
    );

// the idea here is that on each rising clock edge, the module will take
// the 4-bit address a and then set *one* of the 14 bits in "in".  One
// problem I see is that I don't prevent an invalid address of 0b1111 or
// 0b1110 from getting used.
module OutputMux
(
input clk,
output reg out,
input[3:0] a,
input[13:0] in
);

reg mask;

always @(posedge clk) begin
    // I tried this and it didn't help my situation
    //out <= (in & (14'b1 << a));
    // so I tried to assign to a temp variable and then do the bitmasking.. no change.
    mask = 14'b1 << a;
    out <= (in[13:0] & mask);
end

endmodule

endmodule

当我进入电子表格视图分配我的引脚时,并非所有引脚都显示在信号名称下拉列表中。例如,它看起来像这样:

在此处输入图像描述

您会看到 miso[0] 在那里作为输入端口,但所有其他 13 个 miso 位都没有。此外,缺少 bmck、bssel 和 bmosi。他们还没有被分配到任何其他引脚,所以谁能解释为什么他们不会在那里?

4

1 回答 1

0

感谢邱让我朝着正确的大方向前进。我应该猜到信号名称列表是在编译 Verilog 代码后生成的,所以如果输出/输入没有被使用,则不需要将其映射到引脚。

使用 compileonline.com,我能够快速迭代我的 Verilog 逻辑语句并找出问题出在哪里。对于味噌,我可以通过将always块更改为如下所示使它们出现:

always @(posedge clk) begin
    out = (in[13:0] & (14'b1 << a)) > 0;
end

这里的想法非常简单——在所有进入 FPGA 的 MISO 输入中,我们只想查看来自当前选择的 SPI 设备的那个(由 address 标识a)。我们只需要设置out为由 标识的位的值a。屏蔽后,该值将是 0 或 !0,所以我们只需将其写入out.

我想使用归约运算符,但在线编译器似乎无法使用这种表示法,所以我只是与 0 进行比较,这似乎有效。我仍然需要在硬件上进行测试。

于 2014-11-19T21:32:18.720 回答