2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p>  用硬件描述語言設(shè)計CPU</p><p><b>  摘要</b></p><p>  本次設(shè)計完全用verilog硬件描述語言編寫微處理器的各個部件,在頂層文件里將各個部件連接起來,形成一個簡單的微處理器,加上一些外圍模塊來實現(xiàn)一些功能。本次設(shè)計在合理性與實用性上沒有考慮。只為了達到技術(shù)指標(biāo),從原理上完成一個簡單的cpu設(shè)計。</p>

2、;<p>  關(guān)鍵字:verilog,微處理器,CPU設(shè)計</p><p>  Design CPU In Hardware Description Language</p><p><b>  Abstract</b></p><p>  The design completely microprocessor verilog

3、hardware description language in all parts, the top file in the various components connected together to form a simple microprocessor, plus some peripheral modules to achieve some functionality. The design does not have

4、a reasonable and practical considerations. Only to achieve technical indicators, from the principles of the cpu to complete a simple cpu design.</p><p>  Key Words:verilog, microprocessor, CPU design</p&g

5、t;<p><b>  目錄</b></p><p>  第1章 設(shè)計任務(wù)和技術(shù)指標(biāo).........................................5</p><p>  第2章 簡單介紹...................................................6</p><p>  

6、2.1微處理器硬件系統(tǒng)及原理......................................6</p><p>  2.1.1內(nèi)部組成...............................................6</p><p>  2.1.2外圍模塊...............................................8</p&

7、gt;<p>  2.2處理器指令系統(tǒng)及功能........................................8</p><p>  第3章 各模塊的設(shè)計及實現(xiàn).........................................9</p><p>  3.1時鐘發(fā)生器的設(shè)計及實現(xiàn)...................................

8、...9</p><p>  3.2程序計數(shù)器的設(shè)計及實現(xiàn).....................................12</p><p>  3.3指令寄存器的設(shè)計及實現(xiàn).....................................13</p><p>  3.4運算器的設(shè)計及實現(xiàn).............................

9、............14</p><p>  3.5累加器的設(shè)計及實現(xiàn).........................................16</p><p>  3.6地址選擇器的設(shè)計及實現(xiàn).....................................17</p><p>  3.7數(shù)據(jù)選擇器的設(shè)計及實現(xiàn)...............

10、......................17</p><p>  3.8控制器的設(shè)計及實現(xiàn).........................................18</p><p>  3.9 ROM的設(shè)計及實現(xiàn)..........................................25</p><p>  3.10 RAM的設(shè)計及實現(xiàn).

11、........................................26</p><p>  第4章 CPU的測試...............................................27</p><p>  4.1乘法測試...................................................29</p>&

12、lt;p>  4.2除法測試...................................................29</p><p>  4.3減1測試...................................................29</p><p>  4.4加、減1測試...................................

13、............30</p><p>  4.5測試結(jié)果...................................................30</p><p>  第5章 總結(jié)......................................................33</p><p>  第6章 參考文獻.......

14、...........................................34</p><p>  第1章 設(shè)計任務(wù)和技術(shù)指標(biāo)</p><p>  運用在“數(shù)字電路與邏輯設(shè)計”課程中學(xué)過的基本理論知識,設(shè)計并用可編程邏輯器件實現(xiàn)一個簡單的八位操作數(shù)的微處理器。完成微處理器硬件系統(tǒng)設(shè)計和指令系統(tǒng)設(shè)計兩個方面的任務(wù),使微處理器能實現(xiàn)。</p><p><

15、;b>  第2章 簡單介紹</b></p><p>  本次設(shè)計完全用verilog硬件描述語言編寫微處理器的各個部件,在頂層文件里將各個部件連接起來,形成一個簡單的微處理器,加上一些外圍模塊來實現(xiàn)一些功能。本次設(shè)計在合理性與實用性上沒有考慮。只為了達到技術(shù)指標(biāo),從原理上完成一個簡單的CPU設(shè)計。</p><p>  2.1微處理器硬件系統(tǒng)及原理</p>&

