基於verilog的處理器設計之暫存器堆

2021-10-03 21:00:17 字數 4492 閱讀 4973

該暫存器堆是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

電路****及相應**結果

`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

先依次向編號為1~31的暫存器中依次寫入1 ~ 31

給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 分頻,即假...