FPGA學習記錄_設計一個計數器
此處設計一個數器,使 學習板上 的 LED 狀態每 500ms翻轉一次。 學習板上晶振為50MHz,也就是說時鐘週期為 20ns , 這樣可以計算得出 500ms = 500_000_000ns/20,即需要計數器 計數 25_000_000 次,也就是需要一個至少 25 位的計數器( 位的計數器( 225>25_000_000>224 )。且每當計數次達到需要清零並重新計數。
1、計數器原理
計數是一種最簡單基本的運算,計數器就是實現這種運算的邏輯電路,計數器在數字系統中主要是對脈衝的個數進行計數,以實現測量、計數和控制的功能,同時兼有分頻功能,計數器是由基本的計數單元和一些控制門所組成,計數單元則由一系列具有儲存資訊功能的各類觸發器構成,這些觸發器有RS觸發器、T觸發器、D觸發器及JK觸發器等。
2、計數器verilog實現
埠名稱 I/0 功能描述
Clk50M input 模組的工作時鐘,頻率為50M
Rst_n input 模組復位,低電平復位
led output 低電平時LED亮
module counter(Clk50M,Rst_n,led);
input Clk50M; //系統時鐘
input Rst_n; //全域性復位
output reg led;//led 輸出
reg [24:0]cnt;//定義25位暫存器
//計數器計數程序
if(Rst_n == 1'b0)
cnt <= 25'b0;
else if(cnt == 25'd24_999_999)
cnt <= 25'b0;
else
cnt <= cnt + 1'b1;
//LED輸出控制程序 0.5s 翻轉一次
[email protected](posedge Clk50M or negedge Rst_n)
if(Rst_n == 1'b0)
led <= 1'b1;
else if(cnt == 25'd24_999_999)
led <= ~led ;
else
led <= led;
endmodule
3、模擬及板級驗證
`timescale 1ns/1ns
`define clock_period 20//時鐘週期
module counter_tb;
reg clk;
reg rst_n;
wire led;
counter counter0(
.Clk50M(clk),
.Rst_n(rst_n),
.led(led)
);
initial clk = 1;
always #(`clock_period/2) clk = ~clk;
initial begin
rst_n = 1'b0;
#(`clock_period*200)
rst_n = 1'b1;
#2000000000;
$stop;
end
endmodule
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.wrapper {display: flex;border: 1px solid orangered;padding: 10px;}
.col {border: 1px solid #808080;height: 500px;width: 200px;margin: 0 10px;padding: 10px;}
.item {border: 1px solid #808080;www.dasheng178.com margin: 5px 0;}
</style>
</head>
<body>
<div class="wrapper">
<div class="col1 col">
<div class="item" id="item1" draggable="true">item1</div>
<div class="item" id="item2" draggable="true">item2</div>
<div class="item" id="item3" draggable="true"www.michenggw.com>item3</div>
</div>
<div class="www".xianggelila2.com"col2 col"></div>
<div class="col3 col"></div>
<div class="col4 col"></div>
</div>
<script>
let cols = document.getElementsByClassName('col');
for (let col of cols) {
col.ondragenter = e =www.gcyl159.com/ > {
console.log('放置元素 ondragenter',www.qinlinyu.cn '<' + e.dataTransfer.getData('item') + '>');
}
col.ondragover = e => {
e.preventDefault();
console.log('放置元素 ondragover', '<' + e.dataTransfer.getData('item') + '>');
}
col.ondragleave = e => {
console.log('放置元素 ondragleave', '<' + e.dataTransfer.getData('item') + '>');
}
col.ondrop = function(e) {
console.log('放置元素 ondrop', '<' + e.dataTransfer.getData('item') + '>');
this.append(document.getElementById(e.dataTransfer.getData('item')));
}
}
let items = document.getElementsByClassName('item');
for (let item of items) {
item.ondragstart = e => {
console.log('拖拽元素 ondragstart');
e.dataTransfer.setData('item', e.target.id);
}
item.ondragend = e => {
console.log('拖拽元素 ondragend');
4、時序模擬波形