Ch01-2 Verilog語法 資料流(DataFlow)設計 行為(Behavior)設計

Slides:



Advertisements
Similar presentations
學校日簡報 ~ 608 ( 六下 ) 歡迎各位家長! 報告者:黃怡萍老師. 主題一 : 滿滿的感謝 一年多來感謝家長們的支持與鼓勵,使班 務運作順利,親師生溝通良好;六年級下 學期是貴子弟國小生涯的最後一階段,時 間雖然短暫,但老師也擬定最後衝刺的目 標,希望親師生三方持續合作,讓我們愉 快的度過每一天。
Advertisements

報告者:蕭曄鴻 班級:溫馨甲孝 指導教授:李開濟博士
这是一个数字的 乐园 这里埋藏着丰富的 宝藏 请跟我一起走进数学的 殿堂.
單元名稱: 健康的兩性交往.
營利事業所得稅查核準則 相關概念介紹 南區國稅局 新營分局 林俊標 各位學員大家好:
第二章 機率.
教您如何选购血糖仪 之血糖仪选购篇 检测小窍门【如何检测血糖仪误差?】 糖友在医院使用生化检测血糖值时,同时使用血糖仪检测血糖值,并记录
學 號:997I0010、997I0024 組 員:洪韋鈴、王婷婷 日 期: 指導老師:王立杰 老師
第4章 VHDL设计初步.
初中《思想品德》课程改革 回顾·现状·展望
Chapter 5 Sequential Logic Circuit
數位邏輯設計與實習 ch04 組合邏輯電路設計.
Chapter 4 流程控制.
公司法(六) 股份有限公司 1.
Greatest Common Divisor ---最大公约数
数字电子技术 Digital Electronics Technology
第三章 组合逻辑电路 第一节 组合电路的分析和设计 第二节 组合逻辑电路中的竞争与冒险 第三节 超高速集成电路硬件描述语言VHDL
數位邏輯 Digital Logic 醫務管理暨醫療資訊學系 陳以德 副教授: 濟世CS 轉
一、實習目的 1、瞭解各種閂鎖器之特性。 2、瞭解各種正反器之特性。 3、瞭解各種正反器之邏輯功能。 4、瞭解正反器之應用。
第10章 Verilog操作符 学习内容: 熟悉Verilog语言的操作符.
VHDL數位電路實習與專題設計 文魁資訊-UE301
触发器和时序电路分析 刘鹏 浙江大学信息与电子工程学院 March 30, 2017 ZDMC.
VHDL數位電路實習與專題設計 文魁資訊-UE301
Chapter 5 Verilog 硬體描述語言
Chapter 5 Verilog硬體描述語言
邏輯設計.
第17章 Verilog中的高级结构 学习内容: 任务和函数的定义和调用 怎样使用命名块 怎样禁止命名块和任务 有限状态机(FSM)及建模.
EDA技术 廖义奎.
二、相關知識 在數位系統中,資料的表示方式通常是以0與1這兩種基本型態組合而成的,資料若要作處理,則必須將它轉為處理單元所能接受的型式(碼),此即所謂的編碼(encode)。可以完成此編碼工作的電路稱為編碼器(encoder)。而當處理單元將資料處理完之後,則必須將它呈現出來,此時我們需要將它更改為人們所熟悉的資料型式,此種動作我們稱之為解碼(decode)。可以完成此解碼工作的電路稱為解碼器(decoder)。
VHDL 硬體描述語言 數位電路設計實務 第四章 VHDL 的語言結構.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
EDA原理及应用 何宾
EDA原理及应用 何宾
第四阶段实验 ISP器件的设计与应用 一、实验目的 二、实验内容与要求 三、ISP器件的开发流程 四、EDA Pro2K实验系统介绍
一、實習目的 1、瞭解二進制計數器的原理。 2、瞭解同步計數器、非同步計數器之差異及其使用方式。 3、瞭解N模數計數器的設計。
欢迎参加VHDL培训 VHDL培训教程 浙江大学电子信息技术研究所 电子设计自动化(EDA)培训中心
数字系统设计复习 Digital System Design Summary
使用VHDL設計—向上&向下計數器 通訊一甲 B 楊穎穆.
第三章 词法分析.
Danny Mok Altera HK FAE AHDL培训教材 Danny Mok Altera HK FAE 2018/12/9 P.1.
Verilog硬件描述语言基础.
EDA 技术及应用 实验安排.
第14章 其它DSP设计库 14.1 总线控制库 14.2 复数信号库 14.3 Gates库 14.4 状态机函数库
EDA 技术实用教程 第 5 章 QuartusII 应用向导.
第十章 人机交互接口 本章学习目标 掌握键盘接口技术 掌握数码、液晶显示技术 了解数码管显示驱动和键盘扫描控制专用芯片.
语法进阶.
时序电路设计 刘鹏 浙江大学信息与电子工程系 Apr. 24, 2011 EE141
数字集成电路设计入门 --从HDL到版图 于敦山 北大微电子学系.
精简指令集(RISC)CPU的构造原理和设计方法
第六章 VHDL设计共享.
第五章 VHDL主要描述语句.
4-15 WDT HT66F50.
第一次上机安排 第六周 第七周 周一晚(提高1、2,通信001~012) 周二上(通信014~085) 周四上(通信086~154)
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
第14章 对验证的支持 学习内容 理解Verilog文本输出 理解不同的读取仿真时间的系统函数 理解 Verilog文件I/O功能.
计算机学院 数字逻辑实验的要求.
5-6 串列埠模式0輸出埠擴充實習.
计算机EDA设计 教 程 北航计算机学院 艾明晶.
數位邏輯設計與實習 主講者:杜勇進.
第六章 静定桁架的内力分析.
寶 貝 班 教 學 分 享 (103下) 為了搭配主題,所以除了平日在校園中探索外,我們每周也會帶孩子出去一次,進行社區巡禮,讓孩子探索不同的人事物,欣賞不同的美,每次出門孩子總有新的發現,所以我們從孩子的發現為出發點,來延續課程內容,像是觀察植物的顏色及形狀;認識各種水果…等,除此之外,我們也針對孩子喜愛的車子進行討論,從中除了帶入形狀、顏色外,也能認識各種行業的人喔!
设计示例一 用门级结构描述D触发器:.
數位邏輯設計 VHDL.
第九章 循序邏輯應用 9-1 計數器 9-2 跑馬燈 9-3 紅綠燈 台北市私立景文高級中學 資電學程 吳永義 數位邏輯.
FPGA组合逻辑 王安然.
Verilog HDL 基本语法 STEP 2016/12/3.
按键处理部分 王安然.
Programmable Logic System Design
第七章 基本逻辑电路设计.
Presentation transcript:

