作者arclitetank (More than meet the eye!)
看板Electronics
標題Re: [問題] veriog撰寫問題
時間Wed Aug 5 23:33:17 2009
小弟在這裡補上自己的想法
其實這電路應該不需要這麼複雜
除非我會錯意了@@"
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 B D A ¯︶¯ NY S J
⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙
— — — — — — — — —
郭勇志 勇維拉 寶貝勇 祖馬勇 勇-ROD 勇巴西亞 勇塔那 King勇 勇樂迪
張伯勇 岡島勇樹 勇盾
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.165.98
1F:推 felghana:感謝 看起來意思是一樣的 是我想太複雜了 08/05 23:57
2F:推 felghana:耶 等等 不太對 因為我想要incr或decr變high時只加一次 08/06 00:03
3F:→ felghana:你這樣只要是clk正緣觸發 會一直加 這樣不行 08/06 00:04
4F:→ felghana:要等到incr變回low之後 再下一次變為high才能再加10 08/06 00:05
了解 如果是我的話我給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)