verilog串并转换并串转换

余年寄山水
554次浏览
2021年02月11日 04:09
最佳经验
本文由作者推荐

-

2021年2月11日发(作者:萤窗雪案)


1.


设计名称:


38


译码器带使能端的



主要功能:



实现


38


译码功能,并且在使能段处于低电 平是输出为


00000000


设计框图:




设计代码:



module decoder3_8(a,b,ena);


input [2:0] a;


input



ena;


output [7:0] b;


reg





[7:0] b;


always @ (ena,a)


if(!ena)


begin




b=8'b00000000;


end


else



begin


case(a)


3'b000:



b=8'b00000001;


3'b001:



b=8'b00000010;


3'b010:



b=8'b00000100;


3'b011:



b=8'b00001000;


3'b100:



b=8'b00010000;


3'b101:



b=8'b00100000;


3'b110:



b=8'b01000000;


3'b111:



b=8'b10000000;


default: b=8'b00000000;


endcase


end


endmodule


仿真代码:



`timescale 1ns/1ns


module tb;







reg [2:0] a;








reg ena;








wire [7:0] b;




initial begin









a




= 3'b000;









ena = 1'b0;









#50;












ena = 1'b1;









#50;












a=3'b001;









#50;












a=3'b010;









#50;












a=3'b011;









#50;












a=3'b100;









#50;












a=3'b101;









#50;












a=3'b110;









#50;












a=3'b111;











#50;









$$ stop;





end





decoder3_8 udecoder3_8(




















.a(a),




















.ena(ena),




















.b(b)





);


endmodule


仿真结果:






辅助说明:




ena


为低电平时,无论


a


为何值, 总是输出


00000000


,当


ena


为高电平时,输出即随


a


的数值变化而 变化,



a



001


时,


b


的值变为


00000010




a



010


时,


b< /p>


的值变为


00000100


< p>
这与设计时的功能是一致的。



________ __________________________________________________ _____________________


2.


设计名 称:


83


编码器带使能端的和优先级



主要功能:



实现

83


编码功能,并且在使能段处于低电平是输出为


000< /p>


,同时最高位的优先级最高



设计框图:




设计代码:



module undecoder8_3(a,b,ena);


input [7:0] a;


input



ena;


output [3:0] b;


reg





[3:0] b;


always @ (ena,a)


if(!ena)


begin




b=3'b000;


end


else



if(a[7])




b=3'b111;


else


if(a[6])




b=3'b110;


else


if(a[5])




b=3'b101;


else


if(a[4])




b=3'b100;


else


if(a[3])




b=3'b011;


else


if(a[2])




b=3'b010;


else


if(a[1])




b=3'b001;


else


if(a[0])




b=3'b000;


else






b=3'b000




endmodule


仿真代码:



module tb;





reg [7:0] a;





reg ena;





wire [2:0] b;





initial begin









a




= 8'b10000000;









ena = 1'b0;









#50;












ena = 1'b1;









#50;












a=8'b01000000;









#50;












a=8'b00100000;









#50;












a=8'b00010000;









#50;












a=8'b00001000;









#50;












a=8'b00000010;









#50;












a=8'b00000001;









#50;












a=8'b10100000;











#50;









$$stop;





end








undecoder8_3 unit1_undecoder8_3(




















.a(a),




















.ena(ena),




















.b(b)





);


endmodule


仿真结果:




辅助说明:




ena


为低电平时,无论


a


为何值, 总是输出


000


,当


ena

< p>
为高电平时,输出即随


a


的数值

< br>变化而变化,当


a



01000 000


时,


b



110


,当


a


00100000


是,


b



101


以此类推,同


时最后一个波形为,当< /p>


a



10100000

< br>时,


b



111


,体现了优先译码的功能,此结果和当


初设计的功能一致的。

< br>


___________________________________ ____________________________________________


3.


设计名称:设计一个


1



1



3


分频器



主要功能:



实现


3


分频,同时高低电平比为

< p>
1



1


设计框图:




设计代码:



这个设计可以利用模三计 数器分别在时钟的上升和下降沿设计一个高低电平为


1



2



3


< p>
频,然后将两个波形相或即能得到结果。



代码一:



module Devider2_1(




















//inputs




















clk,




















rst_n,







































//outputs




















opt1,




















opt2,




















opt);





input clk;





input rst_n;





output opt;





output opt1;





output opt2;





reg opt1;





reg [1:0] temp1;





reg opt2;





reg [1:0] temp2;








always@(posedge clk)



begin








if(!rst_n)



begin












temp1 <= 2'd0;











opt1



<= 1'b0;





end








else if(temp1==1)



begin











opt1



<=1'b1;











temp1 <= temp1 + 2'd1;





end








else if(temp1==2'd2)


begin












opt1



<= 1'b0;











temp1 <= 2'd0;


end








else


begin












temp1 <= temp1+2'd1;


end


end





always@(negedge clk)



begin








if(!rst_n)



begin












temp2 <= 2'd0;











opt2



<= 1'b0;



end








else if(temp2==1) begin











opt2



<=1'b1;











temp2 <= temp2 + 2'd1;



end








else if(temp2==2'd2)


begin












opt2



<= 1'b0;











temp2 <= 2'd0;



end








else



begin












temp2 <= temp2+2'd1;



end



end









assign opt = opt1 || opt2;






endmodule


同时也可以用同样的方法设计一个在上升 和下降沿高低电平


2



1



3


分频器,将两个波形


相 与即可。



代码二:



module Devider2_1(




















//inputs




















clk,




















rst_n,







































//outputs




















opt1,




















opt2,




















opt);





input clk;





input rst_n;





output opt;





output opt1;





output opt2;





reg opt1;





reg opt2;





reg [1:0] temp1;





reg [1:0] temp2;





always@(posedge clk)



begin








if(!rst_n)



begin












temp1 <= 2'd0;











opt1



<= 1'b0;


end














//reset








else if(temp1==2'd0)



begin












opt1<=1'b1;












temp1 <= temp1 + 2'd1;


end








else if(temp1==2'd1)


begin











opt1



<=1'b1;











temp1 <= temp1 + 2'd1;


end








else if(temp1==2'd2)


begin












opt1



<= 1'b0;











temp1 <= 2'd0;


end


end








always@(negedge clk)



begin








if(!rst_n)


begin












temp2 <= 2'd0;











opt2



<= 1'b0;


end














//reset








else if(temp2==2'd0)



begin












opt2<=1'b1;












temp2 <= temp2 + 2'd1;


end








else if(temp2==2'd1)



begin











opt2



<=1'b1;











temp2 <= temp2 + 2'd1;


end








else if(temp2==2'd2)


begin












opt2



<= 1'b0;











temp2 <= 2'd0;


end


end



assign opt = opt1&&opt2;


endmodule


仿真代码:



上面两个代码的仿真代码是一样的。



`timescale 1ns/1ns