Ch01-2 Verilog語法 資料流(DataFlow)設計 行為(Behavior)設計 數位積體電路雛型製作 Ch01-2 Verilog語法 資料流(DataFlow)設計 行為(Behavior)設計

資料流設計(Dataflow level) 說明資料如何在暫存器中儲存和傳送,和資料處理的方式。使用具有關鍵字assign之連續指定敘述。

持續指定(continuous assignment) 在資料處理層次中對於一條線指定給其值的描述。 當其輸出是經過邏輯線路時,使用資料處理可以較為簡潔。 電路的設計重點在於說明資料如何在電路中的傳送過程。 ex. wire out; assign out = i n1 & in2; //正規式的持續指定 wire out = in1 & in2 ; //隱藏式的持續指定,與上面同效果

延遲(delay) wire out; assign #10 out = in1 & in2;

布林表示式1 assign D=(A&B)|(~C) assign E= ~C

布林表示式 module test( E, F, A, B, C, D); output E, F; input A, B, C, D; assign E = A | (B & C) | (~B & D); assign F = (~B & C) | (B & ~C & ~D); endmodule

1 bit 半加器 module half_add(s, cout, a, b); output s, cout; // sum and carry out input a, b; assign s = a^ b; assign cout = a & b; endmodule

全加器設計 module full_adder_df (Cin, A, B, S, Cout); input Cin, A, B; output S, Cout; assign S = A ^ B ^ Cin; assign Cout = A & B | A & Cin | B & Cin; endmodule

