读/写只是8位寄存器VERILOG的一部分

时间:2013-05-07 04:33:04

标签: algorithm bit-manipulation verilog

所以我有一个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位寄存器而不是我非常粗糙的方法?

2 个答案:

答案 0 :(得分:0)

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

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};

答案 1 :(得分: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