16、lt;p><b>  2.1.1內(nèi)部組成</b></p><p>  微處理器硬件由以下八個基本部件組成:</p><p>  運算器、控制器、指令寄存分離器、時鐘發(fā)生器、程序計數(shù)器、累加器、地址選擇器、數(shù)據(jù)選擇器。</p><p>  時鐘發(fā)生器clk-gen:利用輸入時鐘信號生成三個時鐘信號送往對應(yīng)的部件。</p>&l

17、t;p>  程序計數(shù)器PC:存放將要執(zhí)行的指令地址。</p><p>  指令寄存器IR:存放被執(zhí)行的操作碼和操作數(shù)的地址,直接供運算器與控制器。</p><p>  控制器CON:根據(jù)操作碼產(chǎn)生一系列時序邏輯信號,控制微處理器各個部件協(xié)調(diào)一致地完成每條指令相應(yīng)的操作。</p><p>  運算器ALU:當(dāng)時鐘上升沿來時對累加器與數(shù)據(jù)總線上的數(shù)進行加減乘除或邏

18、輯運算。</p><p>  累加器ACC:暫時存放運算結(jié)果。</p><p>  地址選擇器:選擇輸出到地址總線上的地址,是PC還是操作數(shù)地址。</p><p>  數(shù)據(jù)選擇器:選通ALU的運算結(jié)果輸出到數(shù)據(jù)總線上去。</p><p><b>  下面是內(nèi)部連接圖:</b></p><p>&l

19、t;b>  2.1.2外圍模塊</b></p><p>  程序存儲器ROM:存放程序指令。</p><p>  數(shù)據(jù)存儲器RAM:讀取存放運算中間變量等臨時數(shù)據(jù)。</p><p>  輸入輸出特殊寄存器:數(shù)據(jù)的輸入輸出。</p><p><b>  外部部分連接圖:</b></p>&l

20、t;p>  外圍設(shè)備通過總線連接CPU</p><p>  2.2 處理器指令系統(tǒng)及功能</p><p>  處理器的基本指令字長為W位,指令的每一位從高到低用DW,DW-1,…,D1,D0表示,有些微處理器的一條指令包括多個指令字長,即每條指令的長度不一樣,例如intel的80386等。本實驗為了簡化設(shè)計,規(guī)定所有的指令都是單指令字的指令,且所有指令的長度都是8,即一個字節(jié)。因此可

21、以有8種操作,5根地址線尋址空間為32B。</p><p>  指令的前三位為操作碼,后5位為操作數(shù)的地址,尋址方式只設(shè)計了直接尋址。詳細(xì)如下表:</p><p><b>  表2-1</b></p><p>  第3章 各模塊的設(shè)計及實現(xiàn)</p><p><b>  3.1時鐘發(fā)生器:</b>&l

22、t;/p><p>  時鐘發(fā)生器clk-gen的波形見下圖:</p><p>  Verilog代碼:</p><p>  module  clk_gen(clk,reset,fetch,alu_clk,clk1);</p><p>  input  clk,reset;</p><p&

23、gt;  output  fetch,alu_clk,clk1;</p><p>  wire  clk,reset;</p><p>  reg  fetch,alu_clk;</p><p>  reg[7:0]  state;</p><p>  param

24、eterSSS0  =  8'b00000000,</p><p>  SSS1  =  8'b00000001,</p><p>  SSS2  =  8'b00000010</p><p>  SSS3 &#

25、160;=  8'b00000100</p><p>  SSS4  =  8'b00001000,</p><p>  SSS5  =  8'b00010000,</p><p>  SSS6  =  

26、8'b00100000,</p><p>  SSS7  =  8'b01000000,</p><p>  SSS8  =  8'b10000000;</p><p>  assign  clk1  = 

27、0;clk;</p><p>  always  @  (posedge  clk)</p><p><b>  if(reset)</b></p><p><b>  begin</b></p><p>  fetch 

28、0; <=  0;</p><p>  alu_clk  <=  0;</p><p>  state  <=  SSS0;</p><p><b>  end</b></p><p><

29、b>  else</b></p><p><b>  begin</b></p><p>  case(state)</p><p><b>  SSS0:</b></p><p><b>  begin</b></p><p>  s

30、tate  <=  SSS1;</p><p><b>  end</b></p><p><b>  SSS1:</b></p><p><b>  begin</b></p><p>  fetch<=~fetch;<