8 bit 偶同位/全零檢查電路 利用精簡運算子 module even_parity(ev_parity, all_zeros, din); output ev_parity, all_zeros; input [7:0] din; assign ev_parity = ~^ din; // ev_parity = din[0]⊙din[1]⊙din[2]⊙din[3]⊙din[4]⊙din[5]⊙din[6]⊙din[7] XNOR assign all_zeros = ~| din; // all_zeros = NOT(din[0] + din[1] + din[2] + din[3] + din[4] + din[5] + din[6] + din[7] ) NOR endmodule

除8電路 利用移位運算子 module divid_8(quot, div); output [7:0] quot; //quotient input [7:0] div; //dividend parameter sh_bit = 3; //define the number of bits for shifting assign quot = div >> sh_bit; // >>右移 endmodule

2對1多工器 module mux2x1_df (I0,I1,S,Y); input I0,I1; input S; output Y; // 2-to-1 MUX body assign Y = ~S ? I0 : I1; endmodule

4 bit 2對1多工器 利用條件運算子 module mul2_1_4bits(y, sel, a, b); output [3:0] y; input [3:0] a, b; // 4-bit input data input sel; // selection line assign y = (sel) ? a : b; //條件運算子 endmodule

1對4解多工器 module demux_1_4( input i, input [1:0] s, output [3:0] f ); assign f[0] = i&(~s[1])&(~s[0]); assign f[1] = i&(~s[1])&( s[0]); assign f[2] = i&( s[1])&(~ s[0]); assign f[3] = i&( s[1])&( s[0]); endmodule