module tb;





//inputs





reg clk;





reg rst_n;





//outputs





wire opt1;





wire opt2;





wire opt;









//generate clk





always #10 clk = ~clk;









//tb starts





Initial



begin









clk




= 1'b0;









rst_n = 1'b0;









#100;












rst_n = 1'b1;









#500;









$$stop;




end










//Instant DUT





Devider2_1 uDevider2_1(




















//inputs




















.clk(clk),




















.rst_n(rst_n),







































//outputs




















.opt1(opt1),




















.opt2(opt2),




















.opt(opt)





);


endmodule


仿真结果:





a


)高低电平为


1



2


设计的





b


)高低 电平为


2



1


设计的



辅助说明:




a





opt1


为上升沿触发的高低电平


1



2


< p>
3


分频,


opt2


为下降 沿触发的高低电平为


1



2

< p>


3


分频,可以看出在


r st_n



0


进行清复位,之后在


rst_n



1


是 进行分频,


最后所得


opt


结果为


1



1



3


分频,符合设计要求。



b


)中


opt1


为上升沿触发的高低电平


2



1



3


分频,


opt2


为下降沿触发的高低电平为


2



1



3


分频 ,可以看出在


rst_n



0


进行清复位,之后在


rst_n



1


是进行分频,最后所得


opt

结果为


1



1


3


分频,符合设计要求。



_________________________________________ ______________________________________


4.


设计名称:七人表决器



主要功能:



7


个人进行表决,人数过


4



LED< /p>


灯亮,否则灯灭



设计框图:




设计代码:



module v(vote,rst,Q);


input



[6:0]vote;


input



rst;


output Q;


reg Q;


reg





[2:0]c;


always



@(vote



or



rst)


begin






c=0;






if(rst)






c=3'b000;






else






begin






c=c+vote[0];






c=c+vote[1];






c=c+vote[2];






c=c+vote[3];






c=c+vote[4];






c=c+vote[5];






c=c+vote[6];



end


if(c>3)







Q=1;


else










Q=0;




end


endmodule


仿真代码:



`timescale 1ns/1ns


module q;






reg rst;






reg [6:0]vote;






wire Q;



initial



begin






rst=0;






vote=7'b111111;


#50;






rst=1;


#50;






rst=0;


#50;






vote=7'b0110101;


#50;






vote=7'b0100101;


#50;






vote=7'b0111101;


#50;






vote=7'b1111001;


#50;






vote=7'b0100001;


#50;






vote=7'b0000001;


#50;






$$stop;

-


-


-


-


-


-


-


-