#verilogFPGA实例文档格式.docx
《#verilogFPGA实例文档格式.docx》由会员分享,可在线阅读,更多相关《#verilogFPGA实例文档格式.docx(87页珍藏版)》请在冰豆网上搜索。
input[3:
b1111_1111。
begin
if(a>
9>
y<
=a+6。
//这里完成了二进制到十进制的译码,
else
=a。
end
//为了方便在平台上进行观察验证
///这里把数据的个位和十位分别用4个LED进行显示,均为二进制
Endmodule
实验3BCD码—七段数码管显示译码器
moduledecode4_7(decodeout,a>
。
output[6:
0]decodeout。
input[3:
reg[6:
always@(a>
case(a>
//用case语句进行译码abcdefg
4'
h0:
decodeout=7'
b1111110。
h1:
b0110000。
h2:
b1101101。
h3:
b1111001。
h4:
b0110011。
h5:
b1011011。
h6:
b1011111。
h7:
b1110000。
h8:
b1111111。
h9:
b1111011。
ha:
b1110111。
4'
hb:
b0011111。
hc:
b1001110。
hd:
b0111101。
he:
b1001111。
hf:
b1000111。
default:
decodeout=7'
bx。
endcase
实验48-3编码器
//a8-3coder
modulecoder(dout,din>
output[2:
0]dout。
input[7:
0]din。
reg[2:
always@(din>
case(din>
8'
b1111_1110:
dout<
=3'
b000。
b1111_1101:
b001。
b1111_1011:
b010。
b1111_0111:
b011。
b1110_1111:
b100。
b1101_1111:
b101。
b1011_1111:
b110。
b0111_1111:
b111。
default:
endmodule
实验58-3优先编码器
moduleencoder(d0,d1,d2,d3,d4,d5,d6,d7,x,y,v>
outputx,y,v。
inputd0,d1,d2,d3,d4,d5,d6,d7。
regx,y,v。
always@(d0ord1ord2ord3ord4ord5ord6ord7>
if(d7==0>
{x,y,v}=3'
b111。
elseif(d6==0>
b110。
elseif(d5==0>
b101。
elseif(d4==0>
b100。
elseif(d3==0>
b011。
elseif(d2==0>
b010。
elseif(d1==0>
b001。
elseif(d0==0>
b000。
bxxx。
实验6十—二进制编码器
//decimaltobinaryencoder
moduleencoder(y,a>
output[4:
0]y。
input[4:
//input[4]为十位,[3:
0]为个位?
reg[4:
always@(a>
//A是敏感信号
begin
=a-6。
//这里完成了十进制到二进制的编码,
end
///这里把数据的个位用4个2进制数据表示,十位用1bit进行显示;
实验7三选一数据选择器
modulemux3to1(dout,a,b,c,sel>
output[1:
input[1:
0]a,b,c。
input[1:
0]sel。
reg[1:
//RTLmodeling
always@(aorborcorsel>
case(sel>
2'
b00:
b01:
=b。
b10:
=c。
dout<
=2'
实验8半加器
//数据流方式描述的1位半加器
modulehalfadder(sum,cout,a,b>
inputa,b。
outputsum,cout。
assignsum=a^b。
assigncout=a&
b。
//carryout。
附录:
各种不同的描述方式:
1,调用门元件实现的1位半加器
modulehalf_add1(a,b,sum,cout>
and(cout,a,b>
xor(sum,a,b>
2,采用行为描述的1位半加器
modulehalf_add3(a,b,sum,cout>
regsum,cout。
always@(aorb>
begincase({a,b}>
//真值表描述
b00:
beginsum=0。
cout=0。
b01:
beginsum=1。
b10:
b11:
cout=1。
end
3,采用行为描述的1位半加器
modulehalf_add4(a,b,sum,cout>
sum=a^b。
cout=a&
实验9全加器
//1bitfulladder1位全加器
modulefull_add(a,b,cin,sum,cout>
inputa,b,cin。
assign{cout,sum}=a+b+cin。
各种不同的描述方式实现的1位全加器
1,调用门元件实现的1位全加器
modulefull_add1(a,b,cin,sum,cout>
wires1,m1,m2,m3。
and(m1,a,b>
(m2,b,cin>
(m3,a,cin>
xor(s1,a,b>
(sum,s1,cin>
or(cout,m1,m2,m3>
2数据流描述的1位全加器
modulefull_add2(a,b,cin,sum,cout>
assignsum=a^b^cin。
assigncout=(a&
b>
|(b&
cin>
|(cin&
a>
3行为描述的1位全加器
modulefull_add4(a,b,cin,sum,cout>
//在always块中被赋值的变量应定义为reg型
regm1,m2,m3。
always@(aorborcin>
sum=(a^b>
^cin。
m1=a&
b。
m2=b&
cin。
m3=a&
cout=(m1|m2>
|m3。
4混合描述的1位全加器
modulefull_add5(a,b,cin,sum,cout>
regcout,m1,m2,m3。
wires1。
xorx1(s1,a,b>
//调用门元件
//always块语句
cout=(m1|m2>
|m3。
assignsum=s1^cin。
//assign持续赋值语句
实验10半减器
modulehalf_sub(diff,sub_out,x,y>
outputdiff,sub_out。
inputx,y。
regdiff,sub_out。
//行为描述
always@(xory>
case({x,y}>
2'
begindiff=0。
sub_out=0。
begindiff=1。
sub_out=1。
b11:
begindiff=x。
sub_out=x。
endmodule
实验11全减器
modulefull_sub(diff,sub_out,x,y,sub_in>
inputx,y,sub_in。
always@(xoryorsub_in>
case({x,y,sub_in}>
3'
实验12多位数值比较器
modulecomp(ABB,AEB,ASB,A,B,I1,I2,I3>
outputABB,AEB,ASB。
//ABB表示A>
BAEB表示A=B,ASB表示A<
B。
0]A,B。
inputI1,I2,I3。
//I1表示上一级的A>
BI2表示上一级的A=B,I3表示上一级的A<
regABB,AEB,ASB。
always@(AorBorI1orI2orI3>
if(A>
B>
{ABB,AEB,ASB}=3'
elseif(A<
else//A=B,但是考虑到前一级的情况
beginif(I1>
//I1表示上一级的A>
B
{ABB,AEB,ASB}=3'
elseif(I3>
//I3表示上一级的A<
实验13奇偶校验
//奇偶校验位产生器
moduleparity(even_bit,odd_bit,input_bus>
outputeven_bit,odd_bit。
input[7:
0]input_bus。
assignodd_bit=^input_bus。
//产生奇校验位
assigneven_bit=~odd_bit。
//产生偶校验位
实验14补码生成
modulecompo(d_out,d_in>
0]d_out。
0]d_in。
reg[7:
always@(d_in>
if(d_in[7]==1'
b0>
//正数,最高位为符号位,0说明是正数,正数补码是其本身
d_out=d_in。
else//负数
d_out={d_in[7],~d_in[6:
0]+1'
b1}。
//最高位符号位不变,数据位加一构成其补码
实验158位硬件加法器的设计
//8位硬件加法器
moduleadd8b(cout,sum,a,b,cin>
output[7:
0]sum。
outputcout。
0]a,b。
inputcin。
实验164位并行乘法器
//4位并行乘法器
modulemult(outcome,a,b>
parametersize=4。
input[size:
1]a,b。
//两个操作数
output[2*size:
1]outcome。
//结果
assignoutcome=a*b。
//乘法运算符
实验17七人表决器
//for语句描述的七人投票表决器
modulevoter7(pass,vote>
outputpass。
//通过为高电平,否则为低电平
input[6:
0]vote。
//7个投票输入#通过为高,否定为低
reg[2:
integeri。
regpass。
always@(vote>
sum=0。
for(i=0。
i<
=6。
i=i+1>
//for语句
if(vote[i]>
sum=sum+1。
if(sum[2]>
pass=1。
//若超过4人赞成,则pass=1
elsepass=0。
实验18格雷码变换
moduleBIN2GARY(EN,DATA_IN,DATA_OUT>
inputEN。
input[3:
0]DATA_IN。
output[3:
0]DATA_OUT。
assignDATA_OUT[0]=(DATA_IN[0]^DATA_IN[1]>
&
&
EN。
assignDATA_OUT[1]=(DATA_IN[1]^DATA_IN[2]>
assignDATA_OUT[2]=(DATA_IN[2]^DATA_IN[3]>
assignDATA_OUT[3]=DATA_IN[3]&
二、时序逻辑实验
实验1D触发器
modulemyDFF(q,qn,d,clk,set,reset>
inputd,clk,set,reset。
outputq,qn。
regq,qn。
always@(posedgeclk>
if(reset>
q<
=0。
qn<
=1。
//同步清0,高电平有效
elseif(set>
=1。
=0。
//同步置1,高电平有效
elsebegin
=d。
=~d。
实验2JK触发器
//带异步清0、异步置1的JK触发器
moduleJK_FF(CLK,J,K,Q,RS,SET>
inputCLK,J,K,SET,RS。
outputQ。
regQ。
always@(posedgeCLKornegedgeRSornegedgeSET>
RS>
Q<
=1'
b0。
elseif(!
SET>
b1。
elsecase({J,K}>
=Q。
=~Q。
Q<
实验3四位移位寄存器
//4位移位寄存器
moduleshifter(din,clk,clr,dout>
inputdin,clk,clr。
output[3:
reg[3:
if(clr>
=4'
dout<
=dout<
<
1。
//输出信号左移一位
dout[0]<
=din。
//输入信号补充到输出信号的最低位
//分频器部分,获得便于实验观察的时钟信号
moduleclk_div(clk_out,clk_in>
inputclk_in。
outputclk_out。
regclk_out。
reg[25:
0]counter。
//50_000_000=1011_1110_1011_1100_0010_0000_00
parametercnt=50_000_000。
///50MHzisthesysclk,50_000_000=2FAF080
always@(posedgeclk_in>
counter<
=counter+1。
if(counter==cnt/2-1>
clk_out<
=!
clk_out。
实验4异步计数器
//行为描述方式实现的4位异步计数器
modulecounter(clk,clr,q0,q1,q2,q3>
inputclk,clr。
outputq0,q1,q2,q3。
regq0,q1,q2,q3。
//regq0_t,q1_t,q2_t,q3_t。
regq0_r,q1_r,q2_r,q3_r。
always@(posedgeclkornegedgeclr>
clr>
q0_r<
q0_r<
q0_r。
always@(posedgeq0_rornegedgeclr>
q1_r