1、verilog串并转换并串转换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=8b00000000;endelse begincase(a)3b000: b=8b00000001;3b001: b=8b00000010;3b010: b=8b00000100;3b011: b=8b00001000;3b100: b
2、=8b00010000;3b101: b=8b00100000;3b110: b=8b01000000;3b111: b=8b10000000;default: b=8b00000000;endcaseendendmodule仿真代码:timescale 1ns/1nsmodule tb; reg 2:0 a; reg ena; wire 7:0 b; initial begin a = 3b000; ena = 1b0; #50; ena = 1b1; #50; a=3b001; #50; a=3b010; #50; a=3b011; #50; a=3b100; #50; a=3b101;
3、#50; a=3b110; #50; a=3b111; #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的值变为00000100,这与设计时的功能是一致的。_2.设计名称:83编码器带使能端的和优先级主要功能:实现83编码功能,并且在使能段处于低电平是输出为000,同时最高位的优先级最高设计框图:设计代码
4、: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=3b000;endelse if(a7) b=3b111;elseif(a6) b=3b110;elseif(a5) b=3b101;elseif(a4) b=3b100;elseif(a3) b=3b011;elseif(a2) b=3b010;elseif(a1) b=3b001;elseif(a0) b=3b000;else b=3b000;endmodule仿真代码:module
5、 tb; reg 7:0 a; reg ena; wire 2:0 b; initial begin a = 8b10000000; ena = 1b0; #50; ena = 1b1; #50; a=8b01000000; #50; a=8b00100000; #50; a=8b00010000; #50; a=8b00001000; #50; a=8b00000010; #50; a=8b00000001; #50; a=8b10100000; #50; $stop; end undecoder8_3 unit1_undecoder8_3( .a(a), .ena(ena), .b(b)
6、);endmodule仿真结果:辅助说明:当ena为低电平时,无论a为何值,总是输出000,当ena为高电平时,输出即随a的数值变化而变化,当a为01000000时,b为110,当a为00100000是,b为101以此类推,同时最后一个波形为,当a为10100000时,b为111,体现了优先译码的功能,此结果和当初设计的功能一致的。_3.设计名称:设计一个1:1的3分频器主要功能:实现3分频,同时高低电平比为1:1设计框图:设计代码:这个设计可以利用模三计数器分别在时钟的上升和下降沿设计一个高低电平为1:2的3分频,然后将两个波形相或即能得到结果。代码一:module Devider2_1(
7、/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 = 2d0; opt1 = 1b0; end else if(temp1=1) begin opt1 =1b1; temp1 = temp1 + 2d1; end else if(te
8、mp1=2d2)begin opt1 = 1b0; temp1 = 2d0;end elsebegin temp1 = temp1+2d1;endend always(negedge clk) begin if(!rst_n) begin temp2 = 2d0; opt2 = 1b0; end else if(temp2=1) begin opt2 =1b1; temp2 = temp2 + 2d1; end else if(temp2=2d2)begin opt2 = 1b0; temp2 = 2d0; end else begin temp2 = temp2+2d1; end end a
9、ssign 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) be
10、gin temp1 = 2d0; opt1 = 1b0;end /reset else if(temp1=2d0) begin opt1=1b1; temp1 = temp1 + 2d1;end else if(temp1=2d1)begin opt1 =1b1; temp1 = temp1 + 2d1;end else if(temp1=2d2)begin opt1 = 1b0; temp1 = 2d0;endend always(negedge clk) begin if(!rst_n)begin temp2 = 2d0; opt2 = 1b0;end /reset else if(tem
11、p2=2d0) begin opt2=1b1; temp2 = temp2 + 2d1;end else if(temp2=2d1) begin opt2 =1b1; temp2 = temp2 + 2d1;end else if(temp2=2d2)begin opt2 = 1b0; temp2 3) Q=1;else Q=0; endendmodule仿真代码:timescale 1ns/1nsmodule q; reg rst; reg 6:0vote; wire Q; initial begin rst=0; vote=7b111111;#50; rst=1;#50; rst=0;#5
12、0; vote=7b0110101;#50; vote=7b0100101;#50; vote=7b0111101;#50; vote=7b1111001;#50; vote=7b0100001;#50; vote=7b0000001;#50; $stop;endv v_unit(.vote(vote),.rst(rst),.Q(Q);endmodule仿真结果:辅助说明:第一个表决为0111111,有6人同意,于是显示通过,Q为高电平,第二个单位是,rst复位信号显示为1,此时对表决器复位,于是Q清0,后面当rst为低电平时又可以开始表决,当最后一个表决信号只有1个人同意时,由于人数少于4,
13、所以Q为0,不通过,结果与设计相仿。_5设计名称:十进制计数器的设计主要功能:使能端为高电平且复位信号为低电平是,进行模十同步计数,同时满10 的时候清0并且进位co置1,在一个始终后默认高位已经接受完进位信号将其清0。使能端为低电平时计数器保持输出不变,当使能端为高电平,且复位信号为高电平时,将计数器异步清0.设计框图:设计代码:module ten(clk,rst_tong,rst_yi,a,co,ena); input clk; input rst_tong; input rst_yi; input ena; output 3:0 a; output co; reg 3:0a; reg
14、co;always(posedge clk or posedge rst_yi)beginco=0;if(rst_yi) begin a=4b0000; co=0;endif(!ena) beginco=0;endelsebegin if(rst_tong)begin a=4b0000; co=0;end else if(a4b1001) a=a+4b0001;elseif(a=4b1001)begin a=4b0000; co=1;endendendendmodule仿真代码:timescale 1ns/1nsmodule tb; reg clk; reg rst_yi; reg ena;
15、reg rst_tong; wire 3:0a; wire co; always #10 clk = clk; initial begin ena=0; clk = 1b0; rst_yi= 1b1; rst_tong=1b0; #10; ena=1; #14; rst_yi= 1b0; #230; rst_yi= 1b1; #20; rst_yi=1b0; #20; ena=0; #30; rst_tong=1b1; #500; $stop; end ten ten_unit(.clk(clk), .rst_yi(rst_yi), .rst_tong(rst_tong), .ena(ena)
16、, .a(a), .co(co) ); endmodule仿真结果:辅助说明:这个十进制计数器里面我设计了两个复位端口,一个是同步复位端口rst_tong,一个是异步复位端口rst_yi,从仿真图形中可以看出,在使能端ena为低是计数器保持数值不变,输出全是0,当使能端ena为高电平的时候,当异步复位rst_yi为高电平是实现异步清零,这个可以在rst_yi的第二个高电平处看清楚,当rst_yi为低电平时,若rst_tong为低电平,实现正常计数,此时从0000计数到1001,在下一个时钟周期产生一个半个周期的进位高电平co,在并且计数a重新变为0,当rst-tong为高电平时,在时钟的上升沿
17、进行同步置数此功能和当初的设计目标一致。_6:设计名称: 4路抢答器主要功能: 完成抢答功能,并且在抢答结束的时候清0,在下一次抢答开始之前按抢答键无效。设计框图:设计代码:module qiang(a,b,start); input 3:0 a; input start; output 3:0b; reg 3:0b; reg 3:0temp; always(a or start)begin if(!start) begin temp=0; b=0; end else if(temp= 4b0000) begin temp=a; b=temp; end end endmodule 仿真代码:t
18、imescale 1ns/1nsmodule tb; reg 3:0a; reg start; wire 3:0b; initial begin start=0; a=4b0000; #10; start=1; #10; a=4b0100; #10; a=4b0110; #50; start=0; #10; a=4b0100; #30; a=4b0000; #50; start=1; #50; a=4b1000; #50; $stop; end qiang qiang_unit( .a(a), .start(start), .b(b) );Endmodule仿真结果: 辅助说明:可以看出,当s
19、tart为0,抢答器未启动时,输出为0000,当start为1时,此时a=0010,表明第二个人已经先按下抢答器,这是输出为0010,之后a=0110,又有人再次之后按下抢答器,但是由于a【1】已经先按下,所以a【2】按下后还是只能显示0010,这就实现了抢答功能,当start=0是,这是输出清零,这是输入0100,由于抢答器未工作,所以输出还是0000,后面当start又是1的时候,这时候a【3】抢答成功,所输出又为1000,符合当初的设计功能。7.设计名称:并串转换主要功能:在没有数据输出时,输出为x,此时ready信号为高,若load信号也为高时,则将输入的数据传输给中间寄存器temp,
20、然后resdy信号变为低电平,ready信号有temp【7】决定,当temp【7】中还有数据时,表明还没有全部转换完,则ready为低,当temp【7】没有数据显示为x时,则ready为高,表明可以接收数据了。当接收完数据之后,在8个时钟周期将信号输出。设计框图:设计代码:module bcc(clk,ain,rst,bout,load,ready); input clk; input 7:0ain; input rst; input load; output bout; output ready; reg bout; reg 7:0temp; reg ready; always (posed
21、ge rst or posedge clk)begin if(rst)begin bout =1bx; temp =8bxxxxxxxx; ready=1;end else if(load & ready) temp=ain;/if load is high leve and temp is empty,then,transport data if(temp7|!temp7) /temp7 has databegin bout=temp7; /temp shift left,and temp0 equal x temp7:1=temp6:0; temp0=1bx; ready=0;end el
22、se begin bout=1bx; ready=1;end end endmodule仿真代码:timescale 1ns/1ns module bcc_tb; reg clk; reg 7:0ain; reg rst; reg load; wire ready; wire bout; always #10 clk = clk; initialbegin clk=0; rst=1; load=0; ain=11; #10; rst=0; #10; load=1; #20; load=0; #20; ain=8; #40; load=1; #20; load=0; #100; load=1;
23、#20; load=0; #200; rst=1; #10; $stop;end bcc bcc_unit( .clk(clk), .ain(ain), .rst(rst), .load(load), .bout(bout), .ready(ready) ); Endmodule仿真结果:辅助说明:可以从仿真图形中看出,在rst为高时,进行复位,当rst为低时,由于temp里面没有数据,所以ready信号为高,此时表明temp可以接受数据,若load信号为高,之后temp则接收到ain的信号,此时temp里面有了数据,则ready信号为0,不能再传输数据,此时后8个时钟周期输出为00001011,完成串并转换,期间就算load为高电平,但是ready信号为低,所以不会传输下一个数据00001000,只有当之后ready为高电平时,此时财货执行下一个数据的传输。此仿真
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1