一、時序邏輯
時序邏輯是Verilog HDL 設計中另一類重要應用。從電路特征上看來,其特點為任意時刻的輸出不僅取決于該時刻的輸入,而且還和電路原來的狀態有關。
從電路行為上講,不管輸入如何變化,僅當時鐘的沿(上升沿或下降沿)到達時,才有可能使輸出發生變化。
1、在描述時序電路的always塊中的reg型信號都會被綜合成寄存器,這是和組合邏輯電路所不同的。
2、時序邏輯中推薦使用非阻塞賦值“<=”。
3、時序邏輯的敏感信號列表只需要加入所用的時鐘觸發沿即可,其余所有的輸入和條件判斷信號都不用加入,這是因為時序邏輯是通過時鐘信號的跳變沿來控制的。
二、時序邏輯在FPGA里RTL實現
我們寫一個簡單的寄存器,看看fpga是怎樣實現時序邏輯的
module counter( input a, input clk, output reg q ); always@(posedge clk)begin q <= a; end endmodule
我們看一下fpga的芯片規劃器
從芯片規劃器,可以看出來幾個細節。
1、我們用了一個查找表、一個寄存器。對FPGA來說,這個寄存器你就算不使用他也是在那里的
2、我么的輸出信號是與clk同步的,必須要等到clk的上升沿到來是,輸出才會更新,因此就實現了寄存器的功能
三、同步復位、異步復位
1、同步復位:其實就是你的操作和時鐘的上升沿同步
舉個例子,你要將q設置為0,下面這代碼就是同步復位,q <= 0,是在時鐘上升沿到來時執行的,所以是同步復位
module counter( input a, input clk, output reg q ); always@(posedge clk)begin q <= 0; end endmodule
2、異步復位:其實就是你的操作和時鐘沒有關系
舉個例子,你要將q設置為0,下面這代碼就是異步復位,q <= 0,無論時鐘是什么狀態,只有rst_n到來就執行清零
module counter( input a, input clk, input rst_n, output reg [7:0] q ); always@(posedge clk,negedge rst_n)begin if(!rst_n) q <= 0; else q <= q + 1'b1; end endmodule
四、競爭冒險
競爭冒險:意思是,在我時鐘的上升沿進行采樣時,輸入信號處于不穩定狀態,這個會給電路帶來亞穩態的問題
為了解決競爭冒險,我們只要滿足信號的建立時間和保持時間即可
五、verilog語法補充
1、parameter 定義全局變量
parameter T = 26'd49_000_000;
2、defparam重新定義參數,這個主要是在仿真腳本修改例化的模塊的內部參數
defparam counter_inst.T = 26'd49; counter counter_inst( .clk (clk), .rst_n (rst_n), .flag (flag)
六、計數器設計
設計一個1秒的計數器,當時間到一秒后給出一個flag信號
1、代碼實現 verilog.v
module counter( input clk, input rst_n, output reg flag ); reg [25:0] count; parameter T = 26'd49_000_000; always@(posedge clk,negedge rst_n)begin if(!rst_n)begin flag <= 1'b0; count <= 0; end else if(count == T)begin flag <= 1'b1; count <= 0; end else begin count <= count + 1'b1; flag <= 1'b0; end end endmodule
2、仿真腳本
我在仿真腳本將時間參數改為T改為 T=26‘d49;方便仿真
`timescale 1ns/1ps module counter_tb; reg clk; reg rst_n; wire flag; defparam counter_inst.T = 26'd49; counter counter_inst( .clk (clk), .rst_n (rst_n), .flag (flag) ); always #10 clk = ~clk; initial begin clk = 0; rst_n = 0; #20; rst_n = 1; #5000000; $stop; end endmodule
3、仿真結果
1、可以看出脈沖flag只持續了一個周期
2、可以看出脈沖的觸發是50個計數值
七、計數器里隱藏的加法器問題
我們設計的這個計數器,里面其實用了一個加法器,加法器是組合邏輯(因為組合邏輯只取決于輸入)
當我們給加法器一個初值0的時候,加法器的輸出立即就輸出1,這就是仿真的時候,開始復位拉高后,count在第一個clk上升沿就為1的原因
審核編輯:劉清
-
FPGA
+關注
關注
1629文章
21736瀏覽量
603387 -
邏輯電路
+關注
關注
13文章
494瀏覽量
42621 -
寄存器
+關注
關注
31文章
5343瀏覽量
120369 -
Verilog
+關注
關注
28文章
1351瀏覽量
110100 -
計數器
+關注
關注
32文章
2256瀏覽量
94570 -
時序邏輯電路
+關注
關注
2文章
94瀏覽量
16544 -
開發板
+關注
關注
25文章
5050瀏覽量
97472 -
FPGA開發板
+關注
關注
10文章
122瀏覽量
31506 -
Verilog語言
+關注
關注
0文章
113瀏覽量
8233
原文標題:筆記連載精選 |【時序邏輯、競爭冒險、同步復位、異步復位】之【計數器設計、verilog語法補充】
文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論