Zedboard 實驗七秒計數

2021-07-31 10:52:10 字數 1793 閱讀 6557

在上節實驗中的計數器是乙個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...