硬件描述语言_什么是硬件描述语言

2020-02-29 其他范文 下载本文

硬件描述语言由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“什么是硬件描述语言”。

硬件描述语言语言设计实例1、8-3编码器

module encode_verilog(a ,b);input [7:0] a;//编码器输入 wire [7:0] a;output [2:0] b;//编码器输出 reg [2:0] b;always @(a)

begin

case(a)//编码器某一输入端口为高电平输出相应的3位二进制数

8'b0000_0001 : b

8'b0000_0010 : b

8'b0000_0100 : b

8'b0000_1000 : b

8'b0001_0000 : b

8'b0010_0000 : b

8'b0100_0000 : b

8'b1000_0000 : b

default : b

endcase

end endmodule2、8-3优先编码器

module p_encode_verilog(A ,I ,GS ,EO ,EI);//编码器以低为有效 input [7:0] I;//编码器输入 wire [7:0] I;input EI;//输入使能,EI=0时,编码器正常工作 wire EI;

output [2:0] A;//编码器输出 reg [2:0] A;

output GS;//优先编码器工作状态标志,编码器的八个输入端有信号输入时,GS=0 reg GS;

output EO;//输出使能,reg EO;

always @(I or EI)if(EI)//使用if、else if表明条件的优先级顺序

begin

A

GS

EO

end else if(I[7] == 0)

begin

A

GS

EO

end else if(I[6] == 0)

begin

A

GS

EO

end

else if(I[5] == 0)

begin

A

GS

EO

end

else if(I[4] == 0)

begin

A

GS

EO

end

else if(I[3] == 0)

begin

A

GS

EO

end

else if(I[2] == 0)

begin

A

GS

EO

end

else if(I[1] == 0)

begin

A

GS

EO

end

else if(I[0] == 0)

begin

A

GS

EO

end

