FPGA代码.docx

上传人:b****5 文档编号:3525990 上传时间:2022-11-23 格式:DOCX 页数:69 大小:122.31KB
下载 相关 举报
FPGA代码.docx_第1页
第1页 / 共69页
FPGA代码.docx_第2页
第2页 / 共69页
FPGA代码.docx_第3页
第3页 / 共69页
FPGA代码.docx_第4页
第4页 / 共69页
FPGA代码.docx_第5页
第5页 / 共69页
点击查看更多>>
下载资源
资源描述

FPGA代码.docx

《FPGA代码.docx》由会员分享,可在线阅读,更多相关《FPGA代码.docx(69页珍藏版)》请在冰豆网上搜索。

FPGA代码.docx

FPGA代码

第二课

moduleled_test(a,b,key_in,led_out);

inputa;//输入端口A

inputb;//输入端口B

inputkey_in;//按键输入,实现输入输入通道的选择

outputled_out;//led控制端口

//当key_in==0:

led_out=a

assignled_out=(key_in==0)?

a:

b;

Endmodule

第三课3——8译码器

modulemy3_8(a,b,c,out);

inputa;//杈撳叆绔彛A

inputb;//杈撳叆绔彛B

inputc;//杈撳叆绔彛C

output[7:

0]out;//杈撳嚭绔彛

reg[7:

0]out;

always@(a,b,c)begin

case({a,b,c})

3'b000:

out=8'b0000_0001;

3'b001:

out=8'b0000_0010;

3'b010:

out=8'b0000_0100;

3'b011:

out=8'b0000_1000;

3'b100:

out=8'b0001_0000;

3'b101:

out=8'b0010_0000;

3'b110:

out=8'b0100_0000;

3'b111:

out=8'b1000_0000;

endcase

end

endmodule

第四课计数器

modulecounter(Clk50M,Rst_n,led);

inputClk50M;//系统时钟,50M

inputRst_n;//全局复位,低电平复位

outputregled;//led输出

reg[24:

0]cnt;//定义计数器寄存器

//计数器计数进程

always@(posedgeClk50MornegedgeRst_n)

