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.序列加法器與並行加法器加法器有序列和並行之分。序列加法器中,只有乙個全加器,資料逐位序列送入加法器進行運算 並行加法器則由多個全加器組成,其位數的多少取決於機器的字長...