else if(I == 8'b11111111)

begin

A

GS

EO

end endmodule3、3-8译码器

module decoder_verilog(G1 ,Y ,G2 ,A ,G3);input G1;//使能输入,高有效 wire G1;input G2;//使能输入,低有效 wire G2;input [2:0] A;//3位译码器输入,为高有效 wire [2:0] A;

input G3;//使能输入

wire G3;//使能输入,低有效

output [7:0] Y;//8位译码器输出,为低有效 reg [7:0] Y;reg s;always @(A ,G1, G2, G3)

begin

s

Y

Y

else

case(A)3'b000 : Y

3'b001 : Y

3'b010 : Y

3'b011 : Y

3'b100 : Y

3'b101 : Y

3'b110 : Y

3'b111 : Y

endcase end endmodule4、数据选择器

module mux8_1_verilog(Y ,A ,D0, D1,D2, D3, D4, D5, D6, D7 ,G);input [2:0] A;//地址输入端 wire [2:0] A;input D0;//数据输入端 input D1;//数据输入端 input D2;//数据输入端 input D3;//数据输入端 input D4;//数据输入端 input D5;//数据输入端 input D6;//数据输入端 input D7;//数据输入端

input G;//使能端,当G=1时Y=0,当G=0时数据选择器正常工作 wire G;output Y;//数据输出端 reg Y;always @(G or A or D0 or D1 or D2 or D3 or D4 or D5 or D6 or D7)begin

if(G == 1)//使能端的优先级高

Y

else

case(A)//根据输入的地址A确定数据选择器输出哪路输入数据

3'b000 : Y = D0;

3'b001 : Y = D1;

3'b010 : Y = D2;

3'b011 : Y = D3;

3'b100 : Y = D4;

3'b101 : Y = D5;

3'b110 : Y = D6;

3'b111 : Y = D7;

default : Y = 0;

endcase end endmodule5、多位数值比较器

module compare_verilog(Y ,A ,B);input [3:0] A;//4位二进制数A wire [3:0] A;input [3:0] B;//4位二进制数B wire [3:0] B;output [2:0] Y;//A与B大小的比较结果 reg [2:0] Y;always @(A or B)begin

if(A > B)

Y B时Y输出3'b001

else if(A == B)

Y

else

Y

end endmodule6、全加器

module sum_verilog(A ,Co ,B ,S ,Ci);input A;//输入加数A wire A;input B;//输入加数B wire B;input Ci;//相邻低位的进位输入信号 wire Ci;output Co;//向相邻高位的进位输出信号 reg Co;output S;//相加和数输出 reg S;always @(A or B or Ci)begin

if(A== 0 && B == 0 && Ci == 0)

begin

S

Co

end else if(A== 1 && B == 0 && Ci == 0)

begin

S

Co

end else if(A== 0 && B == 1 && Ci == 0)

begin

S

Co

end else if(A==1 && B == 1 && Ci == 0)

begin

S

Co

end else if(A== 0 && B == 0 && Ci == 1)

begin

S

Co

end else if(A== 1 && B == 0 && Ci == 1)

begin

S

Co

end else if(A== 0 && B == 1 && Ci == 1)

begin

S

Co

end

else

begin

S

Co

end end endmodule7、D触发器

module Dflipflop(Q ,CLK , RESET ,SET ,D ,Qn);input CLK;//D触发器输入时钟 wire CLK;input RESET;//D触发器清零输入 wire RESET;input SET;//D触发器预置数输入 wire SET;input D;//D触发器输入 wire D;output Q;//D触发器输出 reg Q;output Qn;wire Qn;aign Qn = ~Q;//将D触发器输出取反

always @(posedge CLK or negedge SET or negedge RESET)begin

if(!RESET)//RESET下降沿将D触发器输出清零

Q

else if(!SET)//SER下降沿将D触发器输出置1

Q

else Q

8、寄存器

module reg8(clr ,clk ,DOUT ,D);input clr;//异步清零信号,高有效 wire clr;input clk;//时钟输入 wire clk;input [7:0] D;//寄存器数据输入 wire [7:0] D;output [7:0] DOUT;//寄存器数据输出 reg [7:0] DOUT;always @(posedge clk or posedge clr)begin

if(clr == 1'b1)

DOUT

else DOUT

end endmodule9、双向移位寄存器

module shiftdata(left_right ,load ,clr ,clk ,DIN ,DOUT);input left_right;// 左移右移控制信号 wire left_right;input load;//异步置数信号,有效时将DIN输入 wire load;input clr;//异步清零信号,高有效 wire clr;input clk;//时钟输入 wire clk;input [3:0] DIN;//并行输入 wire [3:0] DIN;output [3:0] DOUT;//并行输出

wire [3:0] DOUT;// DOUT是一个wire型变量,不能在always块中被赋值

reg [3:0] data_r;//所以定义一个寄存器型变量data_r作为中间变量 aign

DOUT = data_r;always @(posedge clk or posedge clr

or posedge load)begin

if(clr == 1)//异步清零

data_r

data_r

if(left_right)//left_right=1,信号左移

begin

data_r

data_r[0]

end

else begin //left_right=0,信号右移

data_r >1);

data_r[3]

end

end

end endmodule10、4位二进制加减法计数器

module counter4(load ,clr ,c ,DOUT , clk, up_down ,DIN);input load;//异步预置数 input clk;//输入时钟 wire load;input clr;//异步清零 wire clr;input up_down;//加减计数,up_dpwn=1加计数,up_down=0减计数 wire up_down;input [3:0] DIN;//预置数输入 wire [3:0] DIN;output c;//进位/借位输出,可以用于计数器的级联 reg c;output [3:0] DOUT;//计数输出 wire [3:0] DOUT;reg

[3:0] data_r;aign DOUT = data_r;always @(posedge clk or posedge clr

or posedge load)begin

if(clr == 1)

//异步清零

data_r

//异步预置

data_r

else begin if(up_down ==1)//加计数

begin

if(data_r == 4'b1111)begin

data_r

c = 1;

end

else begin

data_r

c = 0;

end

end

else //减计数

begin

if(data_r == 4'b0000)begin

data_r

c = 1;

end else begin

data_r

c = 0;

end

end

end end

endmodule11、十进制加减法计数器

module counter10(load ,clr ,c ,DOUT ,clk,up_down ,DIN ,seven_seg);input load;//异步预置数 input clk;//输入时钟 wire load;input clr;//异步清零 wire clr;input up_down;//加减计数,up_dpwn=1加计数,up_down=0减计数 wire up_down;input [3:0] DIN;//预置数输入 wire [3:0] DIN;output c;//进位/借位输出,可以用于计数器的级联 reg c;output [3:0] DOUT;//计数输出 output [7:0] seven_seg;//7段数码管 wire [3:0] DOUT;reg

[3:0] data_r;aign DOUT = data_r;always @(posedge clk or posedge clr

or posedge load)begin

if(clr == 1)

//异步清零

data_r

data_r

else if(up_down ==1 & data_r == 9)//加进位

begin

c = 1;

data_r

end else if(up_down ==0 & data_r == 0)//减借位

begin

c = 1;

data_r

end else

begin

if(up_down ==1)begin //加计数

data_r

c = 0;

end

else begin

//减计数

data_r

c = 0;

end

end end

/************数码管***************/ aign seven_seg =Y_r;reg [7:0] Y_r;always @(data_r)//用7段数码管显示计数输出 begin Y_r =8'b11111111;case(data_r)

4'b0000: Y_r = 8'b00000011;//显示0 4'b0001: Y_r = 8'b10011111;//显示1 4'b0010: Y_r = 8'b00100101;//显示2 4'b0011: Y_r = 8'b00001101;//显示3 4'b0100: Y_r = 8'b10011001;//显示4 4'b0101: Y_r = 8'b01001001;//显示5 4'b0110: Y_r = 8'b01000001;//显示6 4'b0111: Y_r = 8'b00011111;//显示7 4'b1000: Y_r = 8'b00000001;//显示8 4'b1001: Y_r = 8'b00001001;//显示9 default: Y_r = 8'b11111111;//默认数码管不发光

endcase end

endmodule12、顺序脉冲发生器

module pulsegen(Q ,clr ,clk);input clr;//异步预置数wire clr;input clk;//时钟输入 wire clk;output [7:0] Q;//顺序脉冲输出 wire [7:0] Q;reg [7:0] temp;reg x;aign Q =temp;always @(posedge clk or posedge clr)begin

if(clr==1)

begin

temp

x= 0;

end else

begin

x

;//序列最高位输出

temp

temp[0]

end

end endmodule13、序列信号发生器

module xlgen(Q ,clk ,res);input clk;//时钟输入 wire clk;input res;//异步预置数 wire res;output Q;//序列信号输出 reg Q;reg [7:0] Q_r;always @(posedge clk or posedge res)begin

if(res ==1)begin

Q

Q_r

end

else

begin

Q

Q_r

Q_r[0]

end

end endmodule1214、分频器

module clockdiv(Q ,rst ,sysclk ,sel);input rst;//系统复位 wire rst;input sysclk;//系统时钟输入 wire sysclk;input [1:0] sel;//分频倍数选择 wire [1:0] sel;output Q;//分频器输出 wire Q;reg [2:0] q;reg [31:0] cnt;reg clk;

//时钟分频模块

always @(posedge sysclk or negedge rst)begin if(!rst)begin

cnt

cnt

if(cnt >= 32'd2500000)begin /clk时钟周期是系统时钟周期的5000000倍

clk

cnt

end end end

//分频器模块

always @(posedge clk or negedge rst)if(!rst)q[0]

q[0]

always @(posedge q[0] or negedge rst)if(!rst)q[1]

q[1]

always @(posedge q[1] or negedge rst)if(!rst)q[2]

q[2]

aign Q =(sel== 2'd0)? clk : //分频器输出clk

(sel== 2'd1)? q[0] : //分频器输出clk的二分频

(sel== 2'd2)? q[1] : //分频器输出clk的四分频

(sel== 2'd3)? q[2] : 0;//分频器输出clk的八分频 endmodule

《硬件描述语言.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
硬件描述语言
点击下载文档
相关专题 什么是硬件描述语言 语言 硬件 什么是硬件描述语言 语言 硬件
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文