實(shí)驗(yàn)22 4位串行累加器

 行業(yè)動(dòng)態(tài)     |      2023-10-16 16:09:55    |      作者

實(shí)驗(yàn)?zāi)康?/h2>
  • (1)熟悉和掌握FPGA開發(fā)流程和Lattice Diamond軟件使用方法;
  • (2)通過實(shí)驗(yàn)了解累加器的意義及原理方法
  • (3)掌握使用Verilog HDL語言基于FPGA實(shí)現(xiàn)累加器的原理及實(shí)現(xiàn)方法

實(shí)驗(yàn)任務(wù)

設(shè)計(jì)一個(gè)4位串行累加器,電路原理框圖如圖所示,在開關(guān)K處設(shè)置串行輸入數(shù)據(jù),在CP端輸入8個(gè)脈沖,將完成一次,兩個(gè)四位串行數(shù)據(jù)的相加,結(jié)果存D-A中。

實(shí)驗(yàn)原理

根據(jù)上述電路框圖,可以分割系統(tǒng)任務(wù)。

累加器是一個(gè)具有特殊功能的二進(jìn)制寄存器,可以存放計(jì)算產(chǎn)生的中間結(jié)果,省去了計(jì)算單元的讀取操作,能加快計(jì)算單元的速度。串行累加器是由移位寄存器和全加器組成的一個(gè)求和電路。由題目給出的要求可以分析組合邏輯電路一是一個(gè)全加器電路;組合邏輯電路二和組合邏輯電路三加上JK觸發(fā)器組成了加法超前進(jìn)位電路,D-A是儲(chǔ)存結(jié)果的寄存器。

頂層模塊由4個(gè)模塊組成:

Shift U1模塊;輸入的串行寄存器,把輸入的串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù)寄存

Adder U2模塊:一位的二進(jìn)制全加器模塊,輸入的進(jìn)位信號(hào)由超前進(jìn)位邏輯產(chǎn)生

Ahead U3模塊:超前進(jìn)位邏輯,根據(jù)題目要求用JK觸發(fā)器產(chǎn)生超前進(jìn)位

Shift U4模塊:一位全加器輸出再移位輸出保存在4位寄存器中

Verilog HDL建模描述

設(shè)計(jì)文件accum4.v

moduleaccum4 ( inputwiredatain,//數(shù)據(jù)輸入 inputwireclk,rst,//脈沖和復(fù)位輸入信號(hào) outputwire[3:0]sum//累加結(jié)果 ); wire[3:0]adder;//寄存器1,存儲(chǔ)輸入加數(shù)內(nèi)容 wire[3:0]sumer;//寄存器2,存儲(chǔ)被加數(shù)內(nèi)容 wirecin;//全加器超前進(jìn)位信號(hào) wiresumout;//全加器輸出 assignsum=sumer;//累加結(jié)果輸出 shiftu1//移位寄存器,把數(shù)據(jù)存入加數(shù)寄存器 ( .clk(clk), .rst(rst), .datain(datain), .dataout(adder) ); adder1u2//全加器,兩個(gè)寄存器的最低位相加,進(jìn)位由超前進(jìn)位邏輯輸出 ( .a(sumer[0]), .b(adder[0]), .cin(cin),.sum(sumout), .cout());aheadu3//超前進(jìn)位邏輯,產(chǎn)生進(jìn)位信號(hào) ( .a(sumer[0]),.b(adder[0]),.clk(clk),.rst(rst), .q(cin) ); shiftu4//移位寄存器,將全加器結(jié)果存入被加數(shù)寄存器 ( .clk(clk), .rst(rst), .datain(sumout), .dataout(sumer) ); endmodule

頂層文件里面例化了shift.v、adder1.v、ahead.v等模塊,其中全加器和移位寄存器的源碼文件在前面章節(jié)有介紹我們看看超前進(jìn)位邏輯的源碼ahead.v

//Description:超前進(jìn)位邏輯產(chǎn)生 // JK觸發(fā)器:Qi+1=J!Qi+!KQi // 全加器進(jìn)位:Ci+1=AiBi+(Ai+Bi)Ci=AiBi!Ci+!(Ai+Bi)Ci // 推導(dǎo)得出:J=AiBi,K=!(Ai+Bi) //******************************************************** moduleahead ( inputwirea,b,clk,rst, outputwireq ); wirej,k;jk_ffu1//例化JK觸發(fā)器 ( .clk(clk),.j(j),.k(k),.rst(rst),.set(), .q(q),.qb() ); assignj=a&b;//根據(jù)推導(dǎo)得到J,K與加法器輸入信號(hào)邏輯關(guān)系 assignk=~(a|b); endmodule

仿真文件accum4_tb.v

`timescale1ns/100ps//仿真時(shí)間單位/時(shí)間精度 moduleaccum4_tb(); regclk,rst,datain; reg[7:0]data; wire[3:0]sum;//初始化過程塊 initial begin clk=0; rst=0; data<=8'b00100001;//串行輸入數(shù)據(jù)初值 #25 rst=1; end always#10clk=~clk; always@(posedgeclk)//產(chǎn)生串行輸入數(shù)據(jù) datain if(!rst) begin datain<=0; end else begin data<={0,data[7:1]}; datain<=data[0]; end //module調(diào)用例化格式 accum4u1 ( .clk (clk), .rst (rst), .datain(datain), .sum (sum) ); endmodule

實(shí)驗(yàn)步驟

  1. 打開Lattice Diamond,建立工程。
  2. 新建Verilog HDL設(shè)計(jì)文件,并鍵入設(shè)計(jì)代碼,包括添加需要調(diào)用的模塊文件。
  3. 根據(jù)仿真教程,實(shí)現(xiàn)對(duì)本工程的仿真,驗(yàn)證仿真結(jié)果是否與預(yù)期相符。
  4. 如果仿真無誤,構(gòu)建并輸出編程文件,燒寫至FPGA的Flash之中。
  5. 觀察輸出結(jié)果。

仿真結(jié)果和實(shí)驗(yàn)現(xiàn)象

仿真結(jié)果如下圖所示:

仿真文件的串行輸入數(shù)據(jù)也是靠串行轉(zhuǎn)并行移位寄存器輸入,所以累加器計(jì)算的時(shí)鐘要順延8個(gè)clock得到結(jié)果??梢孕薷姆抡嫖募械拇休斎霐?shù)據(jù)初值驗(yàn)證累加器結(jié)果。