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