0

所以我有一个 8 位计数器,它存储 0-255。

简而言之,以防我的解释不够充分。我有一个由 8 位组成的值 ABCDEFGH。有没有办法读取 ABCD 或 EFGH?另外,如果我有一个新的 ABCD 值,我可以在不破坏 EFGH 的情况下将其写入 ABCDEFGH 吗?

所以我的总线实现只有 4 位宽,所以我将计数器分成两个我可以读取的 4 位值。

我的问题是如何处理对此的读写。

我能想出的解决方案如下:将 1010 写入当前持有 01010101 的 8 位寄存器的最高有效位。

将 1010 加到清理的 8 位寄存器中得到 00001010。将其左移 4 次得到 10100000,从原始寄存器中提取 4 LSB,然后将其添加到该值。

我的问题是:

首先,有没有办法只读取 8 位寄存器的 4 位?

其次,有没有比我非常粗糙的方法更优雅的方法来处理将 4 位值写入 8 位寄存器?

4

2 回答 2

1

不太清楚你的意思,只是因为位是同一个命名寄存器的一部分,每个位都是一个单独的硬件触发器。

reg [7:0] data;

always @( posedge clk or negedge rst_n ) begin
  if (~rst_n) begin
    data[3:0] <= 4'b0;
  end
  else begin
    data[3:0] <= 'bx ; //Next LSBs
  end
end

always @( posedge clk or negedge rst_n ) begin
  if (~rst_n) begin
    data[7:4] <= 4'b0;
  end
  else begin
    data[7:4] <= 'bx ; //Next MSBs
  end
end

我不会建议上述内容。

感觉你解决问题的方法可能与我的有点不同。您是否考虑过拥有 2 个 4 位寄存器并在需要时加入它们?

reg  [3:0] data_lsb;
reg  [3:0] data_msb;
wire [3:0] data;

always @( posedge clk or negedge rst_n ) begin
  if (~rst_n) begin
    data_lsb <= 4'b0;
  end
  else begin
    data_lsb <= 'bx ; //Next LSBs
  end
end

always @( posedge clk or negedge rst_n ) begin
  if (~rst_n) begin
    data_msb <= 4'b0;
  end
  else begin
    data_msb <= 'bx ; //Next MSBs
  end
end

assign data = {data_msb, data_lsb};
于 2013-05-07T06:28:22.493 回答
0

如果我理解正确,您有一个 4 位输入、4 位输出,并且希望将其存储在 8 位寄存器的 MSB/LSB 位中。以下示例代码可能是 wot 正在寻找的。

module example (
    input clk, rst_n,
    inout write_en,
    input sel_in, sel_out,
    input  [3:0] in,
    output [3:0] out );

  reg [7:0] store;

  always @(posedge clk, negedge rst_n) begin
    if (!rst_n) begin // reset
      store <= 8'h0;
    end
    else begin // input write
      if (write_en) begin
        if (sel_in) store[7:4] <= in;
        else        store[3:0] <= in;
      end
    end
  end

  always @* begin // output read
    if (sel_out) out = store[7:4];
    else         out = store[3:0];
  end

endmodule
于 2013-05-07T15:13:48.203 回答