Re: [問題] veriog撰寫問題

看板Electronics作者 (More than meet the eye!)時間16年前 (2009/08/05 23:33), 編輯推噓2(202)
留言4則, 1人參與, 最新討論串3/10 (看更多)
小弟在這裡補上自己的想法 其實這電路應該不需要這麼複雜 除非我會錯意了@@" module add_sub(clk,reset,mod_n,incr,decr); input clk,incr,decr,reset; output [12:0] mod_n; reg [12:0] mod_n; always@(posedge clk) begin if(reset) mod_n <= 13'd2000; else mod_n <= incr ? mod_n-13'd10 : decr ? mod_n+13'd10 : mod_n; end endmodule is this you want? 是的話有兩件小東西你需要留意: 1. incr and decr 同時為high 會執行 mod_n - 13'b10. 2. reset可能需要另外做電路和clk synchronize起來 ※ 引述《felghana (adol)》之銘言: : module add_sub(clk,reset,mod_n,incr,decr); : input clk,incr,decr,reset; : output[12:0] mod_n; : reg [1:0] state,next_state; : reg [12:0] mod_n; : parameter s0=2'd0,s1=2'd1,s2=2'd2,s3=2'd3; : always@(posedge clk) : begin : if(reset) : state=s0; : else : state=next_state; : end : //s0:重置用 s1:增加mod_n s2:減少mod_n s3:維持mod_n : always@(state) : begin : case(state) : s0:mod_n=13'd2000; : s1:mod_n=mod_n+13'd10; : s2:mod_n=mod_n-13'd10; : default:; : endcase : end : //當incr變為high時增加mod_n : //當decr變為high時減少mod_n : always@(state or incr or decr) : begin : case(state) : s0: : next_state=s3; : s1: : if(decr) : next_state=s1; : else : next_state=s3; : s2: : if(incr) : next_state=s2; : else : next_state=s3; : s3: : if(incr) : next_state=s2; : else if(decr) : next_state=s1; : else : next_state=s3; : default: : next_state=s0; : endcase : end : endmodule : 上面是我寫的verilog 程式碼 : 目的是把mod_n傳到除頻器當除頻參數 : 所以藉由控制mod_n可以決定除頻後的頻率 : 我目前的問題是 使用quartus II燒錄至FPGA後 : 電路的動作完全錯誤 和我所撰寫的完全不同 : 想問版上的高手 : 我的code是不是有容易被合成軟體誤解的地方 : 我已經改了很多次還是一樣 : 麻煩好心的高手指點一下 謝謝 -- NY ¯︶¯ NY S J ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ 郭勇志 勇維拉 寶貝勇 祖馬勇 勇-ROD 勇巴西亞 勇塔那 King勇 勇樂迪 張伯勇 岡島勇樹 勇盾 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.165.98

08/05 23:57, , 1F
感謝 看起來意思是一樣的 是我想太複雜了
08/05 23:57, 1F

08/06 00:03, , 2F
耶 等等 不太對 因為我想要incr或decr變high時只加一次
08/06 00:03, 2F

08/06 00:04, , 3F
你這樣只要是clk正緣觸發 會一直加 這樣不行
08/06 00:04, 3F

08/06 00:05, , 4F
要等到incr變回low之後 再下一次變為high才能再加10
08/06 00:05, 4F
了解 如果是我的話我給incr和decr加 rising detector always@(posedge clk) if (reset) incr_p0 <= 1'b0; else incr_p0 <= incr; wire incr_trig = incr & ~incr_p0; 同理 decr 也是 mod_n就變成: mod_n <= incr_trig ? mod_n-13'd10 : decr_trig ? mod_n+13'd10 : mod_n; ※ 編輯: arclitetank 來自: 118.160.165.98 (08/06 00:11)
文章代碼(AID): #1AUQO_bW (Electronics)
討論串 (同標題文章)
文章代碼(AID): #1AUQO_bW (Electronics)