31、;/p><p>  state<=SSS2;</p><p><b>  end</b></p><p><b>  SSS2:</b></p><p><b>  begin</b></p><p>  state<=SSS3;</p&g

32、t;<p><b>  end</b></p><p><b>  SSS3:</b></p><p><b>  begin</b></p><p>  state<=SSS4;</p><p><b>  end</b></p

33、><p><b>  SSS4:</b></p><p><b>  begin</b></p><p>  state<=SSS5;</p><p><b>  end</b></p><p><b>  SSS5:</b>&l

34、t;/p><p><b>  begin</b></p><p>  fetch<=~fetch;</p><p>  state<=SSS6;</p><p><b>  end</b></p><p><b>  SSS6:</b></

35、p><p><b>  begin</b></p><p>  alu_clk<=~alu_clk;</p><p>  state<=SSS7;</p><p><b>  end</b></p><p><b>  SSS7:</b><

36、/p><p><b>  begin</b></p><p>  alu_clk<=~alu_clk;</p><p>  state<=SSS8;</p><p><b>  end</b></p><p><b>  SSS8:</b><

37、;/p><p><b>  begin</b></p><p>  state<=SSS1;</p><p><b>  end</b></p><p>  default:state<=8’bxxxxxxxx;</p><p><b>  endcase&

38、lt;/b></p><p><b>  end</b></p><p><b>  endmodule</b></p><p><b>  3.2 程序計數(shù)器</b></p><p>  程序計數(shù)器用于提供指令地址,以便讀取指令,指令按地址順序存放在存儲器中。有兩種途徑

39、可形成指令地址:其一是順序執(zhí)行的情況,其二是遇到要改變書序指令的情況,例如執(zhí)行JMP指令后,需要形成新的指令地址。</p><p>  復(fù)位后,指令指針為零,即每次CPU重新啟動將從ROM的零地址開始讀取指令并執(zhí)行。每條指令執(zhí)行完需1個時鐘,這時pc_addr已被增1,指向下一條指令。如果正執(zhí)行的指令是跳轉(zhuǎn)語句,這時CPU狀態(tài)控制器將會輸出load_pc信號,通過load口進入程序計數(shù)器。程序計數(shù)器(pc_add

40、r)將裝入目標(biāo)地址(ir_addr),而不是增1.</p><p>  verilog代碼:</p><p>  module   counter   (   pc_addr,   ir_addr,   load,</p>&l

41、t;p>  clock,   rst);</p><p>  output   [4:0]   pc_addr;</p><p>  input   [4:0]   ir_addr;</p><p>  inpu

