該暫存器堆是cpu中多個暫存器組成的陣列,由32個32位的暫存器構成,兩個讀資料口(ra->busa rb->busb),乙個寫資料口(rw ->busw),寫資料受使能訊號wen控制,在時鐘的下降沿有效
第一種實現方法,**如下
第二種實現方法,**如下module d_ff(
input clk,
input [4
:0]ra,
input [4
:0]rb,
input [4
:0]rw,
input wen,
output [31
:0]busa,
output [31
:0]busb,
input [31
:0]busw );
reg [31
:0]datareg[31
:0];
always@(negedge clk)
begin
if(wen & rw!=5'd0)
datareg[rw] <= busw;
end
assign busa =
(ra==5
'd0)?32'd0:datareg[ra];
assign busb =
(ra==5
'd0)?32'd0:datareg[rb];
endmodule
第三種實現方法,**如下module d_ff(
input clk,
input rst_n,
input [4
:0] ra,
input [4
:0] rb,
input [4
:0] rw,
input wen,
output [31
:0] busa,
output [31
:0] busb,
input [31
:0] busw)
;
reg [31
:0]datareg[31
:0];
wire datawen[31
:0];
assign datawen[0] =
1'b0;
genvar i;
generate for
(i=1
;i<
32;i=i+1)
begin
assign datawen[i] =
(wen &
(rw ==1
));end
endgenerate
genvar j;
generate for
(j=0
;j<
32;j=j+1)
begin
always @(posedge clk or negedge rst_n)
begin
if(~rst_n)
datareg[j] <=
31'd0;
else
if(datawen[j])
datareg[j] <= busw;
endend
endgenerate
assign busa = datareg[ra];
assign busb = datareg[rb];
endmodule
電路****及相應**結果module d_ff(
input clk,
input rst_n,
input [4
:0] ra,
input [4
:0] rb,
input [4
:0] rw,
input wen,
output [31
:0] busa,
output [31
:0] busb,
input [31
:0] busw)
;
reg [31
:0]datareg[31
:0];
reg datawen[31
:0];
integer i;
always@(negedge clk)
begin
for(i =
1;i<
32;i = i +1)
begin
datawen[i] <=
(wen &
(rw ==1
));end
endinteger j;
always @(negedge clk or negedge rst_n)if(
!rst_n)
for(j=
0;j<
32;j = j +1)
begin
datawen[0] <=
1'b0;
datareg[j] <=
31'd0;
endelse
begin
for(j =
1; j <
32;j = j +1)
begin
if(datawen[j])
datareg[j] <= busw;
endend
assign busa = datareg[ra];
assign busb = datareg[rb];
endmodule
先依次向編號為1~31的暫存器中依次寫入1 ~ 31`timescale 1ns/
1ns
`define clk_period 20
module d_ff_tb;
reg clk;
reg rst_n;
reg [4
:0] ra;
reg [4
:0] rb;
reg [4
:0] rw;
reg wen;
reg [31
:0] busw;
wire [31
:0] busa;
wire [31
:0] busb;
d_ff d_ff(
.clk(clk)
, .rst_n(rst_n)
, .ra(ra)
, .rb(rb)
, .rw(rw)
, .wen(wen)
, .busw(busw)
, .busa(busa)
, .busb(busb));
integer i,j,k;
initial clk =
1'b0;
always #(`clk_period/
2)clk = ~clk;
initial begin
rst_n =
1'b0;
ra =
5'b0;
rb =
5'b0;
rw =
5'b0;
wen =
1'b0;
#5; rst_n =
1'b1;
wen =
1'b1;
for(j =
1; j <
32; j = j +1)
begin
rw = j;
busw = j;
#50;end
wen =
1'b0;
#5;for
(i =
1; i <
32; i = i +1)
begin
ra = i;
#5;end
#5;for
(k =
1; k <
32; k = k +1)
begin
rb = k;
#5;end
#5; $stop
;end
endmodule
給ra訊號依次賦值1 ~ 31,觀察busa埠的值依次是1~31
給rb訊號依次賦值1 ~ 31,觀察busb埠的值依次是1~31
處理器並行設計
處理器就是處理一系列指令和資料的裝置,因此,從指令和資料這兩個維度,可以對處理器的系統結構分類。1966年,flynn將處理器系統結構分成了如下4類 sisd single instruction single data 一次處理一條指令,一條指令處理乙份資料,早期的處理器都是這種形式。simd s...
處理器的並行設計思想
並行執行是提公升處理器效能的基本思想。vliw處理器實現並行依賴於編譯器的優化功力,比起 superscalar,vliw處理器結構更簡單。指令的並行化需要特定的編譯器來分析程式的語法樹結構,通過 的行為分析指令的相關性,實現指令的亂序排程。處理器要對迴圈結構進行展開,軟體流水執行。從底層來看,採用...
三 基於Verilog的奇偶分頻器設計
在對時鐘進行分頻時,如果要保證設計出的時鐘占空比為 50 需要考慮的問題是分頻係數是偶數還是奇數。針對分頻係數的奇偶性,設計出對應的 module 偶分頻電路指的是分頻係數為 2 4 6 8 等偶數整數的分頻電路,我們可以直接進行分頻。例如下面 divider.v 中,對輸入時鐘進行 6 分頻,即假...