可编程资料概览.docx
《可编程资料概览.docx》由会员分享,可在线阅读,更多相关《可编程资料概览.docx(36页珍藏版)》请在冰点文库上搜索。
可编程资料概览
大题全部写代码
1.标识符
value标识符格式reg,数字不能开头变量,可以%_$其他的不可以,关键词regor不行,内部有的
2.阻塞非阻塞赋值=立即赋值,<=延时,例子
a=b=ca=1b=ac=ba=c=b=1
a<=1b<=ac<=ba=1b=0c=0
阻塞赋值和非阻塞赋值的基本区别是:
阻塞赋值是顺序执行语句,而非阻塞赋值是并行执行语句。
3.{}拼接运算符作用:
不同的数拼在一起
例子:
A=3’b101B=6’b101101问{A,B[3:
1]}=6’b101110
记得数数是从0开始的,A全部,B的1到3
位宽不够高位补0;位宽过剩裁去高位
1s=10^3ms=10^6us=10^9ns=10^12ps
4.BCD码--B二进制D十进制O八进制H十六进制
2个十六进制为1个字节,8个二进制数为1个字节
例子(13)10=(00010011)BCD考试可能问(13)8=(?
)BCD
转换见书本目录页
5.属于可编程逻辑器件FPGACPLDEPLDARMC51X86不是
Assign对应wire
Always对应reg
6.注解行注解//段注解/*SDSJDKJDSLKDL*/
7.%叫做取余数13%5=3
/叫做整除13/5=2
8.ModelSim仿真工具,用代码生成波形,例子
Always
Begin
#10clk=0;(#叫做延迟时间单位,单位时间是timescale10ns/100ps,表示1单位时间=10ns,100ps代表精度,这句意思过了100ns后clk=0(clk前200ns是0)又过100nsclk取反)’
#10clk=~clk;
End200NS100NS100NS100NS
Clk
占空比高电平比整个周期1/2
这段测试代码的意思是:
以ps为单位,0时刻是,A=B=C=D=1,表示四个安全带均没有系上,然后过了10ps,B=0,代表这个安全带系上了;再过了10ps,A=0,代表另一个安全带系上了;再过了10ps,D=0,代表另一个安全带系上了;再过了10ps,C=0,最后一个安全带系上了。
然后再过10ps,B=1,这个安全带松开了。
最后再过20ps,测试结束。
以上情况已经可以完全模拟电路的工作情况,如果仿真正确,当且仅当A=B=C=D=0的时刻,LED_OUT=0,BUZ_OUT=0,灯灭,蜂鸣器不响;其它情况LED_OUT和BUZ_OUT均为1。
9.异步复位同步复位
Always@(posedgeclk)posedge上升沿negedge下降沿同步异步看posedge同步短
If(rstn==1’b0)
指定同步复位时,always的敏感表中仅有时钟沿信号,仅仅当时钟沿采到同步复位的有效电平时,才会在时钟沿到达时刻进行复位操作。
指定异步复位时,只需always的敏感表中加入复位信号的有效沿即可,当复位信号有效沿到达时,无论时钟沿是否有效,复位都会立即发挥其功能。
10.长信号赋值给短信号
例子
A=8’b10010011
B=3’b001
B<=A
B=011(取后几位)
Reg[19:
0]A
Reg[9:
0]B
B<=A,A的低位给B
大题
1.表决器7人(不要用卡罗图)5人3个控制端
两种方法
五人表决器
方法一:
数据流
module5get1(b1,b2,b3,b4,b5,u);
inputb1,b2,b3,b4,b5;
outputu;
wire[2:
0]add_result;
assignadd_result=b1+b2+b3+b4+b5;
assignu=add_result>=3?
1'b1:
1'b0;
endmodule
七人表决器
方法一
Input[6:
0]In;
Ouputu;
Always@(in)
If(in[6]+in[5]….+in[0]>4)
u=1;b1
Else
Out=1’b0
方法二
Case(In[0]+In[1]+……+In[6])
3’d4:
u=1’b1;
3’d5:
u=1’b1;
Default:
u=0;
Endcase;
2.多路选择器(5选1)
例子:
4选1数据选择器
⏹regF;
⏹always@(P0orP1orP2orP3orS)
⏹begin
⏹case(S)//用case语句进行选择
⏹2’b00:
F=P0;//S1S0=00时选择输出数据P0
⏹2’b01:
F=P1;//S1S0=01时选择输出数据P1
⏹2’b10:
F=P2;//S1S0=10时选择输出数据P2
⏹2’b11:
F=P3;//S1S0=11时选择输出数据P3
⏹endcase
⏹end
⏹endmodule
2位二进制数据比较器
modulea1(A,B,EQ,LG,SM);
input[1:
0]A,B;
outputEQ,LG,SM;
regEQ,LG,SM;
always@(AorB)
beginif(A==B)
beginEQ=(A==B)?
1'b1:
1'b0;LG=1'b0;SM=1'b0;
end
elseif(A>B)
beginEQ=1'b0;LG=(A>B)?
1'b1:
1'b0;SM=1'b0;
end
else
beginEQ=1'b0;LG=1'b0;SM=(A
1'b1:
1'b0;
end
end
endmodule
3触发器(置位,复位,上升沿,下降沿)
有圆圈是下降沿negedge升沿posedge
给图写代码
4.分频器
分频系数=原频率/目标频率=19.44MHZ/8KHZ=2430
最大计数为分频系数的一半(高低电平各一半)即1215 =10011100010B,因此二进制计数器的位数为11。
先弄分频系数直接除2430怎么知道多少位参考点2^10=1024;2^11=2048;2^12=4096;2^13=8192
解答
⏹always@(posedgeclk)
⏹begin
⏹if(cnt==1214)
⏹cnt<=0;
⏹elsecnt<=cnt+1;
⏹end
⏹always@(posedgeclk)
⏹begin
⏹if(cnt==1214)
⏹clkout<=~clkout;
⏹elseclkout<=1'b0;
⏹end
0.01s分频器(1s为25000000)
modulem_divider(sys_clk,div_clk);
inputsys_clk;
outputdiv_clk;
reg[26:
0]counter;
regdiv_clk;
always@(posedgesys_clk)
if(counter==27'd2500000000)
begin
counter<=27'b0;
div_clk<=~div_clk;
end
else
counter<=counter+1'b1;
endmodule
分频器与计数器的配合0-9
方法一
模块一:
分频
modulefenpin25(clk,rst,clk_1hz);
inputclk;
inputrst;
outputclk_1hz;
regclk_1hz;
reg[24:
0]cnt;
always@(posedgeclkornegedgerst)
begin
if(rst==1'b0)
cnt<=25'd0;
elseif(cnt==25'd25000000)
begin
cnt<=25'd0;
clk_1hz<=~clk_1hz;
end
else
cnt<=cnt+1;
end
endmodule
模块二:
modulecnt74160(clk,rst,en,load,data,dout,cout);
inputclk,rst,en,load;
input[3:
0]data;
output[3:
0]dout;
outputcout;
reg[3:
0]q1;
regcout;
assigndout=q1;
always@(posedgeclkornegedgerst)
begin
if(!
rst)
q1<=0;
elseif(en)
begin
if(!
load)
q1<=data;
elseif(q1<9)
q1<=q1+1;
else
q1<=4'b0000;
end
end
always@(q1)
begin
if(q1==4'h9)
cout=1'b1;
elsecout=1'b0;
end
endmodule
模块三:
moduleqiduan(cnt,led,scan);
input[3:
0]cnt;
output[6:
0]led;
output[3:
0]scan;
reg[6:
0]led;
wire[3:
0]scan;
assignscan=4'b0001;
always@(cnt)
begin
case(cnt)
4'b0001:
led=7'b0000110;
4'b0010:
led=7'b1011011;
4'b0011:
led=7'b1001111;
4'b0100:
led=7'b1100110;
4'b0101:
led=7'b1101101;
4'b0110:
led=7'b1111100;
4'b0111:
led=7'b0000111;
4'b1000:
led=7'b1111111;
4'b1001:
led=7'b1101111;
4'b1010:
led=7'b1110111;
default:
led=7'b0111111;
endcase
end
endmodule
顶层模块:
modulecount_160(clk,rst,en,load,data,cout,scan,led);
inputclk,rst,en,load;
input[3:
0]data;
outputcout;
output[6:
0]led;
output[3:
0]scan;
wire[3:
0]cnt;
wire[6:
0]led;
wire[3:
0]scan;
fenpin25u0(clk,rst,clk_1hz);
cnt74160u1(clk_1hz,rst,en,load,data,cnt,cout);
qiduanu2(cnt,led,scan);
endmodule
方法二:
模块一:
modulesysclk(reset,sys_clk,clk_1hz);
inputsys_clk;
inputreset;
outputclk_1hz;
reg[24:
0]cnt25m;
regclk_1hz;
always@(posedgesys_clk)
if(reset==1'b1)
cnt25m<=25'd0;
elseif(cnt25m==25'd25000000)
begin
cnt25m<=25'd0;
clk_1hz<=~clk_1hz;
end
else
cnt25m<=cnt25m+1'b1;
endmodule
模块二:
modulecnt_10(reset,clk,cnt);
inputclk,reset;
output[3:
0]cnt;
reg[3:
0]cnt;
always@(posedgeclkorposedgereset)
begin
if(reset==1'b1)
cnt<=4'b0000;
elseif(cnt==4'd9)
cnt<=4'b0000;
else
cnt<=cnt+1;
end
endmodule
模块三:
moduleymxs(cnt,scan,data_out,);
input[3:
0]cnt;
output[7:
0]data_out;
output[3:
0]scan;
assignscan=4'b0001;
reg[7:
0]data_out;
wire[3:
0]scan;
always@(cnt)
begin
case(cnt)
4'b0000:
data_out<=8'b00111111;
4'b0001:
data_out<=8'b00000110;
4'b0010:
data_out<=8'b01011011;
4'b0011:
data_out<=8'b01001111;
4'b0100:
data_out<=8'b01100110;
4'b0101:
data_out<=8'b01101101;
4'b0110:
data_out<=8'b01111101;
4'b0111:
data_out<=8'b00000111;
4'b1000:
data_out<=8'b01111111;
4'b1001:
data_out<=8'b01101111;
default:
data_out<=8'b00000000;
endcase
end
endmodule
顶层模块
moduletotal(reset,sys_clk,data_out,scan);
inputsys_clk;
inputreset;
output[7:
0]data_out;
output[3:
0]scan;
wireclk_1hz;
wire[3:
0]cnt;
sysclkU1(reset,sys_clk,clk_1hz);
cnt_10U2(reset,clk_1hz,cnt);
ymxsU3(cnt,scan,data_out);
endmodule
占空比为1:
15的分频电路设计
moduleclk_15_1(clk,rst,clk_div);
inputclk,rst;
outputclk_div;
regclk_div;
reg[3:
0]cnt;
always@(posedgeclkorposedgerst)
begin
if(rst==1'b1)cnt<=4'b0000;
elsecnt<=cnt+1;
end
always@(posedgeclkorposedgerst)
begin
if(rst==1'b1)clk_div<=1'b0;
elseif(cnt==4'd15)clk_div<=1'b1;
elseclk_div<=1'b0;
end
endmodule
占空比为10:
6的波形设计和仿真
moduleclk_10_6(clk,rst,clk_div);
inputclk,rst;
outputclk_div;
regclk_div;
reg[3:
0]cnt;
always@(posedgeclkorposedgerst)
begin
if(rst==1'b1)cnt<=4'b0000;
elsecnt<=cnt+1;
end
always@(posedgeclkorposedgerst)
begin
if(rst==1'b1)clk_div<=1'b0;
elseif(cnt>=4'd10)clk_div<=1'b1;
elseclk_div<=1'b0;
end
endmodule
移位寄存器
1.并入串出
modulemyshift_3(din,clk,rst,load,dout);
inputclk,rst,load;
input[3:
0]din;
outputdout;
regdout;
reg[3:
0]q;
always@(posedgeclkornegedgerst)
begin
if(rst==1'b0)
dout<=4'b0000;
elseif(load==1'b1)
q<=din;
else
begin
q<=q<<1;
q[0]<=1'b0;
end
dout<=q[3];
end
endmodule
2.串入并出
modulemyshift_2(din,clk,rst,dout);
inputdin,clk,rst;
output[3:
0]dout;
reg[3:
0]dout;
always@(posedgeclkornegedgerst)
begin
if(rst==1'b0)
dout<=4'b0000;
else
dout={dout[2:
0],din};
end
endmodule
3.串入串出
moduleshift_1(din,clk,dout);
inputdin,clk;
outputdout;
regdout;
regtmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7;
always@(posedgeclk)
begin
tmp1<=din;
tmp2<=tmp1;
tmp3<=tmp2;
tmp4<=tmp3;
tmp5<=tmp4;
tmp6<=tmp5;
tmp7<=tmp6;
dout<=tmp7;
end
endmodule
循环移位寄存器设计
⏹moduleshift_4(clk,rst,din,dout);
⏹inputclk,rst;
⏹input[3:
0]din;
⏹output[3:
0]dout;
⏹reg[3:
0]dout;
⏹always@(posedgeclkorposedgerst)
⏹begin
⏹if(rst==1'b1)
⏹dout<=din;
⏹elsebegin
⏹dout[3:
1]<=dout[2:
0];
⏹dout[0]<=dout[3];
⏹end
⏹end
⏹endmodule
流水灯循环移位点亮
模块一
moduleshift_8(clk_2,rst,din,dout);
inputclk_2,rst;
input[3:
0]din;
output[7:
0]dout;
reg[7:
0]dout;
always@(posedgeclk_2orposedgerst)
begin
if(rst==1'b1)
dout<=din;
else
begin
dout[7:
1]<=dout[6:
0];
dout[0]<=dout[7];
end
end
endmodule
模块二:
modulefenpin(rst,clk,clk_1hz);
inputrst,clk;
outputclk_1hz;
regclk_1hz;
reg[24:
0]counter;
always@(posedgeclkorposedgerst)
begin
if(rst==1)
counter<=0;
elseif(counter==25'd25000000)
begin
counter<=0;
clk_1hz<=~clk_1hz;
end
else
counter<=counter+1'b1;
end
endmodule
顶层模块:
modulezong(rst,clk,din,dout);
inputrst,clk;
input[3:
0]din;
output[7:
0]dout;
wireclk_1hz;
fenpinU1(rst,clk,clk_1hz);
shift_8U2(clk_1hz,rst,din,dout);
endmodule
数码管段轮流点亮
模块一:
modulefenpin(rst,clk,clk_1hz);
inputrst,clk;
outputclk_1hz;
regclk_1hz;
reg[24:
0]counter;
always@(posedgeclkorposedgerst)
begin
if(rst==1)
counter<=0;
elseif(counter==25'd25000000)
begin
counter<=0;
clk_1hz<=~clk_1hz;
end
else
counter<=counter+1'b1;
end
endmodule
模块二:
moduleshift_8(clk_2,rst,din,scan,dout);
inputclk_2,rst;
input[3:
0]din;
output[3:
0]scan;
output[7:
0]dout;
reg[7:
0]dout;
assignscan=4'b0001;
always@(posedgeclk_2orposedgerst)
begin
if(rst==1'b1)
dout<=din;
else
begin
dout[7:
1]<=dout[6:
0];
dout[0]<=dout[7];
end
end
endmodule
顶层模块:
modulezong(rst,clk,din,scan,dout);
inputrst,clk;
input[3:
0]din;
output[7:
0]dout;
output[3:
0]scan;
wireclk_1hz;
fenpinU1(rst,clk,clk_1hz);
shift_8U2(clk_1hz,rst,din,scan,dout);
endmodule
时钟
moduledigc_0379(sys_clk,reset,pause,scan,data_out);
inputsys_clk,reset,pause;
output[3:
0]scan;
output[7:
0]data_out;
reg[2