if(Rst_n==1'b0)

cnt<=25'd0;

//elseif(cnt==25'd24_999_999)

elseif(cnt==25'd24_999)

cnt<=25'd0;

else

cnt<=cnt+1'b1;

//led输出控制进程

always@(posedgeClk50MornegedgeRst_n)

if(Rst_n==1'b0)

led<=1'b1;

//elseif(cnt==25'd24_999_999)

elseif(cnt==25'd24_999)

led<=~led;

else

led<=led;

endmodule

第五课计数器——IP核

modulecounter_top(cin,clk,cout,q);

inputcin;

inputclk;

outputcout;

output[7:

0]q;

wirecout0;

countercounter0(

.cin(cin),

.clock(clk),

.cout(cout0),

.q(q[3:

0])

);

countercounter1(

.cin(cout0),

.clock(clk),

.cout(cout),

.q(q[7:

4])

);

endmodule

Testbench(仿真)

`timescale1ns/1ns

`defineclock_period20

modulecounter_tb;

regcin;//进位输入

regclk;//计数基准时钟

wirecout;//进位输出

wire[3:

0]q;

countercounter0(

.cin(cin),

.clock(clk),

.cout(cout),

.q(q)

);

initialclk=1;

always#(`clock_period/2)clk=~clk;

initialbegin

repeat(20)begin

cin=0;

#(`clock_period*5)cin=1;

#(`clock_period)cin=0;

end

#(`clock_period*200);

$stop;

end

Endmodule

top_ip

`timescale1ns/1ns

`defineclock_period20

modulecounter_top_tb;

regcin;//进位输入

regclk;//计数基准时钟

wirecout;//进位输出

wire[7:

0]q;

counter_topcounter0(

.cin(cin),

.clk(clk),

.cout(cout),

.q(q)

);

initialclk=1;

always#(`clock_period/2)clk=~clk;

initialbegin

repeat(300)begin

cin=0;

#(`clock_period*5)cin=1;

#(`clock_period)cin=0;

end

#(`clock_period*200);

$stop;

end

Endmodule

第六课BCD计数器

moduleBCD_Counter(Clk,Cin,Rst_n,Cout,q);

inputClk;//计数基准时钟

inputCin;//计数器进位输入

inputRst_n;//系统复位

outputCout;//计数进位输出

output[3:

0]q;//计数值输出

reg[3:

0]cnt;//定义计数器寄存器

//执行计数过程

always@(posedgeClkornegedgeRst_n)

if(Rst_n==1'b0)

cnt<=4'd0;

elseif(Cin==1'b1)begin

if(cnt==4'd9)

cnt<=4'd0;

else

cnt<=cnt+1'b1;

end

else

cnt<=cnt;

//产生进位输出信号

assignCout=(Cin==1'b1&&cnt==4'd9);

assignq=cnt;

Endmodule

Counter_Top

moduleBCD_Counter_top(Clk,Cin,Rst_n,Cout,q);

inputClk;//计数基准时钟

inputCin;//计数器进位输入

inputRst_n;//系统复位

outputCout;//计数进位输出

output[11:

0]q;//计数值输出

wireCout0,Cout1;

wire[3:

0]q0,q1,q2;

assignq={q2,q1,q0};

BCD_CounterBCD_Counter0(

.Clk(Clk),

.Cin(Cin),

.Rst_n(Rst_n),

.Cout(Cout0),

.q(q0)

);

BCD_CounterBCD_Counter1(

.Clk(Clk),

.Cin(Cout0),

.Rst_n(Rst_n),

.Cout(Cout1),

.q(q1)

);

BCD_CounterBCD_Counter2(

.Clk(Clk),

.Cin(Cout1),

.Rst_n(Rst_n),

.Cout(Cout),

.q(q2)

);

endmodule

仿真

`timescale1ns/1ns

`defineclock_period20

moduleBCD_Counter_tb;

regClk;

regCin;

regRst_n;

wireCout;

wire[3:

0]q;

BCD_CounterBCD_Counter0(

.Clk(Clk),

.Cin(Cin),

.Rst_n(Rst_n),

.Cout(Cout),

.q(q)

);

initialClk=1'b1;

always#(`clock_period/2)Clk=~Clk;

initialbegin

Rst_n=1'b0;

Cin=1'b0;

#(`clock_period*200);

Rst_n=1'b1;

#(`clock_period*20);

repeat(30)begin

Cin=1'b1;

#`clock_period;

Cin=1'b0;

#(`clock_period*5);

end

#(`clock_period*20);

$stop;

end

Endmodule

Top_仿真

`timescale1ns/1ns

`defineclock_period20

moduleBCD_Counter_top_tb;

regClk;

regCin;

regRst_n;

wireCout;

wire[11:

0]q;

BCD_Counter_topBCD_Counter_top0(

.Clk(Clk),

.Cin(Cin),

.Rst_n(Rst_n),

.Cout(Cout),

.q(q)

);

initialClk=1'b1;

always#(`clock_period/2)Clk=~Clk;

initialbegin

Rst_n=1'b0;

Cin=1'b0;

#(`clock_period*200);

Rst_n=1'b1;

#(`clock_period*20);

Cin=1'b1;

#(`clock_period*5000);

$stop;

end

endmodule

 

第七课阻塞与非阻塞

`timescale1ns/1ns

`definetp1

moduleblock_nonblock(Clk,Rst_n,a,b,c,out);

inputClk;

inputRst_n;

inputa,b,c;

outputreg[1:

0]out;

//out=a+b+c;

//d=a+b;

//out=d+c;

reg[1:

0]d;

always@(posedgeClkornegedgeRst_n)

if(!

Rst_n)

out<=2'b0;

elsebegin

out<=a+b+c;

end

endmodule

仿真

`timescale1ns/1ns

`defineclock_period20

moduleblock_nonblock_tb;

regClock;

regRst_n;

rega,b,c;

wire[1:

0]out;

block_nonblockblock_nonblock0(Clock,Rst_n,a,b,c,out);

initialClock=1;

always#(`clock_period/2)Clock=~Clock;

initialbegin

Rst_n=1'b0;

a=0;

b=0;

c=0;

#(`clock_period*200+1);

Rst_n=1'b1;

#(`clock_period*200);

a=0;b=0;c=0;

#(`clock_period*200);

a=0;b=0;c=1;

#(`clock_period*200);

a=0;b=1;c=0;

#(`clock_period*200);

a=0;b=1;c=1;

#(`clock_period*200);

a=1;b=0;c=0;

#(`clock_period*200);

a=1;b=0;c=1;

#(`clock_period*200);

a=1;b=1;c=0;

#(`clock_period*200);

a=1;b=1;c=1;

#(`clock_period*200);

#(`clock_period*200);

$stop;

end

Endmodule

第八课状态机

moduleHello(Clk,Rst_n,data,led);

inputClk;//50M

inputRst_n;//低电平复位

input[7:

0]data;

outputregled;

localparam

CHECK_H=5'b0_0001,

CHECK_e=5'b0_0010,

CHECK_la=5'b0_0100,

CHECK_lb=5'b0_1000,

CHECK_o=5'b1_0000;

reg[4:

0]state;

always@(posedgeClkornegedgeRst_n)

if(!

Rst_n)begin

led<=1'b1;

state<=CHECK_H;

end

elsebegin

case(state)

CHECK_H:

if(data=="H")

state<=CHECK_e;

else

state<=CHECK_H;

CHECK_e:

if(data=="e")

state<=CHECK_la;

else

state<=CHECK_H;

CHECK_la:

if(data=="l")

state<=CHECK_lb;

else

state<=CHECK_H;

CHECK_lb:

if(data=="l")

state<=CHECK_o;

else

state<=CHECK_H;

CHECK_o:

begin

state<=CHECK_H;

if(data=="o")

led<=~led;

else

led<=led;

end

default:

state<=CHECK_H;

endcase

end

endmodule

仿真

`timescale1ns/1ns

`defineclock_period20

moduleHello_tb;

regClk;

regRst_n;

reg[7:

0]ASCII;

wireled;

HelloHello0(

.Clk(Clk),

.Rst_n(Rst_n),

.data(ASCII),

.led(led)

);

initialClk=1;

always#(`clock_period/2)Clk=~Clk;

initialbegin

Rst_n=0;

ASCII=0;

#(`clock_period*200);

Rst_n=1;

#(`clock_period*200+1);

foreverbegin

ASCII="I";

#(`clock_period);

ASCII="A";

#(`clock_period);

ASCII="M";

#(`clock_period);

ASCII="X";

#(`clock_period);

ASCII="i";

#(`clock_period);

ASCII="a";

#(`clock_period);

ASCII="o";

#(`clock_period);

ASCII="M";

#(`clock_period);

ASCII="e";

#(`clock_period);

ASCII="i";

#(`clock_period);

ASCII="g";

#(`clock_period);

ASCII="e";

#(`clock_period);

ASCII="H";

#(`clock_period);

ASCII="E";

#(`clock_period);

ASCII="M";

#(`clock_period);

ASCII="l";

#(`clock_period);

ASCII="H";

#(`clock_period);

ASCII="E";

#(`clock_period);

ASCII="L";

#(`clock_period);

ASCII="L";

#(`clock_period);

ASCII="O";

#(`clock_period);

ASCII="H";

#(`clock_period);

ASCII="e";

#(`clock_period);

ASCII="l";

#(`clock_period);

ASCII="l";

#(`clock_period);

ASCII="o";

#(`clock_period);

ASCII="l";

end

end

Endmodule

第九课按键消抖

modulekey_filter(Clk,Rst_n,key_in,key_flag,key_state);

inputClk;

inputRst_n;

inputkey_in;

outputregkey_flag;

outputregkey_state;

localparam

IDEL=4'b0001,

FILTER0=4'b0010,

DOWN=4'b0100,

FILTER1=4'b1000;

reg[3:

0]state;

reg[19:

0]cnt;

regen_cnt;//浣胯兘璁℃暟瀵勫瓨鍣?

//瀵瑰閮ㄨ緭鍏ョ殑寮傛淇″彿杩涜鍚屾澶勭悊

regkey_in_sa,key_in_sb;

always@(posedgeClkornegedgeRst_n)

if(!

Rst_n)begin

key_in_sa<=1'b0;

key_in_sb<=1'b0;

end

elsebegin

key_in_sa<=key_in;

key_in_sb<=key_in_sa;

end

regkey_tmpa,key_tmpb;

wirepedge,nedge;

regcnt_full;//璁℃暟婊℃爣蹇椾俊鍙?

//浣跨敤D瑙﹀彂鍣ㄥ瓨鍌ㄤ袱涓浉閭绘椂閽熶笂鍗囨部鏃跺閮ㄨ緭鍏ヤ俊鍙凤紙宸茬粡鍚屾鍒扮郴缁熸椂閽熷煙涓級鐨勭數骞崇姸鎬?

always@(posedgeClkornegedgeRst_n)

if(!

Rst_n)begin

key_tmpa<=1'b0;

key_tmpb<=1'b0;

end

elsebegin

key_tmpa<=key_in_sb;

key_tmpb<=key_tmpa;

end

//浜х敓璺冲彉娌夸俊鍙?

assignnedge=!

key_tmpa&key_tmpb;

assignpedge=key_tmpa&(!

key_tmpb);

always@(posedgeClkornegedgeRst_n)

if(!

Rst_n)begin

en_cnt<=1'b0;

state<=IDEL;

key_flag<=1'b0;

key_state<=1'b1;

end

elsebegin

case(state)

IDEL:

begin

key_flag<=1'b0;

if(nedge)begin

state<=FILTER0;

en_cnt<=1'b1;

end

else

state<=IDEL;

end

FILTER0:

if(cnt_full)begin

key_flag<=1'b1;

key_state<=1'b0;

en_cnt<=1'b0;

state<=DOWN;

end

elseif(pedge)begin

state<=IDEL;

en_cnt<=1'b0;

end

else

state<=FILTER0;

DOWN:

begin

key_flag<=1'b0;

if(pedge)begin

state<=FILTER1;

en_cnt<=1'b1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1