1、第3章 组合逻辑电路设计讨论主题:n3.1组合逻辑基础及并行语句三人表决器n3.2加法器电路 一位加法器n3.3 verilog过程译码器原理 3-8译码器n3.4数码管显示电路 七段显示译码器3.1 组合逻辑电路 表决器f0f1f2fbsa3.1 组合逻辑电路对比DENAQPRECLRfreg0f0faclkb3.1 组合逻辑电路定义n组合逻辑含义:电路任一时刻的输出状态只决定于该时刻各输入状态的组合,而与电路的原状态无关。组合电路就是由门电路组合而成,电路中没有记忆单元,没有反馈通路。3.1 组合逻辑建模方法n建模思路:用语言表述出来:针对输入,总有确定的输出,输入一变化,输出就随之变化n
2、建模规范:1.过程(进程)之外,本来就是并行,直接建模 2.过程(进程)之内:a.所有输入变化立刻变化。b.针对输入,输出有确定值 (绝对真经!)(绝对真经!)3.1 组合逻辑verilog描述module select(f,a,b,s);output f;input a,b,s;assign f=(a&(s)|(b&s);endmodule 3.1组合逻辑补充互补CMOS电路 3.1 二输入CMOS与非门电路 3.1二输入端CMOS或非门电路 3.1二输入CMOS异或门电路 3.2理解Verilog的并行语句n一般的程序设计语言是处理器按照顺序去执行的一些语句,硬件描述语言却是描述一个物理上
3、可以客观存在的实际电路的语言。二者最本质的区别是Verilog硬件描述语言有并行语句。n并行语句是硬件描述语言的基本特征,可以说正是因为并行语句的存在,才使其成为了真正的硬件描述语言。Verilog需要顺序语句 n第一是很多时序器件本身就是和时间相关的,比如D触发器,其原理就是“每当时钟上升延来临之后就把输入端的数据存入,并且放在输出端口,直到下一个时钟来临为止”。如果使用语言来描述一个器件符合上述原理,很明显需要用到时间先后的语法,而且在很多场合,使用顺序执行的语句可以有效的简化描述语言的数量,基于这个原因,描述有些电路结构需要使用顺序执行的语句。但是即使用顺序执行的语句描述出来了这种器件,
4、也是在底层和其他器件并行处理的。n第二个原因就是为了仿真验证,3.2 加法器电路n真值表加法器a1a2bca1a2bc3.2 加法器电路n初识Verilogmodule adder(a,b,c);input1:0 a,b;output2:0 c;assign c=a+b;endmodule3.2 半加器n能对两个一位二进制数相加,求得其和值及进位的逻辑电路称为半加器。半加器的特点是:只考虑两个一位二进制数的相加,而不考虑来自低位进位的运算电路,称为半加器。任务7中设计的一位加法器级为半加器。3.2 全加器n一位二进制数相加不仅要考虑本位的加数与被加数,还要考虑低位的进位信号,而输出包括本位和以
5、及向高位的进位信号,这就是通常所说的全加器。全加器ABCi-1SCi3.2全加器1111iiiiiiiiiiiiCBACBACBACBAS)()(11iiiiiiCBACBA1iiiCBA1111iiiiiiiiiiiiCBACBACBACBACiiiiiiiBACACB11 3.2 多位加法器 3.2 比较 module adder(a,b,c);input1:0 a,b;output2:0 c;reg2:0 c;always(a,b)beginc=a+b;endendmodule3.2任务:n自己使用Verilog编写一个4位数加4位数的加法器。3.3 Verilog 过程及译码电路nAl
6、ways 过程语句nalways定义的过程块是一个电路,电路从上电开始就会一直执行;n (从代码一开始就执行,执行完了再回到过程块的最初来执行,周而复始,不会停止,直到代码执行完毕)3.3 常用过程语句 if else/“begin”和“end”就好比C语言中的“”和“”.if(enable=1b1)begin data=10;/十进制赋值 address=16hDEAD;/十六进制 wr_enable=1b1;/二进制 end else begin data=32b0;wr_enable=1b0;address=address+1;end3.3过程语句casecase(address)0:$
7、display(It is 11:40PM);1:$display(I am feeling sleepy);2:$display (Let me skip this tutorial);default:$display (Need to complete);endcase3.3过程语句while module counter(clock,rst,enable,count);input clock,rst,enable;output 3:0 count;reg 3:0 count;always (posedge clock or posedge rst)if(rst)begin count=0
8、;end else begin:COUNT while(enable)begin count=count+1;disable COUNT;end end endmodule3.3过程中的阻塞赋值与非阻塞赋值过程中的阻塞赋值与非阻塞赋值 n阻塞式 (blocking)的操作符为“=”n 非阻塞式 (non-blocking)的操作符为“=”n 阻塞赋值和非阻塞赋值的基本区别是:阻塞赋值是顺序执行语句,而非阻塞赋值是并行执行语句。两种语句的含义不同,建模的应用也就不同。3.3 对比module top(clk,a,c);input a,clk;output c;reg c,b;always(pos
9、edge clk)beginb=a;=b;endendmodulemodule top(clk,a,c);input a,clk;output c;reg c,b;always(posedge clk)beginb=a;c=b;endendmodule3.3译码器电路输入输入输出输出A BY0 Y1 Y2 Y30 01 0 0 00 10 1 0 01 00 0 1 01 10 0 0 12 2线线4 4线译码器真值表线译码器真值表00mBAY 33mABY 22mBAY 11mBAY 逻辑函数:逻辑函数:2线线4线译码器电路线译码器电路3-8译码器电路重温设计过程n1.文本编辑n2.设定器件
10、n3.输入管脚n4.综合、布局布线n5.设定下载端口n6.下载3.3实训 3-8译码器8-3译码器n能不能自己实现8-3译码器电路?3.5 三态门电路输入信号双向信号输出信号rwco_dataout_datain_data1co_dataxco_data0out_dataout_dataout_data三态门电路结构单元 如果使能端G为低电平,取值为0时,三态门电路与B点之间连接的两个MOS管都关断,B在芯片内部的连接处于高阻态,也就是为Z,此时外部信号可以通过B送到C,作为输入状态。当G为低高平,取值为1时,三态门电路与B连接的两个MOS管中可以有一个管子导通,B的取值和A一致,而此时外部对
11、B不能进行信号驱动,否则就会出现短路。CMOS传输门三态门电路 3.4 数码管显示3.4 练习一 数码管上显示2module seg7(data_out);output7:0 data_out;assign data_out=8b 1011011 3.4 七段译码器结构七段LED数码管显示电路in0dg3.4表格显示七段数码管显示电路输入七段数码管显示电路输出LED显示字形in3 in2 in1 in0gfedcba 0 0 0 001111110 0 0 0 100001101 0 0 1 010110112 0 0 1 110011113 0 1 0 011001104 0 1 0 111
12、011015 0 1 1 011111006 0 1 1 100001117 1 0 0 011111118 1 0 0 1110011193.4 代码module qiduan(data_in,/七段数码管显示电路的输入,对应图2.1.4中的in3-in0,in3对应输入的高位data_out);/七段数码管显示电路的输出,对应图2.1.4中的g-a,g对应输出的高位input3:0 data_in;/输入输出端口定义output6:0 data_out;reg6:0 data_out;/使用always建模组合逻辑需要定义输出为寄存器always(data_in)/输入为data_inbe
13、gin case(data_in)/输入的不同情况 4b0000:data_out=7b0111111;/0 4b0001:data_out=7b0000110;/1 4b0010:data_out=7b1011011;/2 4b0011:data_out=7b1001111;/3 4b0100:data_out=7b1100110;/4 4b0101:data_out=7b1101101;/5 4b0110:data_out=7b1111100;/6 4b0111:data_out=7b0000111;/7 4b1000:data_out=7b1111111;/8 4b1001:data_o
14、ut=7b1100111;/9 default:data_out=7b0000000;/default,当输入为其他值时,输出有效,为全0 endcaseendendmodule3.4实训显示小任务:n使用七段数码管显示一个3的数字。nmodule SEG7(nabcdefg,nscan n);nwire 3:0 bin;noutput3:0 scan;noutput6:0 abcdefg;nreg 6:0 abcdefg;assign scan=4b1111;always(bin)begin case(bin)4b0000:abcdefg=7b0111111;.default:abcdefg
15、=7b0000000;endcase end endmodule3.4任务:用数码管显示9527需要轮流打开4个数码管,每个数码管显示1/4的时间,由于视觉暂留效应,就好像显示4个不同的数字设计思路:1.打开scan0的时候,在abcdefg线上赋值“9”2.打开scan1的时候,在abcdefg线上赋值“5”3.打开scan2的时候,在abcdefg线上赋值“2”4.打开scan3的时候,在abcdefg线上赋值“7”设计SCAN信号n首先要降低扫描速度,生成一个大约为0.01s-0.1s的时钟n利用这个时钟信号产生一个scan信号如下:reg1:0 state;reg3:0 scan;/注
16、意要用always就必须是regalways(posedge clk_div)state=stats+1b1;always (state)case(state)2b00:scan=4b0001;2b01:scan=4b0010;2b10:scan=4b0100;2b11:scan=4b1000;default:scan=4b0000;endcase分不同的时间把9、5、2、7放到bin上面去reg3:0 bin;/不在always里面赋值就用wire,否则用regalways(state)case(state)2b00:bin=4d9;2b01:bin=4d5;2b10:bin=4d2;2b1
17、1:bin=4d7;default:bin=4d0;endcase再对9527从二进制到abdcdefg译码reg6:0 abcdefg;always(bin)begin case(bin)4b0000:abcdefg=7b0111111;.default:abcdefg=7b0000000;endcase2.项目任务:计数牌子n任务分析:设计一个计数牌子,能从0000计数到9999,每隔1秒钟跳动一下。通过复位可以把系统清零为0000涉及:动态数码管显示,复位,分频电路等n设计思路:1.内部所有数据都是2进制的,所以需要设计4个4位2进制的reg,分别对应显示的4个数字,再通过动态扫描电路送
18、到LED上面去显示。2.利用1秒的时钟,构建“个、十、百、千”位的变换规律 设计模块1:分频电路n代码:略1.产生一个1秒的时钟:clk_1s2.产生一个0.01秒的时钟(为了动态显示使用):clk_div设计模块2:计数器reg3:0 gewei/各位数always(posedge clk_1s)if(reset=1b1)gewei=4b0;else if(gewei=4d9)gewei=4b0;else gewei=gewei+1b1;reg3:0 shiwei/十位数always(posedge clk_1s)if(reset=1b1)shiwei=4b0;else if(gewei=4
19、d9)begin if(shiwei=4d9);shiwei=4b0;else shiwei=shiwei+1b1;endreg3:0 baiwei/十位数always(posedge clk_1s)if(reset=1b1)baiwei=4b0;else if(gewei=4d9)&(shiwei=4d9)begin if(baiwei=4d9);baiwei=4b0;else baiwei=baiwei+1b1;endreg3:0 qianwei/十位数always(posedge clk_1s)if(reset=1b1)qianwei=4b0;else if(gewei=4d9)&(sh
20、iwei=4d9)&(baiwei=4d9)begin if(qianwei=4d9);qianwei=4b0;else qianwei=shiwei+1b1;end设计模块3:动态译码显示n复习一下:我们是如何把9527显示出来的设计SCAN信号n首先要降低扫描速度,生成一个大约为0.01s-0.1s的时钟n利用这个时钟信号产生一个scan信号如下:reg1:0 state;reg3:0 scan;/注意要用always就必须是regalways(posedge clk_div)state=stats+1b1;always (counter)case(counter)2b00:scan=4b
21、0001;2b01:scan=4b0010;2b10:scan=4b0100;2b11:scan=4b1000;default:scan=4b0000;endcase分不同的时间把9、5、2、7放到bin上面去reg3:0 bin;/不在always里面赋值就用wire,否则用regalways(counter)case(counter)2b00:bin=4d9;2b01:bin=4d5;2b10:bin=4d2;2b11:bin=4d7;default:bin=4d0;endcase再对9527从二进制到abdcdefg译码reg6:0 abcdefg;always(bin)begin ca
22、se(bin)4b0000:abcdefg=7b0111111;.default:abcdefg=7b0000000;endcasen原来:在counter分别为00、01、10、11的时候在abcdefg上放置9、5、2、7n现在:在counter分别为00、01、10、11的时候在abcdefg上放置qianwei、baiwei、shiwei、gewei3.简易电子手表设计n项目分析:设计一个电子手表,其功能能包括复位后显示 15:34 能够正确显示时间hh mm系统架构图分频器分频器345160进制,6位2进制数23进制5位2进制数1分钟的时钟二进制到BCD译码二进制到BCD译码BCD码
23、到7段数码管译码电路,动态显示设计模块1:分频电路n代码:略1.产生一个1分钟的时钟:clk_1m2.产生一个0.01秒的时钟(为了动态显示使用):clk_div设计部件2:计时器reg5:0 minute/分钟always(posedge clk_1m)if(reset=1b1)minute=6d34;/显示34分else if(minute=6d59)minute=6b0;else minute=minute+1b1;reg4:0 hour/小时always(posedge clk_1m)if(reset=1b1)hour=5d15;/初始化为15点else if(minute=6d59)
24、/满足1小时 begin if(hour=5d23);/满23小时 hour=5b0;else hour=hour+1b1;end复习:BCD码转换电路nBinary-Coded Decimal,简称BCD,称BCD码或二-十进制代码,亦称二进码十进数。是一种二进制的数字编码形式,用二进制编码的十进制代码。nBCD-8421举例子:二进制 十进制 BCD 0 0 0 110 6 110 1001 9 1001 1101 13 0001 0011 1011111 95 1001 0101小练习BCD码转换n1.110011n2.100100n3.1010101n4.101100n5.101000
25、001010任务:自己写一个0到99(1100011)的二进制到BCD转化电路提示:n需要应用“比较器来”确定十位上数字是多少?n确定了十位数后,用减掉一个这个十位数,得到个位数,再做各位数的BCD码转换设计部件2:8位二进制到BCD码译码器电路nhour与minute都是小于99的binary 数,所以分别分别可以转化为8位BCD数。n设定BCD数结果分别为hour_bcd,minute_bcd设计部件3:动态数码显示输出n现在,我们拥有2个8位的BCD码数据,hour_bcd,minute_bcd。n把它们拆分成为4个4进制的BCD码数据:hour_bcd 7:4,hour_bcd 3:0
26、,minute_bcd 7:4,minute_bcd 3:0。设计SCAN信号n首先要降低扫描速度,生成一个大约为0.01s-0.1s的时钟n利用这个时钟信号产生一个scan信号如下:reg1:0 state;reg3:0 scan;/注意要用always就必须是regalways(posedge clk_div)state=stats+1b1;always (counter)case(counter)2b00:scan=4b0001;2b01:scan=4b0010;2b10:scan=4b0100;2b11:scan=4b1000;default:scan=4b0000;endcase分不
27、同的时间把9、5、2、7放到bin上面去reg3:0 bin;/不在always里面赋值就用wire,否则用regalways(counter)case(counter)2b00:bin=4d9;2b01:bin=4d5;2b10:bin=4d2;2b11:bin=4d7;default:bin=4d0;endcase再对9527从二进制到abdcdefg译码reg6:0 abcdefg;always(bin)begin case(bin)4b0000:abcdefg=7b0111111;.default:abcdefg=7b0000000;endcasen原来:在counter分别为00、0
28、1、10、11的时候在abcdefg上放置9、5、2、7n现在:在counter分别为00、01、10、11的时候在abcdefg上放置hour_bcd 7:4,hour_bcd 3:0,minute_bcd 7:4,minute_bcd 3:0。2.多路选择器电路n 多路选择器(MUX)又叫多路开关(WUX),是一个选择器来的,它从多路数据输入中选择一路致输出端。详细看以下图形,即四选一多路选择器,就会明白的。它是四个二进制数据值作为多路选择器的输入,两个选择控制信号决定四个输入中哪个被传到输出端。其中,(b)和(c)分别表示高电平有效选通信号(启动信号)和低电平有效的四选一多路选择器及它们
29、的真值表。问题,做一个4选1的多路选择器,要几个2选1的多路选择器?原来是3个设计一个多路选择器结构如下:控制端:00全灭11全亮10选择第一路01选择第二路3.分歧终端机课后练习n设计要求:首先甲拨码一个数据,然后乙拨码一个数据,然后当裁判按下“开”的时候结果就显示在LED上(结果有3种,甲胜利,乙胜利,平手)00-石头01-剪子10-布11-放弃胜利n任务分析:组合逻辑电路,输入有:裁判判决显示甲的选择(2位)乙的选择(2位)输出有:仲裁结果(3位)5.BCD码转换电路nBinary-Coded Decimal,简称BCD,称BCD码或二-十进制代码,亦称二进码十进数。是一种二进制的数字编码形式,用二进制编码的十进制代码。nBCD-8421举例子:二进制 十进制 BCD 0 0 0 110 6 110 1001 9 1001 1101 13 0001 0011 1011111 95 1001 0101小练习BCD码转换n1.110011n2.100100n3.1010101n4.101100n5.101000001010