プロジェクト実習 LSIの設計と実現 LSI設計入門 • 論理回路 – 論理関数、ブール代数 – 真理値表 • C言語 – ビット演算(論理和、論理積、排他的論理和) – 3項演算子( X = A ? B : C) プロジェクト実習 LSIの設計と実現 順序回路の設計 マルチプレクサ A 0 0 0 0 1 1 1 1 B 0 0 1 1 0 0 1 1 Sel Out 0 1 0 1 0 1 0 1 マルチプレクサ • もう一つの書き方 • assign out=(sel==1’b1) ? B : A; 以下はイメージ if(sel==1’b1) assign out=b else assign out=a 乗算器 sum=(b[0]==1’b1) ? sum+a : sum; a=a<<1’b1; sum=(b[1]==1’b1) ? sum+a : sum; a=a<<1’b1; sum=(b[2]==1’b1) ? sum+a : sum; a=a<<1’b1; sum=(b[3]==1’b1) ? sum+a : sum; • 基本的な考え方は合っているが重大な問題 が • wire(=配線) – 複数回代入してはいけない – ループしてもいけない • reg(=記憶素子) – 複数回代入してはいけない – ループは良い • reg <= reg+1 クロックのあるテスト回路 `timescale 1ns/1ps always begin #40 clock = ~clock; end initial begin clock=0; a=0; b=0; #100 a=1’b1 #100 b=1’b1 end 順序回路 • レジスタの仕様を把握する • 「現在の状態」から「次の状態」を組合せ回路 で記述する 現在の状態 – レジスタ – input 次の状態 – always中の右辺値(左辺はreg変数) 順序回路 Reg 組合せ回路 Reg Verilogルール • always @(posedge clock or negedge reset) begin • if(reset==1’b0) begin • /*initialize*/ • end else begin • /*code*/ • end • end • この形を変えてはいけない • if(reset==1’b0) begin • x<=0; • end begin begin • if(xxx) begin • x<=1; • end else begin •左辺はXのみ • x<=y; •どんな条件でもXに代入さ • end れるのは1回(または0回) •複数のalwaysからXに代入 • end してはいけない イネーブル付きカウンタ • ステートマシンとカウンタを組み合わせる • ステートが???のときのみにカウントする – Xのパルス幅がクロックよりも十分長い時にどうな るか? ストップウォッチ • ステートマシンを考える – 入力は2つ(左右のボタンに相当) – 4状態では無理 • 押した瞬間からカウントを始め、押した瞬間に 停止すること – 離した時にはカウンタに変化がない ヒント • カウント用とラップ用のレジスタが必要 • 切替は – assign out put(条件)? count : lap;
© Copyright 2024 ExpyDoc