在上節實驗中的計數器是乙個16進製制的計數器,只能從0計到15。這節做類似秒錶的計數器從0計到59。
如果用軟體來實現這個任務是很簡單的:只需相除和取餘運算就可以得到十進位制數。實際上這些運算器相對實現起來成本較高。使用硬體實現,完成十進位制計數。首先,建立乙個模組代表十進位制數。輸出bcd(bingary coded decimal)。**:
`timescale 1ns/1ns
module bcd_digit
#(parameter modulus = 10
)( input clk,
input carry_in,
output reg [$clog2(modulus)-1:0] digit,
output carry_out
);initial digit = 0;
assign carry_out = carry_in && digit == modulus-1;
always @(posedge clk)
if (carry_in)
if (carry_out)
digit <= 0;
else
digit <= digit+1;
endmodule
引數modulus代表計數的最大值,carry_in為計數輸入。carry_out可以作為進製訊號輸出。由於這裡使用的是引數modulus,不能確定輸出的位寬。所以使用內嵌函式$clog2以2為底取對數,來確定訊號位寬。
由此修改上節實驗中的top檔案:
wire [7:0] sec_count;
wire ones_carry_out;
bcd_digit #(10) ones_digit
(.clk(clk),
.carry_in(sec_pulse),
.digit(sec_count[3:0]),
.carry_out(ones_carry_out)
);bcd_digit #(6) tens_digit
(.clk(clk),
.carry_in(ones_carry_out),
.digit(sec_count[6:4]),
.carry_out()
);assign sec_count[7] = 0
;
由於計數最大值為59,即十位最大值為5。所以這裡只用了3為來代表十位數值sec_count[6:4]。
由於測試模組是軟體實現,所以使用了整除和取餘操作。
`timescale 1ns/1ns
module
model
#(parameter ms_limit = 100000
)( input clk,
output [7
:0] seconds
);integer counter = 0;
always @(posedge clk)
counter <= counter+1;
reg [7
:0] seconds_value;
always @(posedge clk)
seconds_value <= (counter / (ms_limit * 1000))%60;
assign seconds[3
:0] = seconds_value % 10;
assign seconds[7
:4] = seconds_value / 10;
endmodule
原文連線 實驗七 訊號
專案 內容所屬課程 作業要求 學號姓名 17043215賴長江 學習目標 1.了解訊號的概念。2.掌握訊號處理的方法。1.編寫乙個簡單的程式並執行,然後向該程序傳送不同的訊號以觀察該程序對接收到訊號的反應。在終端編譯並執行該程式,我們可以在當前終端通過按鍵組合向該程序傳送訊號 ctrl c ctrl...
實驗七作業
part 2 驗證性實驗2 未修改前結果 修改後 所以修改後沒有區別。2 文字檔案和二進位制檔案的區別 二進位制檔案 把記憶體中的資料按記憶體的儲存形式原樣輸出到儲存器存放,可節省外存空間和儲存時間,但不能直接輸出字元格式,不能直接用記事本開啟。程式設計練習 include include incl...
實驗七 訊號
專案 內容這個作業屬於哪個課程 這個作業的要求在 學號 姓名 17041530 嚴喆皓 作業學習目標 1 了解訊號的概念 2 掌握訊號處理的方法 1.編寫乙個簡單的程式並執行,然後向該程序傳送不同的訊號以觀察該程序對接收到訊號的反應。1 在當前終端通過按鍵組合向該程序傳送訊號 ctrl c ctrl...