3 bit 多數表決電路 `timescale 1ns / 1ps module majority_3_data( input [2:0] i, output f ); assign f = ( i[1] & i[0] ) +( i[2] & ( i[0] | i[1] ) ); //卡諾圖化簡後結果 endmodule

4 bit 多數表決電路

有enable的2對4解碼器 module decoder_2_to_4 (x, E, Y); input [1:0] x; input E; output [3:0] Y; assign Y[0] = ~E & ~x[1] & ~x[0]; assign Y[1] = ~E & ~x[1] & x[0]; assign Y[2] = ~E & x[1] & ~x[0]; assign Y[3] = ~E & x[1] & x[0]; endmodule

3對8低態輸出解碼器 module decoder3_8( input [2:0] d, output [7:0] y ); assign y[0] = ~((~d[2]) & (~d[1]) & (~d[0])) , y[1] = ~((~d[2]) & (~d[1]) & (d[0])) , y[2] = ~((~d[2]) & (d[1]) & (~d[0])) , y[3] = ~((~d[2]) & (d[1]) & (d[0])) , y[4] = ~((d[2]) & (~d[1]) & (~d[0])) , y[5] = ~((d[2]) & (~d[1]) & (d[0])) , y[6] = ~((d[2]) & (d[1]) & (~d[0])) , y[7] = ~((d[2]) & (d[1]) & (d[0])) ; endmodule

4對2高態輸出編碼器 module encoder4_2_data( input i3, input i2, input i1, output [1:0] y ); // assign y[1] = ((((~i3) & i2) | (i3 & (~i2))) & (~i1) & (~i0)), // y[0] = ( (~i2)&(~i0)&( ((~i3) & i1) |( i3 & (~i1)) ) ); assign y[1] = ((((~i3) & i2) | (i3 & (~i2))) & (~i1) & (~i0)); assign y[0] = ( (~i2)&(~i0)&( ((~i3) & i1) |( i3 & (~i1)) ) ); endmodule

4 bit加法器 module adder_4bit( input [3:0] a, input [3:0] b, input cin, output [3:0] sum, output cout ); assign { cout,sum } = a + b + cin; endmodule

1 bit 全減器 module subtractor_1bit( input x, input y, input bin, output dif, output bout ); assign dif = ((~x)&(~y)& bin) |( (~x)&(y)&(~bin)) |(x&(~y)&(~bin))|( x & y & bin); assign bout = ((~x)&y)|((~x)& bin)|(y & bin); endmodule

4 bit 比較器 module comparator_4bit (A, B, IALTB, IAEQB, IAGTB, OAGTB, OAEQB, OALTB); input [3:0] A; input [3:0] B; input IALTB,IAEQB,IAGTB; output OAGTB,OAEQB,OALTB ; // -- comparator body-- // assign OALTB = (A < B)||(A==B)&& IALTB; assign OAGTB = (A > B)||(A==B)&& IAGTB; assign OAEQB = (A==B)&& IAEQB; endmodule

8bit偶同位產生器 module even_parity_generator(x,f); input [7:0] x; output f; assign f = ^x; // compute the even parity of x endmodule

行為描述(Behavioral level ) 只考慮模組中的功能和函數,不必考慮硬體方面的詳細電路。使用具有關鍵字always之程序指定敘述。

結構化程序 在Verilog中”initial”和”always”是行為模型中最基本的描述,Verilog是一並行程式語言,須用硬體的角度來思考所需的設計。 “initial”:一個initial的區塊開始的時間為時間零(t=0),當區塊中有很多的敘述時,需用begin…end上下包起來。Initial的動作是不可合成的指令,使用於模擬測試自己的設計是否正確。 “always”:用來描述重複工作的數位邏輯電路

程序指定(Procedural assignments) 程序指定用來更新暫存器(reg)的值,變數上被指定的值會維持到新的程序指定更新為止。 限定指定: (blocking assignment ) 依照在循序區塊的位置,依序執行。一般用於模擬測試(testbench)中。使用符號為“=”。 無限定指定:(nonblocking assignment): 不受敘述位置的影響,用在設計當中較能符合設計的要求,使用符號為”<=”。

事件基礎時間控制 一個訊號產生觸發區塊開始動作,以達到其設計功能。 @(clock) q=d; @(posedge clock) q=d; //clock正緣觸發,當clock訊號變化為1的時,q=d被執行。 @(negedge clock) q=d; //clock負緣觸發,當clock訊號變化為0的時,q=d被執行。 q=@(poedge clock) d; //d立刻被執行,等到clock正緣觸發時再指定至q。

if (條件敘述) a. if (xxx) …. else …. b. if (xxx)… else if (xxx) …. else…

case(多路徑分支) case (判斷訊號名稱) 條件1:…..//條件1成立時,所要做的動作 條件2:.….//條件2成立時,所要做的動作 ….. default:…. //最後最好加上 。 endcase

4 bit 暫存器 區塊程序指定 ( blocking procedure assignment ) module reg(clk,reset,din,qout); input clk,reset; input din; output [3:0] qout; reg [3:0] qout; always@(posedge clk or posedge reset) if ( reset ) qout = 4'b0000; else begin qout[0] = din; qout[1] = qout[0]; qout[2] = qout[1]; qout[3] = qout[2]; end endmodule

4 bit 暫存器 非區塊程序指定 ( non_blocking procedure assignment ) module reg_bpa(clk,reset,din,qout); input clk,reset; input din; output [3:0] qout; reg [3:0] qout; always@(posedge clk or posedge reset) if ( reset ) qout <= 4'b0000; else begin qout[0] <= din; qout[1] <= qout[0]; qout[2] <= qout[1]; qout[3] <= qout[2]; end endmodule

2對1多工器 module mux2x1_bh (I0,I1,S,Y); input I0,I1; input S; output Y; reg Y; always @(I0 or I1 or S) if (S == 0) Y = I0; else Y = I1; endmodule

4 bit 2對1多工器 module mux2_1_4bit(a,b,s,f); input [3:0] a; input [3:0] b; input s; output [3:0] f; reg [3:0] f; always@( s or a or b ) begin if ( s ) f = b; else f = a; end endmodule

4對1多工器(if) module mux4_1_bhv(i,s,f); input [3:0] i; input [1:0] s; output f; reg f; always@( s, i ) begin if ( s == 2'b00 ) f = i[0]; else if ( s == 2'b01 ) f = i[1]; else if (s == 2'b10 ) f = i[2]; else f = i[3]; end endmodule

4對1多工器(case) module mux_4_1_bhv_case(i,s,f); input [3:0] i; input [1:0] s; output f; reg f; always@( i or s ) begin case ( s ) 2'b00 : f = i[0]; 2'b01 : f = i[1]; 2'b10 : f = i[2]; default: f = i[3]; endcase end endmodule

4對1多工器(case)2 module mux4_1 (I0,I1,I2,I3,S,Y); input I0,I1,I2,I3; input [1:0] S; output Y; reg Y; always @(I0 or I1 or I2 or I3 or S) case (S) 2'b00: Y =I0; 2'b01: Y =I1; 2'b10: Y =I2; 2'b11: Y =I3; endcase endmodule

BCD對7段共陽解碼器

BCD對7段共陽解碼器 module bcd2seg_case(hex, seg); input [3:0] hex; output [7:0] seg; reg [7:0] seg; always@( hex ) begin case ( hex) 4'b0001 : seg = 8'b1111_1001; // 1= F9H (共陽,a段在bit0) 4'b0010 : seg = 8'b1010_0100; // 2= A4H 4'b0011 : seg = 8'b1011_0000; // 3= B0H 4'b0100 : seg = 8'b1001_1001; // 4= 99H 4'b0101 : seg = 8'b1001_0010; // 5= 92H 4'b0110 : seg = 8'b1000_0010; // 6= 82H 4'b0111 : seg = 8'b1111_1000; // 7= F8H 4'b1000 : seg = 8'b1000_0000; // 8= 80H 4'b1001 : seg = 8'b1001_0000; // 9= 90H 4'b1010 : seg = 8'b1000_1000; // A= 88H 4'b1011 : seg = 8'b1000_0011; // b= 83H 4'b1100 : seg = 8'b1100_0110; // c= C6H 4'b1101 : seg = 8'b1010_0001; // d= A1H 4'b1110 : seg = 8'b1000_0110; // E= 86H 4'b1111 : seg = 8'b1000_1110; // F= 8EH default : seg = 8'b1100_0000; // 0= C0H endcase end endmodule

有enable的2對4解碼器-if module decode2_4( input wire en, input wire [1:0] a, output reg [3:0] d ); always @* begin if ( en == 1'b0 ) //也可寫成 ~en d = 4'b0000; else if ( a == 2'b00 ) d = 4'b0001; else if ( a == 2'b01 ) d = 4'b0010; else if ( a == 2'b10 ) d = 4'b0100; else d = 4'b1000; end endmodule

有enable的2對4解碼器-case module decode2_4( input wire [1:0] a, input wire en, output reg [3:0] d ); always@* begin case ( { en , a } ) 3'b000, 3'b001, 3'b010, 3'b011 : d = 4'b0000; 3'b100 : d = 4'b0001; 3'b101 : d = 4'b0010; 3'b110 : d = 4'b0100; 3'b111 : d = 4'b1000; endcase end endmodule

有enable的3對8低態輸出解碼器1 module Decoder_Behavioral_3x8_2( input [2:0] i, input en, output reg [7:0] y ); always @* begin case( { en , i } ) 4'b1000: y = 8'hfe; 4'b1001: y = 8'hfd; 4'b1010: y = 8'hfb; 4'b1011: y = 8'hf7; 4'b1100: y = 8'hef; 4'b1101: y = 8'hdf; 4'b1110: y = 8'hbf; 4'b1111: y = 8'h7f; default: y = 8'hff; endcase end endmodule

有enable的3對8低態輸出解碼器2 module Decoder_Behavioral_3x8_1( input [2:0] i, input en, output [7:0] y ); reg [7:0] x; always @* begin x = 8'b0000_0001; x = x << {~en,i}; end assign y = ~x; endmodule

4對16解碼器 利用有enable 的2對4解碼器

1對4解多工器 module demux_1_4_bhv_if(i,s,f); input i; input [1:0] s; output [3:0] f; reg [3:0] f; always@( i or s ) begin if ( s == 2'b00 ) f = { 3'b000, i }; else if ( s == 2'b01 ) f = { 2'b00, i, 1'b0 }; else if ( s == 2'b10 ) f = { 1'b0, i, 2'b00 }; else f = {i, 3'b000 }; end endmodule

4 bit 比較器-1 module compare1(comout, a, b); output [2:0] comout; //comout[2]:great than, //comout[1]:equal comout[0]:less than input [3:0] a, b; //input data reg [2:0] tmp_dat; always @(a or b) begin if (a>b) tmp_dat <= 3'b100; //GT EQ LT else if (a==b) tmp_dat <= 3'b010; else tmp_dat <= 3'b001; end assign comout = tmp_dat; endmodule

4 bit 比較器-2 module comparator_4bit_bhv_if(a,b,gt,eq,lt); input[3:0] a,b; output gt,eq,lt; reg gt,eq,lt; always@( a or b ) begin if ( a == b ) eq = 1'b1; gt = 1'b0; lt = 1'b0; end else if ( a > b ) eq = 1'b0; gt = 1'b1; lt = 1'b0; eq = 1'b0; gt = 1'b0; lt = 1'b1; endmodule

4 bit 栓鎖器(latch) module latch_4bit(din,load,f); input [3:0] din; input load; output [3:0] f; reg[3:0] f; always@( load ) begin if ( load ) f = din; end endmodule

計數器 不規則計數的計數器 規則計數 上數計數器 下數計數器 可上、下數計數器 可載入計數器

4bit上數計數器(0->9往上數) module count_9( clkm, reset, bcd ); input clkm,reset; output [3:0] bcd; reg [3:0] counter; always@( posedge clkm or negedge reset ) begin if ( ! reset ) counter <= 4'h0; else if ( counter == 4'h9 ) counter <= 4'h0; counter <= counter + 1; end assign bcd = counter; endmodule

非同步重置8 bit (0→255)上數計數器 module counter_8bit(clk,reset,count); input clk; input reset; output [7:0] count; reg [7:0] count; always@(posedge clk or posedge reset) begin if ( reset ) count <= 8'b0; else count <= count + 1; end endmodule

下數4bit計數器 0→F →E →D →..... →1 →0 module Counter_Fto0_1( input clk, input reset, output [3:0] y ); reg [3:0] counter; always@( posedge clk or negedge reset ) begin if ( ! reset ) counter <= 4'h0; else if ( counter == 4'h0 ) counter <= 4'hf; counter <= counter - 1; end assign y = counter; endmodule

可上、下數4bit計數器 module Counter_up_down_1( input clk, input up_down, input reset, output [3:0] Q ); reg [3:0] counter; always @(posedge clk or negedge reset) if(!reset) counter = 4'h0; else case(up_down) 1: if (counter == 4'h9) counter = 4'h0; else counter = counter + 1; default: if (counter == 4'h0) counter = 4'h9; else counter = counter - 1; endcase assign Q = counter; endmodule

可載入上、下數4bit計數器 module Counter_load_up_down_1( input clk, input load, input up_down, input reset, input [3:0] Din, output [3:0] Q ); reg [3:0] counter; always @(posedge clk or negedge reset) if ( ! rese t) counter = 4'h0; else if ( load ) counter = Din; else case ( up_down ) 1: if ( counter == 4'h9 ) counter = 4'h0; else counter = counter + 1; default: if (counter == 4'h0) counter = 4'h9; else counter = counter - 1; endcase assign Q = counter; endmodule

00 →99上數計數器

0~9 Up Counter module Counter_up_0to9 ( input clk,en,clr, output reg tc, output [3:0] out ); reg [3:0] counter; always @(posedge clk or posedge clr) if( clr ) counter = 4'h0; else if( en ) begin if( counter == 4'h9 ) tc = 1; end else tc = 0; counter = counter + 1; assign out = counter; endmodule

00 →99 main module Counter_up_00to99_1( input clk,reset, output [3:0] one_out, output [3:0] ten_out ); wire tc; Counter_up_0to9 count1( .clk( clk ) , .en( 1 ) , .clr( ~reset ) , .tc( tc ) , .out( one_out ) ) ; Counter_up_0to9 count2( .clk( clk ) , .en( tc ) , .clr( ~reset ) , .out( ten_out ) ) ; endmodule

左右移1bit暫存器 利用連結運算子 module sht_l_r( sht_out, din, l_r ); output [7:0] sht_out; input [7:0] din; input l_r; //l_r : selection of shift left or right reg [7:0] cnt; always @(l_r or din) begin cnt = din; if ( l_r ) cnt = { cnt[6:0], 1'b0 }; //Shift left 大括號:連結運算子 else cnt = { 1'b0, cnt[7:1] }; //Shift right end assign sht_out = cnt; endmodule