42、t   load,   clock,   rst;</p><p>  reg   [4:0]   pc_addr;</p><p>  always  @  (  posedge&

43、#160; clock  or  posedge  rst  )</p><p><b>  begin</b></p><p><b>  if(rst)</b></p><p>  pc_addr<=0;</p>

44、<p><b>  else</b></p><p><b>  if(load)</b></p><p>  pc_addr<=ir_addr;</p><p><b>  else</b></p><p>  pc_addr  

45、60;<=   pc_addr   +   1;</p><p><b>  end</b></p><p><b>  endmodule</b></p><p><b>  3.3 指令寄存器</b>&

46、lt;/p><p>  指令寄存器的觸發(fā)時鐘是clk1,在clk1的正沿觸發(fā)下,寄存器將數(shù)據(jù)總線送來的指令存入opcode(高3位)或ir_addr(低5位)中。但并不是每個clk1的上升沿都寄存數(shù)據(jù)總線的數(shù)據(jù),因為數(shù)據(jù)總線上有時傳輸指令,有時傳輸數(shù)據(jù)。什么時候寄存,什么時候不寄存CPU狀態(tài)控制器的load_ir信號控制。load_ir信號通過ena口輸入到指令寄存器。復(fù)位后,指令寄存器被清為零。</p>

47、<p>  Verilog代碼:</p><p><b>  module</b></p><p>  output[2:0] opcode;</p><p>  output   [4:0]   ir_addr;</p><p>  input&

48、#160;  [7:0]   data;</p><p>  input   ena,   clk,   rst;</p><p>  reg   [2:0]   opcode;</p&

49、gt;<p>  reg   [4:0]   ir_addr;</p><p>  always   @   (posedge   clk)</p><p><b>  begin</b></p>

50、;<p><b>  if(rst)</b></p><p><b>  begin</b></p><p>  opcode<=3'b000;</p><p>  ir_addr<=5'b00000;</p><p><b>  end</

51、b></p><p><b>  else</b></p><p><b>  begin</b></p><p><b>  if(ena)</b></p><p><b>  begin</b></p><p>  opc

52、ode<=data[7:5];</p><p>  ir_addr<=data[4:0];</p><p><b>  end</b></p><p><b>  end</b></p><p><b>  end</b></p><p>&

53、lt;b>  endmodule</b></p><p><b>  3.4運算器</b></p><p>  根據(jù)8種不同的操作碼分別實現(xiàn)相應(yīng)的運算,結(jié)果由alu_out輸出。</p><p>  verilog代碼:</p><p>  module   alu

54、0;  (alu_out   ,zero,   bz,data,</p><p>  accum,alu_clk,   opcode);</p><p>  output   [7:0]alu_out;</p><p>  ou

55、tput   zero,bz;</p><p>  input   [7:0]   data,   accum;</p><p>  input   [2:0]   opcode;</p><

56、p>  input   alu_clk;</p><p>  reg   [7:0]   alu_out,tmp;</p><p>  reg   bzt;</p><p>  initial   bzt=0;&

57、lt;/p><p>  parameterDIV=3'b000,</p><p>  JMP=3'b001,</p><p>  ADD=3'b010,</p><p>  SUB   =3'b011,</p><p>  MUL  

58、 =3'b100,</p><p>  LDA=3'b101,</p><p>  STO=3'b110,</p><p>  JA=3'b111;</p><p>  assign   zero=!accum;</p><p>  alwa

59、ys   @(posedge   alu_clk)</p><p><b>  begin</b></p><p>  casex   (opcode)</p><p>  DIV:   alu_out<=accum/d

60、ata;</p><p>  JMP:   alu_out<=accum;</p><p>  ADD:   alu_out<=data+accum;</p><p>  SUB:   alu_out<=accum-data;</p><p

61、><b>  MUL:begin</b></p><p><b>  if(!bzt)</b></p><p><b>  begin</b></p><p>  {tmp,alu_out}<=data*accum;</p><p><b>  bzt&l

62、t;=1;</b></p><p><b>  end</b></p><p><b>  else</b></p><p><b>  begin</b></p><p>  alu_out<=tmp;</p><p><b&g

63、t;  bzt<=0;</b></p><p><b>  end</b></p><p><b>  end</b></p><p>  LDA:   alu_out<=data;</p><p>  STO:   

64、;alu_out<=accum;</p><p>  JA:   alu_out<=accum;</p><p>  default:   alu_out<=8'bxxxx_xxxx;</p><p><b>  endcase</b></p>

65、<p><b>  end</b></p><p>  assign   bz=bzt;</p><p><b>  endmodule</b></p><p><b>  3.5 累加器</b></p><p>  累加器用于存放當(dāng)前的

66、結(jié)果,它也是alu其中一個數(shù)據(jù)來源。復(fù)位后,累加器的值是零。當(dāng)累加器通過ena口收到來自cpu狀態(tài)控制器load_acc信號時,在clk1時鐘正跳沿就收到來自于數(shù)據(jù)總線的數(shù)據(jù)。</p><p>  verilog代碼:</p><p>  module   accum(   accum,   data

67、,   ena,   clk,   rst);</p><p>  output[7:0]   accum;</p><p>  input[7:0]   data;</p><p>  input 

68、0; ena,clk,rst;</p><p>  reg[7:0]   accum;</p><p>  always   @   (posedge   clk)</p><p><b>  begin</b>&l

69、t;/p><p><b>  if(rst)</b></p><p>  accum<=8'b0000_0000;</p><p><b>  //Reset</b></p><p><b>  else</b></p><p>  if(en

70、a)        //當(dāng) CPU 狀態(tài)控制器發(fā)</p><p>  出 load_acc 信號</p><p>  accum<=data;          &#

71、160;  //接收來自</p><p><b>  ALU 的數(shù)據(jù)</b></p><p><b>  end</b></p><p><b>  endmodule</b></p><p><b>  3.6 地址選擇器</b&

