0

8 ビットのカウンターがあり、0 ~ 255 を格納します。

一言で言えば、私の説明が不十分な場合に備えて。8 ビットで構成される値 ABCDEFGH があります。ABCD または EFGH を読み取る方法はありますか? また、ABCD の新しい値がある場合、EFGH を中断せずに ABCDEFGH に書き込むことはできますか?

したがって、私のバスの実装は 4 ビット幅しかないため、カウンターを読み取り可能な 2 つの 4 ビット値に分割しています。

私の問題は、これに対する読み取りと書き込みの処理方法の問題です。

私が思いつく解決策は次のとおりです。現在 01010101 を保持している 8 ビット レジスタの最上位ビットに 1010 を書き込みます。

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 に答える