查看完整版本 : Digital Logic Simulator

darigold 2017-11-17 01:03 PM

Digital Logic Simulator

最近幾天在[url=http://www.discuss.com.hk/forumdisplay.php?fid=181]資訊科技 I.T.[/url]和大家聊聊[url=http://www.discuss.com.hk/viewthread.php?tid=27003953&extra=page%3D1]IT 同 姨姨(EE) 結合既項目[/url],其中一個[url=http://www.discuss.com.hk/viewthread.php?tid=27003953&page=1#pid470164482]挑戰[/url]很有意思。

design a divide-by-3 frequency divider with 50% duty cycle output.

我已經想到這個電路,可是沒有元件試,網上可以裝 simulator 或者用 online simulator,但係我想挑戰一下自己,寫一個自己的 digital logic simulator。

說寫就寫,寫了這個 MingLogic

[url=https://github.com/cshung/MingLogic]https://github.com/cshung/MingLogic[/url]

半成品,繼續努力中。

Susan﹏汪汪 2017-11-17 01:44 PM

汪汪睇左呢個

但你用C#寫

darigold 2017-12-26 03:01 PM

今日 push 左幾個 update,可以 simulate 到 frequency divider 了!

[[i] 本帖最後由 darigold 於 2017-12-26 04:02 PM 編輯 [/i]]

yaumx 2017-12-26 05:36 PM

Logic 要靠 C# model?

xianrenb 2017-12-26 07:23 PM

[quote]原帖由 [i]darigold[/i] 於 2017-11-17 01:03 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=471024073&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
最近幾天在資訊科技 I.T.和大家聊聊IT 同 姨姨(EE) 結合既項目,其中一個挑戰很有意思。

design a divide-by-3 frequency divider with 50% duty cycle output.

我已經想到這個電路,可是沒有元件試,網上可以 ... [/quote]

看來你是想寫一個別人會用的 digital logic simulator ,而不只是試驗概念。

老實說,我看了 README.md ,也不太清楚為何有這些 Factory 。
就算真的是用 Factory 產生 object ,在 user 的角度看來,在 config/input file 中用這些字眼是比較奇怪的。

如果想給別人用,最好還是接近 SPICE 或者 Verilog 、 VHDL 等的 input file 格式。
使用者就無須學用新的方法。
同時, JSON 格式實在有太多不必要符號了。

但另一方面,類似程式的確有很多好選擇。
這個值不值得花時間去 develop 一個新的?

jasonchan35 2017-12-26 11:56 PM

睇落似興趣研究多, 所以 have fun 就得

darigold 2017-12-27 03:00 AM

其實我寫這個小項目的目的有兩個!

1) 證明我的 divide by 3 frequency divider 設計能用,和
2) 挑戰自己,編寫一個 digital circuit simulator 。

我想,這兩個目的我都達到了。

我沒有想讓別人使用。市面上這種產品有很多,都寫得比我好。如果你去看 GitHub 上的 commit history,這個小項目只用了 7 天,18 個 commits 寫成。所以一切從簡 … 你說得對,沒有用的產品不值得花太多時間。

JSON 是我懶的產物,我就不想寫一個 custom parser , 所以求其 serialize 左我既 internal representation 就算,所以你會見到個d factories。

如果要改進,第一個我想改進的是 error reporting 。現在 json file 假如寫錯 (比如說 port-mapping 去了一個不存在的 signal ) ,現在這個程序是直接 crash,還是讓它好好報錯為好。

yaumx 2017-12-27 11:15 AM

[quote]原帖由 [i]darigold[/i] 於 2017-12-27 03:00 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=472904385&ptid=27064410][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
其實我寫這個小項目的目的有兩個!

1) 證明我的 divide by 3 frequency divider 設計能用,和
2) 挑戰自己,編寫一個 digital circuit simulator 。

我想,這兩個目的我都達到了。

我沒有想讓別人使用。市 ... [/quote]

Divide by 3 其實好易 真接用 FSM就得

darigold 2017-12-27 12:00 PM

[quote]原帖由 [i]yaumx[/i] 於 2017-12-27 11:15 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=472912052&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Divide by 3 其實好易 真接用 FSM就得
[/quote]

這個設計就是 FSM 的想法。
你可以看到我有兩個 counters ,一個用 clock ,一個用 not(clock)。