72、gt;</p><p>  地址選擇器用于選擇輸出的地址是pc(程序計數(shù))地址還是數(shù)據(jù)/端口地址。每個指令周期的前4個時鐘周期用于從ROM中讀取指令,輸出的應(yīng)是PC地址。后4個時鐘周期用于對RAM或端口的讀寫,該地址由指令中給出。地址的選擇輸出信號有fetch提供。</p><p>  verilog代碼:</p><p><b>  module<

73、/b></p><p>  addrchoose(addr,fetch,ir_addr,pc_addr);</p><p>  output   [4:0]   addr;</p><p>  input   [4:0]   ir_addr,

74、   pc_addr;</p><p>  inputfetch;</p><p>  assign    addr   =   (fetch)?    pc_addr   :</p&

75、gt;<p><b>  ir_addr;</b></p><p><b>  endmodule</b></p><p>  3.7 數(shù)據(jù)選擇器:</p><p>  累加器的數(shù)據(jù)只有在需要往RAM區(qū)或輸出口寫時才允許輸出,否則應(yīng)呈現(xiàn)高阻態(tài),以允許其它部件使用數(shù)據(jù)總線。所以任何部件往總線上輸出數(shù)據(jù)時,都需要

76、一控制信號。而此控制信號的啟停,則由CPU狀態(tài)控制器輸出的各信號控制決定。數(shù)據(jù)控制器何時輸出累加器的數(shù)據(jù)則由狀態(tài)控制器輸出的控制信號datactl_ena決定。</p><p>  verilog代碼:</p><p>  module datactl (data,in,ena);</p><p>  output [7:0] data;</p

77、><p>  input [7:0] in;</p><p>  input ena;</p><p>  assign data = (ena)? in : 8'bzzzz_zzzz;</p><p><b>  endmodule</b></p><p><

78、;b>  3.8 控制器</b></p><p>  控制器是CPU的控制核心,用于產(chǎn)生一系列的控制信號,啟動或停止某些部件。CPU何時進行讀指令讀寫I/O端口,RAM區(qū)等操作,都是由狀態(tài)機來控制的。狀態(tài)機的當(dāng)前狀態(tài),由變量state記錄,state的值就是當(dāng)前這個指令周期中已經(jīng)過的時鐘數(shù)。</p><p>  第1個時鐘:讀指令,將 rd 與 load_ir 置高電平,

79、其余為低電平。此時地址輸出的是 PC,所以會將PC 所指的 ROM 里的數(shù)據(jù)取到數(shù)據(jù)總線,并分開存入指令寄存器中。</p><p><b>  第2個時鐘:同上。</b></p><p>  第3個時鐘:空,輸出全低。</p><p>  第4個時鐘:PC 加 1,將 inc_pc 置高電平,其余為低電平。</p><p&g

80、t;  第5個時鐘:這個時鐘 fetch 翻轉(zhuǎn),由高變低,開始分析操作碼并輸出相應(yīng)的信號。</p><p>  第6個時鐘:這個時鐘 alu_clk 翻轉(zhuǎn),由低變高,alu 分析操作碼并進行相應(yīng)運算,繼續(xù)分析操作碼并輸出相應(yīng)的信號。</p><p><b>  第7個時鐘:空。</b></p><p>  第8個時鐘:空,輸出全低。</p

81、><p>  verilog代碼:</p><p>  modulemachine(inc_pc,load_acc,load_pc,rd,wr,load_ir,datactl_ena,clk,zero,rst,opcode ,bz);</p><p>  output inc_pc, load_acc, load_pc, rd, wr, loa

82、d_ir ,datactl_ena;</p><p>  input clk, zero, rst,bz;</p><p>  input [2:0] opcode;</p><p>  reg inc_pc, load_acc, load_pc, rd, wr, load_ir, datactl_ena;<

83、/p><p>  reg [7:0] state;</p><p>  parameterDIV= 3'b000,</p><p>  JMP= 3'b001,</p><p>  ADD= 3'b010,</p><p>  SUB= 3'b011,<

