《fpga_cpld组合逻辑电路设计》由会员分享,可在线阅读,更多相关《fpga_cpld组合逻辑电路设计(85页珍藏版)》请在金锄头文库上搜索。
1、FPGA_CPLD组合逻辑电路设计讨论主题:n3.1组合逻辑基础及并行语句三人表决器n3.2加法器电路 一位加法器n3.3 verilog过程译码器原理 3-8译码器n3.4数码管显示电路 七段显示译码器1 组合逻辑电路 表决器1 组合逻辑电路对比1 组合逻辑电路定义n组合逻辑含义:电路任一时刻的输出状态只决定于 该时刻各输入状态的组合,而与电路的 原状态无关。组合电路就是由门电路组 合而成,电路中没有记忆单元,没有反 馈通路。1 组合逻辑建模方法n建模思路:用语言表述出来:针对输入,总有确定的输出,输入一变化,输出就随之 变化n建模规范:1.过程(进程)之外,本来就是并行,直 接建模2.过程
2、(进程)之内:a.所有输入变化立刻 变化。b.针对输入,输出有确定值(绝对真经!)1 组合逻辑verilog描述module select(f,a,b,s);output f;input a,b,s;assign f=(a endmodule1组合逻辑补充互补CMOS电路 1 二输入CMOS与非门电路 1二输入端CMOS或非门电路 1二输入CMOS异或门电路 2理解Verilog的并行语句n一般的程序设计语言是处理器按照顺序 去执行的一些语句,硬件描述语言却是 描述一个物理上可以客观存在的实际电 路的语言。二者最本质的区别是Verilog 硬件描述语言有并行语句。n并行语句是硬件描述语言的基本
3、特征, 可以说正是因为并行语句的存在,才使 其成为了真正的硬件描述语言。Verilog需要顺序语句 n第一是很多时序器件本身就是和时间相关的,比如D 触发器,其原理就是“每当时钟上升延来临之后就把 输入端的数据存入,并且放在输出端口,直到下一个 时钟来临为止”。如果使用语言来描述一个器件符合 上述原理,很明显需要用到时间先后的语法,而且在 很多场合,使用顺序执行的语句可以有效的简化描述 语言的数量,基于这个原因,描述有些电路结构需要 使用顺序执行的语句。但是即使用顺序执行的语句描 述出来了这种器件,也是在底层和其他器件并行处理 的。n第二个原因就是为了仿真验证, 2 加法器电路n真值表a1a2
4、bc2 加法器电路n初识Verilog module adder (a, b, c);input1:0 a, b;output2:0 c;assign c=a+b; endmodule2 半加器n能对两个一位二进制数相加,求得其和 值及进位的逻辑电路称为半加器。半加 器的特点是:只考虑两个一位二进制数 的相加,而不考虑来自低位进位的运算 电路,称为半加器。任务7中设计的一位 加法器级为半加器。2 全加器n一位二进制数相加不仅要考虑本位的加 数与被加数,还要考虑低位的进位信号 ,而输出包括本位和以及向高位的进位 信号,这就是通常所说的全加器。 2全加器2 多位加法器 2 比较 module ad
5、der (a, b, c); input1:0 a, b; output2:0 c; reg2:0 c; always(a,b) begin c=a+b; end endmodule2任务:n自己使用Verilog编写一个4位数加4位数 的加法器。3 Verilog 过程及译码电路nAlways 过程语句nalways定义的过程块是一个电路,电路 从上电开始就会一直执行;n (从代码一开始就执行,执行完了再回 到过程块的最初来执行,周而复始,不 会停止,直到代码执行完毕) 3 常用过程语句 if else/ “begin” 和 “end”就好比C语言中的“”和“”. if (enable =
6、= 1b1) begindata = 10; / 十进制赋值address = 16hDEAD; /十六进制wr_enable = 1b1; /二进制 end else begindata = 32b0;wr_enable = 1b0;address = address + 1; end3过程语句casecase(address)0 : $display (“It is 11:40PM“);1 : $display (“I am feeling sleepy“);2 : $display (“Let me skip this tutorial“);default : $display (“Ne
7、ed to complete“);endcase3过程语句whilemodule 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) begincount = 0;end else begin : COUNTwhile (enable) begincount = count + 1;disable COUNT;endendendmodule3过程中的阻塞赋值与非阻塞赋值 n阻塞式
8、 (blocking) 的操作符为 “ = ”n 非阻塞式 (non-blocking)的操作符为 “ = ”n 阻塞赋值和非阻塞赋值的基本区别是 :阻塞赋值是顺序执行语句,而非阻塞 赋值是并行执行语句。两种语句的含义 不同,建模的应用也就不同。 3 对比module top(clk,a,c); input a,clk; output c; reg c,b; always ( posedge clk ) begin b=a; =b; end endmodulemodule top(clk,a,c); input a,clk; output c; reg c,b; always ( posedg
9、e clk ) begin b=a; c=b; end endmodule3译码器电路输输入输输出 A BY0 Y1 Y2 Y3 0 01 0 0 0 0 10 1 0 0 1 00 0 1 0 1 10 0 0 12线4线译码器真值表逻辑函数:2线4线译码器电路8译码器电路重温设计过程n1. 文本编辑n2. 设定器件n3. 输入管脚n4. 综合、布局布线n5. 设定下载端口n6. 下载3实训 译码器8-3译码器n能不能自己实现8-3译码器电路?5 三态门电路输入信号双向信号输出信号rwco_dataout_datain_data1co_dataxco_data0out_dataout_dat
10、aout_data三态门电路结构单元 如果使能端G为低电平,取值为0时,三态门电路与B点之间连接 的两个MOS管都关断,B在芯片内部的连接处于高阻态,也就是 为Z,此时外部信号可以通过B送到C,作为输入状态。当G为低 高平,取值为1时,三态门电路与B连接的两个MOS管中可以有 一个管子导通,B的取值和A一致,而此时外部对B不能进行信号 驱动,否则就会出现短路。 CMOS传输门三态门电路 4 数码管显示4 练习一 数码管上显示2module seg7(data_out);output7:0 data_out;assign data_out=8b 1011011 4 七段译码器结构七段LED数码管
11、显示电路in0dg4表格显示七段数码管显示电路输入七段数码管显示电路输出LED显示 字形in3 in2 in1 in0gfedcba0 0 0 0011111100 0 0 1000011010 0 1 0101101120 0 1 1100111130 1 0 0110011040 1 0 1110110150 1 1 0111110060 1 1 1000011171 0 0 0111111181 0 0 1110011194 代码 module qiduan( data_in,/七段数码管显示电路的输入,对应图2.1.4中的in3-in0,in3对应输入的高位 data_out);/七段
12、数码管显示电路的输出,对应图2.1.4中的g-a,g对应输出的高位 input3:0 data_in;/输入输出端口定义 output6:0 data_out; reg6:0 data_out;/使用always建模组合逻辑需要定义输出为寄存器 always(data_in) /输入为data_in begincase(data_in)/输入的不同情况4b0000: data_out = 7b0111111; / 04b0001: data_out = 7b0000110; / 14b0010: data_out = 7b1011011; / 24b0011: data_out = 7b100
13、1111; / 34b0100: data_out = 7b1100110; / 44b0101: data_out = 7b1101101; / 54b0110: data_out = 7b1111100; / 64b0111: data_out = 7b0000111; / 74b1000: data_out = 7b1111111; / 84b1001: data_out = 7b1100111; / 9default: data_out = 7b0000000; /default,当输入为其他值时,输出有效,为全0endcase end endmodule4实训显示小任务:n使用七段数
14、码管显示一个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) begincase(bin)4b0000: abcdefg= 7b0111111; .default: abcdefg= 7b0000000; endcase end endmodule4任务:用数码管显示9527需要轮流打开4个数码管,每 个数码管显示1/4的时间,由 于视觉暂留效应,就好像显示 4个不同的数字设
15、计思路: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;/注意要用always就必须是reg always(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放 到