スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ハードウェア記述をプログラミングする

ここで触れるのはverilogとかvhdlとかそういう事ではなく、単に論理ゲートの動作をプログラミングでシミュレートしてやろうと。

hspで。integer型をbooleanとして使ったりしているので真面目に作るなら移植すべきです。
コメントは入れてませんが、後日気が向いたらコメントを入れるかもしれません。

つづきは追記
モジュールは読み飛ばして、まずは利用例から見ることをお勧めします。

モジュール

#module machine

#const global TYPEREG 0
#const global TYPEWIRE 1
#const global TYPEAND 2
#const global TYPEOR 3
#const global TYPENOT 4

#deffunc m_initialize
dim reg ,50,4 // fromt,fromi,tmpin,out
dim wire,100,2 // fromt,fromi
dim calcand,50,4 // fromt1,fromi1,fromt2,fromi2
dim calcor,50,4
dim calcnot,50,2
// type---0:reg 1:wire 2:and 3:or 4:not
// 初期設定は更新時自分自身を読み込む:変化しない
repeat 50
reg.cnt.0=TYPEREG
reg.cnt.1=cnt
loop

return

#deffunc m_setreg int idx,int value
reg.idx.3 = value
return
#defcfunc m_getreg int idx
return reg.idx.3

#deffunc m_setconnect__ int fromtype,int fromidx,int totype,int toidx,int toprm
p=toprm*2
if totype==TYPEREG : reg.toidx.0=fromtype : reg.toidx.1=fromidx
if totype==TYPEWIRE : wire.toidx.0=fromtype : wire.toidx.1=fromidx
if totype==TYPEAND : calcand.toidx.p=fromtype : calcand.toidx.(p+1)=fromidx
if totype==TYPEOR : calcor.toidx.p=fromtype : calcor.toidx.(p+1)=fromidx
if totype==TYPENOT : calcnot.toidx.0=fromtype : calcnot.toidx.1=fromidx
return
#define global m_setconnect(%1,%2,%3,%4,%5=0) m_setconnect__ %1,%2,%3,%4,%5

#defcfunc m_getdat int type,int idx
// logmes "call type"+type+" idx"+idx
if type==TYPEREG : return m_getreg(idx)
if type==TYPEWIRE: return m_getdat(wire.idx.0,wire.idx.1)
if type==TYPEAND : return m_getdat(calcand.idx.0,calcand.idx.1) & m_getdat(calcand.idx.2,calcand.idx.3)
if type==TYPEOR : return m_getdat(calcor.idx.0,calcor.idx.1) | m_getdat(calcor.idx.2,calcor.idx.3)
//if type==TYPENOT : return 0xFFFFFFFF^m_getdat(calcnot.idx.0,calcnot.idx.1)
if type==TYPENOT : return 1^m_getdat(calcnot.idx.0,calcnot.idx.1)
// logmes "notfoundtype "+type
return 0

#deffunc m_update
repeat 50//regnum
// logmes""+cnt
reg.cnt.2=m_getdat(reg.cnt.0,reg.cnt.1)
loop
repeat 50
reg.cnt.3=reg.cnt.2
loop
return

#global

m_initialize マシンの初期化
m_setreg レジスタに値をセットする
m_getreg レジスタの値を得る
m_setconnect fromのゲート出力からtoのゲート入力へ接続する
m_update クロック入力する
m_getdat 内部用

組み合わせ回路の例です

// chk1--[not10]-+
// [and10]---+----out1
// chk2----------+ |
// [or10]--out3
// chk3----------+ |
// [and11]---+----out2
// chk4--[not11]-+
//

txt=""
m_initialize

m_setconnect TYPEREG,11,TYPENOT,10
m_setconnect TYPEREG,14,TYPENOT,11

m_setconnect TYPEREG,12,TYPEAND,10,0
m_setconnect TYPENOT,10,TYPEAND,10,1

m_setconnect TYPEREG,13,TYPEAND,11,0
m_setconnect TYPENOT,11,TYPEAND,11,1

m_setconnect TYPEAND,10,TYPEOR,10,0
m_setconnect TYPEAND,11,TYPEOR,10,1

m_setconnect TYPEOR,10,TYPEREG,23
m_setconnect TYPEAND,10,TYPEREG,21
m_setconnect TYPEAND,11,TYPEREG,22

chk2=1

chkbox "input1",chk1
chkbox "input2",chk2
chkbox "input3",chk3
chkbox "input4",chk4

mesbox txt,300,200,0

repeat
m_setreg 11,chk1
m_setreg 12,chk2
m_setreg 13,chk3
m_setreg 14,chk4

m_update

txt ="out1:"+m_getreg(21)
txt+="\nout3:"+m_getreg(23)
txt+="\nout2:"+m_getreg(22)
objprm 4,txt
wait 30
loop

フリップフロップだってできちゃうんだから!
…コード的にはこっちの方が読みやすくないですか?

in_j = 0,1,0,0,0,1,1,0
in_k = 0,0,0,1,0,1,0,1
instep = 8

m_initialize
// reg 11:j 12:k 13:Q
m_setconnect TYPEREG,11,TYPEAND,10,0
m_setconnect TYPEREG,13,TYPENOT,10
m_setconnect TYPENOT,10,TYPEAND,10,1

m_setconnect TYPEREG,13,TYPEAND,11,0
m_setconnect TYPEREG,12,TYPENOT,11
m_setconnect TYPENOT,11,TYPEAND,11,1

m_setconnect TYPEAND,10,TYPEOR,10,0
m_setconnect TYPEAND,11,TYPEOR,10,1

m_setconnect TYPEOR,10,TYPEREG,13

pos 15,60 : mes "J"
pos 15,100 : mes "K"
pos 15,140 : mes "Q"

repeat instep
m_setreg 11,in_j.cnt
m_setreg 12,in_k.cnt

m_update

x=cnt*50+30
pos x-5,20 : mes "i"
repeat 3
y=75+40*cnt-m_getreg(11+cnt)*15
line x,y,x+50,y
loop
loop
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : HSP3 シミュレーション

コメントの投稿

非公開コメント

ブログ移転のお知らせ
ブログをshonen.hateblo.jpに移転します. 新規の記事はこちらに投稿します.
プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
635位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
94位
アクセスランキングを見る>>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。