84、;/p><p>  MUL= 3'b100,</p><p>  LDA= 3'b101,</p><p>  STO= 3'b110,</p><p>  JA= 3'b111;</p><p>  parameterSS0 = 8'b000000

85、00,</p><p>  SS1 = 8'b00000001,</p><p>  SS2 = 8'b00000010,</p><p>  SS3 = 8'b00000100,</p><p>  SS4 = 8'b00001000,</p><p>

86、  SS5 = 8'b00010000,</p><p>  SS6 = 8'b00100000,</p><p>  SS7 = 8'b01000000,</p><p>  SS8 = 8'b10000000;</p><p>  always @( posedge

87、 clk )</p><p><b>  begin</b></p><p>  if ( rst )//接收到復(fù)位信號 RST,進行復(fù)位操作</p><p><b>  begin</b></p><p>  state<=SS0;</p><p&g

88、t;  {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p>  {wr,load_ir,datactl_ena}<=3'b000;</p><p><b>  end</b></p><p><b>  else</b></p><p

89、><b>  begin</b></p><p>  case(state)</p><p><b>  SS0:</b></p><p><b>  begin</b></p><p>  state<=SS1;</p><p><b

90、>  end</b></p><p>  SS1://讀指令</p><p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b0001;</p><p>  {wr,load_ir,datactl_ena}<=3

91、'b010;</p><p>  state<=SS2;</p><p><b>  end</b></p><p><b>  SS2:</b></p><p><b>  begin</b></p><p>  {inc_pc,load

92、_acc,load_pc,rd}<=4'b0001;</p><p>  {wr,load_ir,datactl_ena}<=3'b010;</p><p>  state<=SS3;</p><p><b>  end</b></p><p><b>  SS3:</b

93、></p><p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p>  {wr,load_ir,datactl_ena}<=3'b000;</p><p>  state<=SS4;&

94、lt;/p><p><b>  end</b></p><p>  SS4://pc+1</p><p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b1000;</p><p>  {wr,

95、load_ir,datactl_ena}<=3'b000;</p><p>  state<=SS5;</p><p><b>  end</b></p><p>  SS5://fetch 翻轉(zhuǎn)</p><p><b>  begin</b></p><

96、;p>  if(opcode==JA && zero==1)</p><p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b0010;</p><p>  {wr,load_ir,datactl_ena}<=3'b0

97、00;</p><p><b>  end</b></p><p><b>  else</b></p><p>  if( opcode==JMP)</p><p><b>  begin</b></p><p>  {inc_pc,load_ac

98、c,load_pc,rd}<=4'b0010;</p><p>  {wr,load_ir,datactl_ena}<=3'b000;</p><p><b>  end</b></p><p><b>  else</b></p><p>  if( opcode==A

99、DD || opcode==SUB || opcode==MUL || opcode==LDA||opcode==DIV)</p><p><b>  begin</b></p><p><b>  if(!bz)</b></p><p><b>  begin</b></p>

100、<p>  {inc_pc,load_acc,load_pc,rd}<=4'b0001;</p><p>  {wr,load_ir,datactl_ena}<=3'b000;</p><p><b>  end</b></p><p><b>  else</b></p&g

101、t;<p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p>  {wr,load_ir,datactl_ena}<=3'b001;</p><p><b>  end</b></

102、p><p><b>  end</b></p><p><b>  else</b></p><p>  if(opcode==STO)</p><p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,r

103、d}<=4'b0000;</p><p>  {wr,load_ir,datactl_ena}<=3'b001;</p><p><b>  end</b></p><p><b>  else</b></p><p><b>  begin</b>

104、</p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p>  {wr,load_ir,datactl_ena}<=3'b000;</p><p><b>  end</b></p><p>  state<=SS6;</p&

105、gt;<p><b>  end</b></p><p>  SS6://alu_clock上升</p><p><b>  begin</b></p><p>  if ( opcode==ADD||opcode==SUB||opcode==MUL||opcode==LDA ||opcode

106、==DIV)</p><p><b>  begin</b></p><p><b>  if(!bz)</b></p><p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b0101;<

107、;/p><p>  {wr,load_ir,datactl_ena}<=3'b000;</p><p><b>  end</b></p><p><b>  else</b></p><p><b>  begin</b></p><p> 

