可编程资料讲解Word格式.docx
《可编程资料讲解Word格式.docx》由会员分享,可在线阅读,更多相关《可编程资料讲解Word格式.docx(36页珍藏版)》请在冰点文库上搜索。
以上情况已经可以完全模拟电路的工作情况,如果仿真正确,当且仅当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
=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:
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)?
LG=1'
SM=1'
end
elseif(A>
B)
beginEQ=1'
LG=(A>
B)?
else
SM=(A<
end
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)
⏹if(cnt==1214)
⏹cnt<
=0;
⏹elsecnt<
=cnt+1;
⏹clkout<
=~clkout;
⏹elseclkout<
=1'
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'
div_clk<
=~div_clk;
end
else
=counter+1'
b1;
endmodule
分频器与计数器的配合0-9
模块一:
分频
modulefenpin25(clk,rst,clk_1hz);
inputclk;
inputrst;
outputclk_1hz;
regclk_1hz;
reg[24:
0]cnt;
always@(posedgeclkornegedgerst)
if(rst==1'
b0)
cnt<
=25'
d0;
elseif(cnt==25'
d25000000)
clk_1hz<
=~clk_1hz;
else
模块二:
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<
elseif(en)
if(!
load)
=data;
elseif(q1<
9)
=q1+1;
else
=4'
b0000;
always@(q1)
if(q1==4'
h9)
cout=1'
elsecout=1'
模块三:
moduleqiduan(cnt,led,scan);
input[3:
0]cnt;
output[6:
0]led;
output[3:
0]scan;
reg[6:
wire[3:
assignscan=4'
b0001;
always@(cnt)
begin
case(cnt)
4'
b0001:
led=7'
b0000110;
b0010:
b1011011;
b0011:
b1001111;
b0100:
b1100110;
b0101:
b1101101;
b0110:
b1111100;
b0111:
b0000111;
b1000:
b1111111;
b1001:
b1101111;
b1010:
b1110111;
default:
b0111111;
endcase
顶层模块:
modulecount_160(clk,rst,en,load,data,cout,scan,led);
inputclk,rst,en,load;
wire[6:
fenpin25u0(clk,rst,clk_1hz);
cnt74160u1(clk_1hz,rst,en,load,data,cnt,cout);
qiduanu2(cnt,led,scan);
方法二:
modulesysclk(reset,sys_clk,clk_1hz);
inputreset;
reg[24:
0]cnt25m;
always@(posedgesys_clk)
if(reset==1'
b1)
cnt25m<
elseif(cnt25m==25'
begin
cnt25m<
clk_1hz<
cnt25m<
=cnt25m+1'
modulecnt_10(reset,clk,cnt);
inputclk,reset;
always@(posedgeclkorposedgereset)
elseif(cnt==4'
d9)
endmodule
moduleymxs(cnt,scan,data_out,);
input[3:
output[7:
0]data_out;
output[3:
0]scan;
assignscan=4'
reg[7:
0]data_out;
wire[3:
always@(cnt)
begin
case(cnt)
4'
b0000:
data_out<
=8'
b00111111;
b0001:
b00000110;
b0010:
b01011011;
b0011:
b01001111;
b0100:
b01100110;
b0101:
b01101101;
b0110:
b01111101;
b0111:
b00000111;
b1000:
b01111111;
b1001:
b01101111;
default:
b00000000;
endcase
顶层模块
moduletotal(reset,sys_clk,data_out,scan);
output[7:
wireclk_1hz;
sysclkU1(reset,sys_clk,clk_1hz);
cnt_10U2(reset,clk_1hz,cnt);
ymxsU3(cnt,scan,data_out);
占空比为1:
15的分频电路设计
moduleclk_15_1(clk,rst,clk_div);
inputclk,rst;
outputclk_div;
regclk_div;
reg[3:
always@(posedgeclkorposedgerst)
if(rst==1'
b1)cnt<
elsecnt<
end
always@(posedgeclkorposedgerst)
b1)clk_div<
d15)clk_div<
elseclk_div<
占空比为10:
6的波形设计和仿真
moduleclk_10_6(clk,rst,clk_div);
elseif(cnt>
d10)clk_div<
移位寄存器
1.并入串出
modulemyshift_3(din,clk,rst,load,dout);
inputclk,rst,load;
0]din;
outputdout;
regdout;
0]q;
dout<
elseif(load==1'
q<
=din;
=q<
<
1;
q[0]<
=q[3];
2.串入并出
modulemyshift_2(din,clk,rst,dout);
inputdin,clk,rst;
0]dout;
always@(posedgeclkornegedgerst)
else
dout={dout[2:
0],din};
end
3.串入串出
moduleshift_1(din,clk,dout);
inputdin,clk;
outputdout;
regdout;
regtmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7;
always@(posedgeclk)
tmp1<
tmp2<
=tmp1;
tmp3<
=tmp2;
tmp4<
=tmp3;
tmp5<
=tmp4;
tmp6<
=tmp5;
tmp7<
=tmp6;
=tmp7;
循环移位寄存器设计
⏹moduleshift_4(clk,rst,din,dout);
⏹inputclk,rst;
⏹input[3:
0]din;
⏹output[3:
⏹reg[3:
⏹always@(posedgeclkorposedgerst)
⏹if(rst==1'
⏹dout<
⏹elsebegin
⏹dout[3:
1]<
=dout[2:
0];
⏹dout[0]<
=dout[3];
⏹end
流水灯循环移位点亮
模块一
moduleshift_8(clk_2,rst,din,dout);
inputclk_2,rst;
input[3:
output[7:
always@(posedgeclk_2orposedgerst)
begin
if(rst==1'
dout<
else
begin
dout[7:
=dout[6:
dout[0]<
=dout[7];
end
end
modulefenpin(rst,clk,clk_1hz);
inputrst,clk;
0]counter;
always@(posedgeclkorposedgerst)
if(rst==1)
counter<
elseif(counter==25'
modulezong(rst,clk,din,dout);
inputrst,clk;
output[7:
fenpinU1(rst,clk,clk_1hz);
shift_8U2(clk_1hz,rst,din,dout);
数码管段轮流点亮
outputclk_1hz;
regclk_1hz;
reg[24:
if(rst==1)
counter<
elseif(counter==25'
counter<
end
moduleshift_8(clk_2,rst,din,scan,dout);
assignscan=4'
modulezong(rst,clk,din,scan,dout);
shift_8U2(clk_1hz,rst,din,scan,dout);
时钟
moduledigc_0379(sys_clk,reset,pause,scan,data_out);
inputsys_clk,reset,pause;
reg[2