兩個counters是一樣的,沒有其它 input,只是數00, 01, 11。
首先看第一個bit
00 -> 0
01 -> 1
11 -> 0
所以這個 function 可以用 xor gate implement。
然後看第二個bit
00 -> 1
01 -> 1
11 -> 0
所以這個 function 可以用 nand gate implement。

這兩個 counters 就是用 counter.json 。我加了個 enable bit,這樣可以有效的把 register 設 0 。

有了這兩個counters後,我們看看三個clock cycle都會output 甚麼。[code]Input     0  1  0  1  0  1
Counter1 00 01 01 11 11 00
Counter2 00 00 01 01 11 11
Output    0  0  0  1  1  1[/code]所以想會 generate output 我們可以用這個k-map[code]C1\C2 00 01 11 10
00     0  0  1  X
01     0  X  X  X
11     X  1  1  X
10     X  X  X  X[/code]這個 function 可以很簡單的用這個 k map 做[code]C1\C2 00 01 11 10
00     0  0  1  0
01     0  0  1  0
11     1  1  1  1
10     0  0  1  0[/code]這就只是兩個 and gate 和一個 or gate 就可以出來的結果。這個 logic 就在 divider.json 裏。

這就是我的設計。

這個 simulator 就是為了驗証這個 design 寫的。

yaumx 2017-12-28 08:45 AM