108、 {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p>  {wr,load_ir,datactl_ena}<=3'b101;</p><p><b>  end</b></p><p><b>  end</b></p><p>

109、<b>  else</b></p><p>  if( opcode==JMP)</p><p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b1010;</p><p>  {wr,load_ir,data

110、ctl_ena}<=3'b000;</p><p><b>  end</b></p><p><b>  else</b></p><p>  if(opcode==JA && zero==1)</p><p><b>  begin</b&g

111、t;</p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b1010;</p><p>  {wr,load_ir,datactl_ena}<=3'b000;</p><p><b>  end</b></p><p><b>  else</b

112、></p><p>  if(opcode==STO)</p><p><b>  begin</b></p><p>  //過一個時鐘后把 wr 變 1 就可寫到 RAM 中</p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p>&

113、lt;p>  {wr,load_ir,datactl_ena}<=3'b101;</p><p><b>  end</b></p><p><b>  else</b></p><p><b>  begin</b></p><p>  {inc_pc,l

114、oad_acc,load_pc,rd}<=4'b0000;</p><p>  {wr,load_ir,datactl_ena}<=3'b000;</p><p><b>  end</b></p><p>  state<=SS7;</p><p><b>  end<

115、/b></p><p><b>  SS7:</b></p><p><b>  begin</b></p><p>  if ( opcode==STO )</p><p><b>  begin</b></p><p>  {inc

116、_pc,load_acc,load_pc,rd}<=4'b0000;</p><p>  {wr,load_ir,datactl_ena}<=3'b001;</p><p><b>  end</b></p><p><b>  else</b></p><p>  if

117、 ( opcode==ADD||opcode==SUB||opcode==MUL||opcode==LDA||opcode==DIV)</p><p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b0001;</p><p>  {wr,load_ir,d

118、atactl_ena}<=3'b000;</p><p><b>  end</b></p><p><b>  else</b></p><p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,rd}<

119、=4'b0000;</p><p>  {wr,load_ir,datactl_ena}<=3'b001;</p><p><b>  end</b></p><p>  state<=SS8;</p><p><b>  end</b></p><p

120、><b>  SS8:</b></p><p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,rd}<=4'b0000;</p><p>  {wr,load_ir,datactl_ena}<=3'b000;</p>&

121、lt;p>  state<=SS1;</p><p><b>  end</b></p><p><b>  default:</b></p><p><b>  begin</b></p><p>  {inc_pc,load_acc,load_pc,rd}<

122、;=4'b0000;</p><p>  {wr,load_ir,datactl_ena}<=3'b000;</p><p>  state<=8'bxxxxxxxx;</p><p><b>  end</b></p><p><b>  endcase</b>

123、</p><p><b>  end</b></p><p><b>  end</b></p><p><b>  endmodule</b></p><p><b>  3.9 ROM</b></p><p>  這里的 ROM

124、 不是真正的 ROM,只是是一種用 verilog 語言模擬的 ROM,代碼如下:</p><p>  module rom( data, addr, rd, ena );</p><p>  output [7:0] data;</p><p>  input [4:0] addr;</p><p>  input r

125、d, ena;</p><p>  reg [7:0] memory [31:0];</p><p>  wire [7:0] data;</p><p><b>  initial</b></p><p><b>  begin</b></p><p>  me

126、mory[0]=8'b 101_00000; //(00H)→ A</p><p>  memory[1]=8'b 100_00001; // A*(01H) →TA</p><p>  memory[2]=8'b 100_11100; // T → 1CH</p><p>  memory[3]=8'b 110_11

127、101; // A → 1DH</p><p>  memory[4]=8'b 001_00000; // 00H → PC</p><p>  //1CH:輸出口 0,1DH:輸出口 1</p><p><b>  end</b></p><p>  assign data= ( rd

128、 && ena )? memory[addr] : 8'bzzzzzzzz;</p><p><b>  endmodule</b></p><p><b>  3.10 RAM</b></p><p>  verilog代碼:</p><p>  module r

129、am( data, addr, ena, rd, wr );</p><p>  inout [7:0] data;</p><p>  input [4:0] addr;</p><p>  input ena;</p><p>  input rd, wr;</p><p>  reg

