實驗九 8位硬體加法器的設計

2021-06-07 08:29:00 字數 4320 閱讀 6108

module key_led(clock,key,led,hex,bin,seg,dig,ledin,data);

input clock; //系統時鐘(48mhz)

input[7:0] key; //按鍵輸入(key1~key8)

output[7:0] led; //led輸出(led1~led8)

output[15:0]hex; //4位16進製制數輸出(在數碼管1~4顯示)

output[3:0]bin; //4位2進製數輸出(在led1~led4顯示)

output[7:0]seg; //數碼管段碼輸出

output[7:0]dig; //數碼管位碼輸出

input[3:0]ledin; //led顯示輸入(在led5~led8顯示)

input[15:0]data; //數碼管顯示輸出(在數碼管5~8顯示)

reg[15:0]hex_r;

reg[3:0]bin_r;

reg[7:0]seg_r;

reg[7:0]dig_r;

reg[16:0]count; //時鐘分頻計數器

reg[7:0]dout1,dout2,dout3,buff; //消抖暫存器

reg[2:0]cnt3; //數碼管掃瞄計數器

reg[3:0]disp_dat; //數碼管掃瞄視訊記憶體

reg div_clk; //分頻時鐘,用於消抖和掃瞄

wire[7:0]key_edge; //按鍵消抖輸出

//訊號輸出

assign hex = hex_r;

assign bin = bin_r;

assign seg = seg_r;

assign dig = dig_r;

assign led = ~;

//時鐘分頻部分

always @(posedge clock)

begin

if (count < 17'd120000)

begin

count <= count + 1'b1;

div_clk <= 1'b0;

endelse

begin

count <= 17'd0;

div_clk <= 1'b1;

endend//按鍵消抖部分

always @(posedge clock)

begin

if(div_clk)

begin

dout1 <= key;

dout2 <= dout1;

dout3 <= dout2;

end

end//按鍵邊沿檢測部分

always @(posedge clock)

begin

buff <= dout1 | dout2 | dout3;

endassign key_edge = ~(dout1 | dout2 | dout3) & buff;

//4位16進製制數輸出部分

always @(posedge clock) //按鍵1

begin

if(key_edge[0])

hex_r[15:12] <= hex_r[15:12] + 1'b1;

endalways @(posedge clock) //按鍵2

begin

if(key_edge[1])

hex_r[11:8] <= hex_r[11:8] + 1'b1;

endalways @(posedge clock) //按鍵3

begin

if(key_edge[2])

hex_r[7:4] <= hex_r[7:4] + 1'b1;

endalways @(posedge clock) //按鍵4

begin

if(key_edge[3])

hex_r[3:0] <= hex_r[3:0] + 1'b1;

end//4位2進製數輸出部分

always @(posedge clock) //按鍵5

begin

if(key_edge[4])

bin_r[0] <= ~bin_r[0];

endalways @(posedge clock) //按鍵6

begin

if(key_edge[5])

bin_r[1] <= ~bin_r[1];

endalways @(posedge clock) //按鍵7

begin

if(key_edge[6])

bin_r[2] <= ~bin_r[2];

endalways @(posedge clock) //按鍵8

begin

if(key_edge[7])

bin_r[3] <= ~bin_r[3];

end//數碼管掃瞄顯示部分

always @(posedge clock) //定義上公升沿觸發程序

begin

if(div_clk)

cnt3 <= cnt3 + 1'b1;

endalways @(posedge clock)

begin

if(div_clk)

begin

case(cnt3) //選擇掃瞄顯示資料

3'd0:disp_dat = hex_r[15:12]; //第乙個數碼管

3'd1:disp_dat = hex_r[11:8]; //第二個數碼管

3'd2:disp_dat = hex_r[7:4]; //第三個數碼管

3'd3:disp_dat = hex_r[3:0]; //第四個數碼管

3'd4:disp_dat = data[15:12]; //第五個數碼管

3'd5:disp_dat = data[11:8]; //第六個數碼管

3'd6:disp_dat = data[7:4]; //第七個數碼管

3'd7:disp_dat = data[3:0]; //第八個數碼管

endcase

case(cnt3) //選擇數碼管顯示位

3'd0:dig_r = 8'b01111111; //選擇第乙個數碼管顯示

3'd1:dig_r = 8'b10111111; //選擇第二個數碼管顯示

3'd2:dig_r = 8'b11011111; //選擇第三個數碼管顯示

3'd3:dig_r = 8'b11101111; //選擇第四個數碼管顯示

3'd4:dig_r = 8'b11110111; //選擇第五個數碼管顯示

3'd5:dig_r = 8'b11111011; //選擇第六個數碼管顯示

3'd6:dig_r = 8'b11111101; //選擇第七個數碼管顯示

3'd7:dig_r = 8'b11111110; //選擇第八個數碼管顯示

endcase

endendalways @(disp_dat)

begin

case(disp_dat) //七段解碼

4'h0:seg_r = 8'hc0; //顯示0

4'h1:seg_r = 8'hf9; //顯示1

4'h2:seg_r = 8'ha4; //顯示2

4'h3:seg_r = 8'hb0; //顯示3

4'h4:seg_r = 8'h99; //顯示4

4'h5:seg_r = 8'h92; //顯示5

4'h6:seg_r = 8'h82; //顯示6

4'h7:seg_r = 8'hf8; //顯示7

4'h8:seg_r = 8'h80; //顯示8

4'h9:seg_r = 8'h90; //顯示9

4'ha:seg_r = 8'h88; //顯示a

4'hb:seg_r = 8'h83; //顯示b

4'hc:seg_r = 8'hc6; //顯示c

4'hd:seg_r = 8'ha1; //顯示d

4'he:seg_r = 8'h86; //顯示e

4'hf:seg_r = 8'h8e; //顯示f

endcase

endendmodule

加法器的硬體實現

最基礎的加法器是半加器,它把兩個1位二進位制的運算元 x 和 y相加,得到乙個兩位和,用hs 表示和的較低位,進製輸出用co 表示,可以得到以下等式 hs x y co x y對於多於一位的二進位制加法,則必須要考慮進製的問題。s 行波加法器又叫做序列進製加法器,為 n 個全加器的級聯,但是這種加法...

從底層開始 1位加法器的搭建

這個系列主要用於記錄一些學習計算機底層架構的筆記與思考,若有錯漏,希望各位大佬指正 1位加法器的搭建 計算機不是天生就會進行數學計算的,對計算機而言,其進行計算的基礎是高低電位的轉換,所以計算機的底層是0和1,即二進位制。在了解1位加法器前,我們先要了解邏輯電路的基礎,即與門,非門和或門 與門 或門...

4位快速加法器設計 基本加減法運算器設計

基本的算邏運算部件 全加器 輸入端3個 ai,bi 本位運算元ci 1 低位來的進製輸出端2個 si 本位和ci 本位向高位的進製2.序列加法器與並行加法器加法器有序列和並行之分。序列加法器中,只有乙個全加器,資料逐位序列送入加法器進行運算 並行加法器則由多個全加器組成,其位數的多少取決於機器的字長...