[quote]原帖由 [i]darigold[/i] 於 2017-12-27 12:00 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=472913759&ptid=27064410][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


這個設計就是 FSM 的想法。
你可以看到我有兩個 counters ,一個用 clock ,一個用 not(clock)。

兩個counters是一樣的,沒有其它 input,只是數00, 01, 11。
首先看第一個bit
00 -> 0
01 -> 1
11 -> 0
... [/quote]

有冇 consider 過 logic gitch?

xianrenb 2017-12-28 09:26 AM

[quote]原帖由 [i]darigold[/i] 於 2017-11-17 01:03 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=471024073&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
最近幾天在資訊科技 I.T.和大家聊聊IT 同 姨姨(EE) 結合既項目,其中一個挑戰很有意思。

design a divide-by-3 frequency divider with 50% duty cycle output.

我已經想到這個電路,可是沒有元件試,網上可以 ... [/quote]

順便說說,如果目標其實是“design a divide-by-3 frequency divider with 50% duty cycle output”。
很可能其實想指的真實(額外)要求是“with input clock having arbitrary-value duty cycle”。

直接用 logic gate 做應該是做不到的。
如果當“半個” clock ,即clock 為 high 或 low 時為一格。
divide-by-3 frequency divider 即是要將 6 格變為每格時間長了的 2 格。
50% duty cycle 即是要前述的 2 格同樣長時間。
但前述的 6 格,前三格就有可能是長短長,或短長短的組合。
與後三格的組合形式一般來說不同。
所以簡單方法是做不到的。

darigold 2017-12-28 10:11 AM

[quote]原帖由 [i]yaumx[/i] 於 2017-12-28 08:45 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=472950570&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
有冇 consider 過 logic gitch?
[/quote]
設計的時候冇考慮,不過實驗證明個 design 好似冇 logic glitch。
我 push 左一個 commit 上 github ,改左個 gate delay 變成 random,simulate 左幾次,依然係冇 glitch。
這是運氣吧 …

darigold 2017-12-28 10:31 AM

[quote]原帖由 [i]xianrenb[/i] 於 2017-12-28 09:26 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=472951917&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
順便說說,如果目標其實是“design a divide-by-3 frequency divider with 50% duty cycle output”。
很可能其實想指的真實(額外)要求是“with input clock having arbitrary-value duty cycle”。
[/quote]
很有意思的題目,我暫時的想法是可以用一個簡單的 counter 就可以做到一個 divide by 6 的 frequency。
假如我們有一個 frequency doubler,這樣就可以解決問題了,Google 了一下,好像這個circuit能做到 doubling frequency。
[url]https://www.maximintegrated.com/en/app-notes/index.mvp/id/3327[/url]

你的答案是怎樣做的?

darigold 2017-12-29 02:39 AM

[quote]原帖由 [i]darigold[/i] 於 2017-12-28 10:31 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=472954204&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
很有意思的題目,我暫時的想法是可以用一個簡單的 counter 就可以做到一個 divide by 6 的 frequency。
假如我們有一個 frequency doubler,這樣就可以解決問題了,Google 了一下,好像這個circuit能做到 doubling frequency。
[url=https://www.maximintegrated.com/en/app-notes/index.mvp/id/3327]https://www.maximintegrated.com/en/app-notes/index.mvp/id/3327[/url]

你的答案是怎樣做的?
[/quote]
仔細的看了linked circuit,好像不能double arbitrary frequency,只能通過改變 R/C 的值來做。
看來要能夠做到要求,只能用 phase locked loop。

tom.care 2017-12-29 04:15 AM

最終又係 Phase Locked Loop?

xianrenb 2017-12-29 01:24 PM

[quote]原帖由 [i]tom.care[/i] 於 2017-12-29 04:15 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=472990131&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
最終又係 Phase Locked Loop? [/quote]

都可以這樣說。
除了產生新的 clock 再 match phase ,應該無更好的方法。
另外可以看看:
[url=https://en.wikipedia.org/wiki/Delay-locked_loop]https://en.wikipedia.org/wiki/Delay-locked_loop[/url]
[url=https://en.wikipedia.org/wiki/Digital_clock_manager]https://en.wikipedia.org/wiki/Digital_clock_manager[/url]

darigold 2017-12-29 05:34 PM

一直想學砌 Phase Locked Loop,xianrenb 可唔可以 design 一次分享一下?

xianrenb 2017-12-30 08:47 AM

[quote]原帖由 [i]darigold[/i] 於 2017-12-29 05:34 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=473016263&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
一直想學砌 Phase Locked Loop,xianrenb 可唔可以 design 一次分享一下? [/quote]

我估我設計 transistor-level 的 op-amp 或者 audio amplifier 還可以,但 transistor-level 的 phase locked loop 現在還未試過。

但個 concept 應該不太難。

LTspice XVII 內有 example , PLL.asc 及 PLL2.asc 。
不過都不是 transistor-level 。

我看最難搞的是 VCO / modulator 。
因為按 PLL.asc ,個 phase detector  只是一個 xor gate 。

不過都算知道,其中一個可行方法是用 LC + transistor 設計一個 oscillator 。
[url=http://www.learnabout-electronics.org/Oscillators/osc21.php]http://www.learnabout-electronics.org/Oscillators/osc21.php[/url]
而個 capacitor 可以是 varicap 。
那就可以改變 frequency 了。

其實設計一個 FM radio receiver 是我一個目標。
一直想試,但又不願抽時間試。

darigold 2017-12-30 04:18 PM

設計 circuit 可能會 OT ,所以係工程版開左個新 post 分享最近的 circuit design ,請到 [url=http://www.discuss.com.hk/viewthread.php?tid=27151301&extra=page%3D1]LTSpice 初探[/url]。

煙民母親生賤種 2018-1-4 01:27 AM

[quote]原帖由 [i]xianrenb[/i] 於 2017-12-30 08:47 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=473039145&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]


我估我設計 transistor-level 的 op-amp 或者 audio amplifier 還可以,但 transistor-level 的 phase locked loop 現在還未試過。

但個 concept 應該不太難。

LTspice XVII 內有 example , PLL.asc 及 P ... [/quote]呢 D 野我完全無概念 ... :fst_004:要學可能要下一世 :fst_008:

xianrenb 2018-1-4 09:30 PM

[quote]原帖由 [i]darigold[/i] 於 2017-12-30 04:18 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=473055630&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
設計 circuit 可能會 OT ,所以係工程版開左個新 post 分享最近的 circuit design ,請到 LTSpice 初探。 [/quote]

印象中果邊比較多土木工程、電機工程的。
其實呢度討論都算 ok ,因為 SPICE 本來都是一種 code ,只不過不是 call function ,而是 setup 一個 circuit 出來做 simulation 而已。

講番個 freq 除 3 問題,原來比我起初想像複雜很多。
我想到用 RC 加 d not gate 做一種帶 delay 的 oscillator ,再加一個 transistor 就可以控制 effective 的 RC constant 。
不過個 xor gate 只能 lock 90 度 phase ,所以用了 4 倍 clock 再對好 phase 。
現時設計:
[url=https://github.com/xianrenb/clock_freq_divided_by_3]https://github.com/xianrenb/clock_freq_divided_by_3[/url]
不過都不是好肯定方法有無錯。
而且 d paramters 無 optimized 到。
表面看來 lock 到 freq 接近 333 Hz 。
不過效能就不算很好,時快時慢。

darigold 2018-1-9 05:56 PM

你能說明一下嗎?謝謝。

xianrenb 2018-1-9 07:59 PM

[quote]原帖由 [i]darigold[/i] 於 2018-1-9 05:56 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=473539434&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
你能說明一下嗎?謝謝。 [/quote]

A1 、 A5 及 A6 三個 not gate 再加上 d RC 組成了一個 oscillator 。
RC 的 delay 無認真計過,只是考慮到 order of magnitude ,再加上設計中途 simulation result 調節過。
Q1 的 Ice/Rce 由 Vbe 控制。
變相即是由 A4 的輸出過 low-pass filter 控制。
RC 的數值一樣是 order of magnitude 估計 ok ,試過 simulation 似得就採用了這些數值。
R7 、 R8 及 R9 加來是為了做 biasing ,也只是約略調節過。
A28 、 A8 、 A11 、 A2 、 A10 及 A4 組成 xor gate 。

大部份 D-flip flop 接上 not gate ,再入 D input 是為了不斷 toggle output ,也就算是 clock 除 2 。
TD=10N 是參考 LTspice 中的 example “160.asc”,應該是指 propagation delay = 10 ns 。
不過唔知直接加落 flip flop 當 clock-to-q delay 得唔得。
所以都是跟 example 做。

個 xor gate 如果 input clock (除 2) 與 CL4 除4 (再除 2)成 90 度 phase 的話, xor gate 的 output 就應該 50% 時間 logic 1 , 50% 時間 logic 0 ,如果個 phase 大 d  ,就多 d 時間是 logic 1 ,個 Q1 Vbe 就會大些,減少 Rce 。
該處的 effective RC constant 就應該少些, oscillator 個 frequency 就會大 d ,下一個 output 產生的 phase 就會少些。
我幅圖其實有 d 誤導/小錯誤, CLKDIV2 用了 not gate 之後的輸出,所以論該點,後面的 gate 不是 xor gate 。
如要當 xor gate 看,要看 (not CLKDIV2) 與 CLK4DIV8 的關係。

另外,先前好似搞錯了/沒留意,現在看 simulation result 好像到尾都未 lock 到 90 度 phase ,只是個 frequency 較接近目標值。
有可能是 biasing 錯了,變成不是 lock 90 度?
其實都不肯定個方法是否正確。
或者你可以修改一下。

另外, LTspice 中的 d flip-flop 好像不是單純 edge-triggered 的,因為改了 input clock 的 duty cycle 的話,看來影響結果幾大。
而按設計,過了第一個 flip-flop 之後,應該任何數值 duty cycle 都是一樣的,個 duty cycle 應該不會影響後面的輸出。

darigold 2018-1-22 02:02 AM

加了一個 README 說明我的設計思路。
[url]https://github.com/cshung/MingLogic/tree/master/Examples[/url]

DSSCSS 2018-1-29 03:23 AM

個陣都有砌過PLL。

PLL分APLL同DPLL,
至於APLL入面既LOGIC GATE 同VCO 點樣搞,可以睇CD4046呢粒早期IC,
因為PLL都有細分好多款類型,
大致原理都係DETECT個PHASE DIFFERENCE,用NEGATIVE FEEDBACK控制番個VCO。

[url]http://www.analog.com/media/en/training-seminars/tutorials/MT-086.pdf[/url]
[url]http://www.ti.com/lit/an/scha002a/scha002a.pdf[/url]

[[i] 本帖最後由 DSSCSS 於 2018-1-29 03:37 AM 編輯 [/i]]

xianrenb 2018-1-29 01:02 PM

[quote]原帖由 [i]DSSCSS[/i] 於 2018-1-29 03:23 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=474530661&ptid=27064410][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
個陣都有砌過PLL。

PLL分APLL同DPLL,
至於APLL入面既LOGIC GATE 同VCO 點樣搞,可以睇CD4046呢粒早期IC,
因為PLL都有細分好多款類型,
大致原理都係DETECT個PHASE DIFFERENCE,用NEGATIVE FEEDBACK控制番個V ... [/quote]

好有用的資料。
謝分享!

看來較好的方法是做個 state machine 以便正確分辨 frequency 是較大還是較小,再按 state control VCO 。
單一個 xor gate 做判斷的效果比較不理想。
頁: [1]
查看完整版本: Digital Logic Simulator