2013-05-07 255 views
0

所以我有一個8位計數器,它存儲0-255。只讀部分8位寄存器VERILOG

簡而言之,如果我的解釋不充分。我有一個由8位組成的值ABCDEFGH。有沒有辦法閱讀ABCD或EFGH?另外,如果我有一個新的ABCD值,我可以在不中斷EFGH的情況下將它寫入ABCDEFGH嗎?

所以我的總線實現只有4位寬,所以我把計數器分成兩個4位的值,我可以讀取。

我的問題是如何處理讀寫這個問題。

的解決方案,我可以想出如下: 寫1010到8位的最顯著位寄存器目前持有01010101.

添加1010清潔8位寄存器以獲取00001010.移位它離開4次得到10100000,從原始寄存器中提取4個LSB,然後將其添加到該值。

我的問題是:

首先,有沒有辦法讀出8位的只有4位註冊?

其次,是否有一種更優雅的方式來處理將4位值寫入8位寄存器的問題,而不是我非常不熟悉的方法?

回答

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

啊是的,這正是我所期待的。連接和這個東西現在回來了。謝謝 – adsfdsafdsa 2013-05-07 19:51:49

0

如果我在正確的立場,你有一個4位輸入,4位輸出,並希望將其存儲在一個8位寄存器的MSB/LSB位。以下示例代碼可能是您正在尋找的代碼。

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