130、[7:0] ram [27:0];</p><p><b>  initial</b></p><p><b>  begin</b></p><p>  ram[0]=250;</p><p>  ram[1]=100;</p><p><b>  end&l

131、t;/b></p><p>  assign data = ( rd && (!ena) )? ram[addr] :8'hzz;</p><p>  always @ (posedge wr)</p><p><b>  begin</b></p><p>  ram[add

132、r]<=data;</p><p><b>  end</b></p><p><b>  endmodule</b></p><p>  第4章 CPU的測試:</p><p>  這里增加兩個數(shù)碼管譯碼輸出口,連接如下:</p><p>  其功能是將輸入的8位數(shù)據(jù)

133、譯碼供數(shù)碼管顯示。</p><p>  verilog代碼:</p><p><b>  module</b></p><p>  shuamguan(data_in,leda,ledb,ena,wr,addr);</p><p>  input  [7:0]  data_in;&

134、lt;/p><p>  input  ena,wr,addr;</p><p>  output  [7:0]  leda,ledb;</p><p>  reg  [7:0]  leda,ledb;</p><p>  reg 

135、0;[3:0]  high,low;</p><p>  always  @  (  wr  or  ena  or  addr  )</p><p><b>  begin</b><

136、/p><p>  if((!ena)  &&  wr  &&  addr)</p><p><b>  begin</b></p><p>  high = data_in[7:4];</p><p>  lo

137、w = data_in[3:0];</p><p>  case(high)</p><p>  8'd0: leda = 8'b11111100;</p><p>  8'd1: leda = 8'b01100000;</p><p>  8'd2: leda = 8'b110110

138、10;</p><p>  8'd3: leda = 8'b11110010;</p><p>  8'd4: leda = 8'b01100110;</p><p>  8'd5: leda = 8'b10110110;</p><p>  8'd6: leda = 8&#

139、39;b10111110;</p><p>  8'd7: leda = 8'b11100000;</p><p>  8'd8: leda = 8'b11111110;</p><p>  8'd9: leda = 8'b11110110;</p><p>  8'd

140、10: leda = 8'b11101110;</p><p>  8'd11: leda = 8'b00111110;</p><p>  8'd12: leda = 8'b10011100;</p><p>  8'd13: leda = 8'b01111010;</p>

141、<p>  8'd14: leda = 8'b10011110;</p><p>  8'd15: leda = 8'b10001110;</p><p>  default : leda=8'hx;</p><p><b>  endcase</b></p>

142、<p><b>  case(low)</b></p><p>  8'd0: ledb = 8'b11111100;</p><p>  8'd1: ledb = 8'b01100000;</p><p>  8'd2: ledb = 8'b11011010;</p>&

143、lt;p>  8'd3: ledb = 8'b11110010;</p><p>  8'd4: ledb = 8'b01100110;</p><p>  8'd5: ledb = 8'b10110110;</p><p>  8'd6: ledb = 8

144、'b10111110;</p><p>  8'd7: ledb = 8'b11100000;</p><p>  8'd8: ledb = 8'b11111110;</p><p>  8'd9: ledb = 8'b11110110;</p><p>  8'

145、;d10: ledb = 8'b11101110;</p><p>  8'd11: ledb = 8'b00111110;</p><p>  8'd12: ledb = 8'b10011100;</p><p>  8'd13: ledb = 8'b01111010;</p&g

146、t;<p>  8'd14: ledb = 8'b10011110;</p><p>  8'd15: ledb = 8'b10001110;</p><p>  default : ledb=8'hx;</p><p><b>  endcase</b></p>

147、<p><b>  end</b></p><p><b>  end</b></p><p><b>  endmodule</b></p><p><b>  測試用例:</b></p><p><b>  乘法</b&g

148、t;</p><p><b>  ROM:</b></p><p>  //1CH:輸出口 0 的地址,1DH:輸出口 1 的地址</p><p>  memory[0]=8'b 101_00000; //(00H)→ A</p><p>  memory[1]=8'b 100_00001; /

149、/ A*(01H) → TA</p><p>  memory[2]=8'b 100_11101; // T → 1DH</p><p>  memory[3]=8'b 110_11100; // A → 1CH</p><p>  memory[4]=8'b 001_00000; // 00H → PC&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論