1,要實現的是如下的乙個「產生占空比不同的分頻時鐘」:
(1)、建模:
module fdivision_module(clock,d_clock,reset,j);
input clock,reset;
output d_clock,j;
reg d_clock;
reg [2:0]j;
always @(posedge clock)
begin
if(!reset)
//初始化過程
begin
d_clock<=0;
j<=0;
endelse
begin
if(j==4)
j<=0;
else if(j==1)
begin
d_clock=1;
j<=j+1;
endelse
begin
d_clock=0;
j<=j+1;
endend
endendmodule
(2)testbench:
`include "fdivision_module.v"
module fdivision_stimulus;
reg clock,reset;
wire d_clock;
wire [2:0]j;
fdivision_module fd(clock,d_clock,reset,j);
initial
begin
clock=0;
forever #5 clock=~clock;
endinitial
begin
reset=0;
#20 reset=1;
#100 reset=1;
#5 reset=1;
end(3)、正確**波形:
2、出現的問題及解決辦法:
(1)、第一次的**結果如下:由圖可見,在reset置0的時候,d_clock並沒有置0,沒有初始化;
(2)、為了除錯程式,我將區域性變數j也作為輸出變數,得到下面的**結果:區域性起到計數的變數一直為未知量x。
(3)、改動程式,將reset也放入always的敏感列表中,寫成always @(posedge clock,negedge reset),得到下面的結果:很顯然,儘管**出結果,但是占空比錯誤,這個錯歸根結底還是在於計數器的設定,開始我寫成(j==5)時,j<=0;(j==2)時,d_clock=1;特別很明顯0~5總共經歷了6個時鐘。所以,建模過程中,要特別注意計數器j的設定。
(4),現在回過頭來想想最開始的建模有什麼錯誤,在2.3中,將reset置於敏感列表中,寫成always @(posedge clock,negedge reset),這相當於非同步置0 ,reset的置0訊號是不受時鐘控制的,只要reset=0,就能將d_clock和j置0。但是在最開始錯誤的2.1中,敏感列表為always @(posedge clock),再在後面過程塊中寫,reset=0時,j=0,d_clock=0;那麼這時的reset置0為同步置0,只有當上公升沿出現時,才生效,給j和d_clock賦值。但是,我在testbench模組中,給reset的賦值如下圖:很顯然,在0~5ns時,reset=0,#5ns之後reset=1,則當#10ns,上公升沿到來時,reset已經為1,不能再給j和d_clock賦值了,所以造成了2.1的錯誤。特別值得注意的是,在非同步置0時,reset=0的保持時間可以任意,但同步置0時,reset=0的保持時間需要大於乙個時鐘,否則就會出現上面上公升沿還沒到來,reset就為1,不能賦值的錯誤。
php的關於 與 的條件語句實現
第一種 if 條件語句 第二種 三目運算 第三種 組成的條件語句 第一種 if 不用講了,這是基礎,相信絕大多數人都會 第二種 c a b true false 意思是 如果a b 為真 則返回真,否則返回假 當然可以用語句替換 並且把結果返回給c 第三種 1 在大多數語言中,他的意思是並且的意思,...
sql利用在一條語句中count出不同的條件的值
過多繁瑣的sql影響 質量,及維護成本,以下為兩種小技巧處理方式,僅供參考,第二種更美觀點 第一種,用case when 方法 selectid,sum case when type in 1,2 then count else 0 end as sum1 sum case when type in...
利用json檔案實現不同裝置間的互動(一)
在做工程時,遇到如下需求 當移動端按下按鍵,機械人底盤實現相應功能,即樹莓派上啟動相應服務。鑑於涉及不同裝置以及各項服務涉及不同語言,需要設計一種互動方式相互協調。實際實現借鑑了client server結構。首先在server端 即樹莓派,各項功能對應的程式實現均於此 新建乙個json檔案,檔案中...