verilog 入门程序

module decode(data_in,EN,data_out)//4to16译码

input[3:0] data_in;
input EN;
output[6:0] data_out;

reg[6:0]data_out;

always(data_in or EN)
begin

data_out=7'b1111111;
if(EN==1)
case(data_in)

4'b0000:data_out=7'b0111111; //0
4'b0001:data_out=7'b0000110; //1
4'b0010:data_out=7'b1011011; //2
4'b0011:data_out=7'b1001111; //3
4'b0100:data_out=7'b1100110; //4
4'b0101:data_out=7'b1101101; //5
4'b0110:data_out=7'b1111101; //6
4'b0111:data_out=7'b0000111; //7
4'b1000:data_out=7'b1111111; //8
4'b1001:data_out=7'b1101111; //9
4'b1010:data_out=7'b0001000; //A
4'b1011:data_out=7'b0000011; //B
4'b1100:data_out=7'b0100111; //C
4'b1101:data_out=7'b0100001; //D
4'b1110:data_out=7'b0000110; //E
4'b1111:data_out=7'b0001110; //F

default: data_out=7'b1111111;

endcase
end

endmodule

 

 

/

module dff(Q,D,CLK); //该触发器只有信号输入端、输出端和时钟

output Q;
input D,CLK;

reg Q;

always@(posedge CLK)
begin
Q<=D;
end

endmodule


module dff(Q,Qn,D,CLK,Set,Reset);

input D,CLK,Set,Reset;
output Q,Qn;

reg Q,Qn;

always@(posedge CLK or negedge Set or negedge Reset)
begin
if(!Reset) begin Q<=0;Qn<=1;end //异步清0, 低电平有效
else if(Set) begin Q<=1;Qn<=0;end //异步置1, 低电平有效
else begin Q<=D;Qn<=~D;end
end

endmodule

module dff(Q,Qn,D,CLK,Set,Reset);

input D,CLK,Set,Reset;
output Q,Qn;

reg Q,Qn;

always@(posedge CLK)
begin
if(!Reset) begin Q<=0;Qn<=1;end //同步清0, 低电平有效
else if(Set) begin Q<=1;Qn<=0;end //同步置1, 低电平有效
else begin Q<=D;Qn<=~D;end
end

endmodule

/

同步清零:
//功能文件
module dff_tongbu(D,CLK,CLR,Q);

input D,CLK,CLR;
output Q;

reg Q;

always@(negedge CLK)
if(!CLR) Q=0;
else Q=D;

endmodule

//测试文件
`timescale 1ns/100ps
module test_dff_tongbu;
reg D,CLK,CLR;
wire Q;
initial
begin
D=0;
CLK=0;
CLR=0;
#30 CLR=1;
#15 D=1;
#10 D=0;
#20 D=1;
#10000 $finish;
end
always #10 CLK=~CLK;
dff_tongbu dff(D,CLK,CLR,Q);
endmodule


异步清零:
//功能文件
module dff_yibu(D,CLK,CLR,Q);

input D,CLK,CLR;
output Q;

reg Q;

always@(negedge CLK or negedge CLR)
if(!CLR)
D=0;
else
Q=D;

endmodule

//测试文件
`timescale 1ns/100ps
module test_dff_yibu;
reg D,CLK,CLR;
wire Q;
initial
begin
CLR=0;
#10 CLR=1;
CLK=0;
D=0;
#20 D=0;
#25 D=1;
#10000 $finish;
end
always #10 CLK=~CLK;
dff_yibu dff(D,CLK,CLR,Q);
endmodule


/
//十进制计数器

module cnt_10(CLK,Q_out);

input CLK;
output[3:0]Q_out;

reg[3:0]Q_out;

always@(posedge CLK)
begin
if(Q_out==9) Q_out<=0;
else Q_out<=Q_out+1'b1;
end

endmodule

/
//可加可减的计数器

module updown_count(D,CLK,Clear,Load,up_dowm,Q_out);

input[3:0]D;
input CLK,Clear,Load,up_down;
output[3:0]Q_out;

reg[3:0]cnt;

always@(posedge CLK)
begin
if(!Clear) cnt<=8'h00; //同步清零 低电平有效
else if(Load) cnt<=d; //同步预置
else if(up_down) cnt<=cnt+1'b1; //加计数器
else cnt<=cnt-1'b1; //减计数器
end

assign Q_out=cnt;

endmodule

///
//两位十进制计数器

module cnt_99(CLK,QH,QL);

input CLK;
output[3:0]QH,QL;

reg m;
reg[3:0]QH,QL;

always@(posedge CLK)
begin
if(QL==4'd9)
begin
QL<=4'd0;
m<=1'b1;
end
else
begin
QL<=QL+1'b1;
m<=0;
end
end

always@(posedge CLK)
begin
if(m)
if(QH==4'd9)
QH<=0;
else QH<=QH+1'b1;
end

endmodule

/
//带有同步复位,同步置数的模60 的计数器

moudle count60(qout,count,data,load,cin,reset,clk);

input[7:0]data;
input clk,load,cin,reset;
output count;
output[7:0]qout;

reg[7:0]qout;

always@(posedge clk)
begin
if(reset) qout<=0; //同步复位 高电平有效
else if(load) qout<=data;
else if(cin)
begin
if(qout[3:0]==9) //判断低位是否为9,是则清零
begin
qout[3:0]<=4'd0;
if(qout[7:4]==5) //判断高位是否为5,是则清零
qout[7:4]<=4'd0;
else qout[7:4]<=qout[7:4]+1'b1;
end
else qout[3:0]<=qout[3:0]+1'b1;
end
end

assign count=((qout==8'h59)&cin)?1:0;

endmodule

 

 

转载于:https://www.cnblogs.com/April1314/p/3471580.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值