EDA技术_组合逻辑电路设计_Verilog
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
end endmodule
b=a; c=b;
3.3译码器电路
2线-4线译码器真值表 输入 A B 输出 Y0 Y 1 Y2 Y3
0
0 1 1
0
1 0 1
1
0 0 0
0
1 0 0
0
0 1 0
0
0 0 1
逻辑函数:
Y0 AB m0
Y1 AB m1 Y2 AB m2
Y3 AB m3
2.利用1秒的时钟,构建“个、十、百、千”
位的变换规律
设计模块1:分频电路
代码:略…
1.产生一个1秒的时钟:clk_1s
2.产生一个0.01秒的时钟(为了动态显示 使用):clk_div
设计模块2:计数器
reg[3:0] gewei; //各位数 always@(posedge clk_1s) if(reset==1‟b1) gewei<=4‟b0; else if(gewei==4‟d9) gewei<=4‟b0; else gewei<=gewei+1‟b1;
3.3 过程语句case
case(address) 0 : $display ("It is 11:40PM"); 1 : $display ("I am feeling sleepy"); 2 : $display ("Let me skip this tutorial"); default : $display ("Need to complete");
分不同的时间把9、5、2、7 放到bin上面去
reg[3:0] bin;//不在always里面赋值就用wire,否则用 reg always@(state) case (state) 2‟b00 : bin<=4‟d9; 2‟b01 : bin<=4‟d5; 2‟b10 : bin<=4‟d2; 2‟b11 : bin<=4‟d7; default: bin<=4‟d0; endcase
再对9527从二进制到 abdcdefg译码
reg[6:0] abcdefg; always@(bin) begin case(bin) 4„b0000: abcdefg<= 7'b0111111; …. …. default: abcdefg<= 7'b0000000; endcase
3.5 实例3:计数牌子
g
3.5 BCD数段码对应表
七段数码管显示电路输入 in3 in2 in1 in0 0 0 0 0 七段数码管显示电 路输出 gfedcba 0111111 0 LED显示 字形
0 0 0 1
0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1
0000110
3.5 实例2:用数码管显示9527
设计思路:
1.打开scan0的时候, 在abcdefg线上赋值 “9” 2.打开scan1的时候, 在abcdefg线上赋值 “5” 3.打开scan2的时候, 在abcdefg线上赋值 “2”
需要轮流打开4个数码管,每个数码 管显示1/4的时间,由于视觉暂留效 应,就好像显示4个不同的数字
2线-4线译码器电路
3-8译码器电路
重温设计过程
1. 文本编辑
2. 设定器件
3. 输入管脚
4. 综合、布局布线
5. 设定下载端口
6. 下载
3.3实训 3-8译码器
能不能自己实现3-8译码器电路?
1、建立工程
2、使用Verilog语言设计
module 3_8yimaqi (data_in,data_out); input[2:0] data_in;
always @ (state)
case (state)
2‟b00 : scan<=4‟b0001; 2‟b01 : scan <=4‟b0010; 2‟b10 : scan <=4‟b0100; 2‟b11 : scan <=4‟b1000; default: scan <=4‟b0000; endcase
endcase
3.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) count <= 0; else begin : COUNT while (enable) begin count <= count + 1; disable COUNT; end end endmodule
3.3 过程中的阻塞赋值与 非阻塞赋值
阻塞式 (blocking) 的操作符为 “=” 非阻塞式 (non-blocking)的操作符 为 “ <= ” 阻塞赋值和非阻塞赋值的基本区别是: 阻塞赋值是顺序执行语句,而非阻塞赋 值是并行执行语句。两种语句的含义不 同,建模的应用也就不同。
3.3 对比
reg[3:0] shiwei; //十位数 always@(posedge clk_1s) if(reset==1‟b1) shiwei<=4‟b0; else if(gewei==4‟d9) begin if(shiwei==4‟d9); shiwei<=4‟b0; else shiwei<=shiwei+1‟b1; end
CMOS传输门三态门电路
3.5 数码管显示
3.5 例:在数码管上显示‟2‟
module seg7(data_out); output[6:0] data_out; assign data_out=7‟b 1011011
endmodule
3.5 七段译码器结构
七段 LED 数码管显 示电路
a
in0
Байду номын сангаас
reg[3:0] baiwei; //百位数 always@(posedge clk_1s) if(reset==1‟b1) baiwei<=4‟b0; else if((gewei==4‟d9)&&(shiwei==4‟d9)) begin if(baiwei==4‟d9); baiwei<=4‟b0; else baiwei<=baiwei+1‟b1; end
reg[3:0] qianwei; //千位数 always@(posedge clk_1s) if(reset==1‟b1) qianwei<=4‟b0; else
if((gewei==4‟d9)&&(shiwei==4‟d9)&&(baiwei ==4‟d9)) begin if(qianwei==4‟d9); qianwei<=4‟b0; else qianwei<=shiwei+1‟b1; end
1011011 1001111 1100110 1101101 1111100 0000111
1
2 3 4 5 6 7
1 0 0 0
1 0 0 1
1111111
1100111
8
9
3.5 代码
module qiduan( data_in;//七段数码管显示电路的输入,对应图的in3-in0,in3对应高位 data_out);//七段数码管显示电路的输出,对应图中的g-a,g对应高位 input[3:0] data_in;//输入输出端口定义 output[6:0] data_out; reg[6:0] data_out;//使用always建模组合逻辑需要定义输出为寄存器 always@(data_in) //输入为data_in begin case(data_in)//输入的不同情况 4'b0000: data_out = 7'b0111111; // 0 4'b0001: data_out = 7'b0000110; // 1 4'b0010: data_out = 7'b1011011; // 2 4'b0011: data_out = 7'b1001111; // 3 4'b0100: data_out = 7'b1100110; // 4 4'b0101: data_out = 7'b1101101; // 5 4'b0110: data_out = 7'b1111100; // 6 4'b0111: data_out = 7'b0000111; // 7 4'b1000: data_out = 7'b1111111; // 8 4'b1001: data_out = 7'b1100111; // 9 default: data_out = 7'b0000000; //default,当输入为其他值时, 输出有效,为全0 endcase end endmodule
任务分析: 设计一个计数牌子,能从0000计数 到9999,每隔1秒钟跳动一下。通过复 位可以把系统清零为0000
【涉及】 动态数码管显示,复位,分频电路等
设计思路:
1.内部所有数据都是2进制的,所以需要设
计4个4位2进制的reg,分别对应显示的
4个数字,再通过动态扫描电路送到LED
上面去显示。
module top(clk,a, c); input a,clk; output c; reg c,b; always @( posedge clk ) begin b<=a; C<=b; end endmodule module top(clk,a,c); input a,clk; output c; reg c,b; always @( posedge clk ) begin
第 3章
组合逻辑电路设计
数字电路
组合电路
电路输出完全依赖电路输入
与非门等
运算
电路输出在一定程度不依赖电路输入
时序电路
D触发器
记忆
1
组合电路
实现功能
时序电路
使功能有序
2
3.3 Verilog 过程及译码电路
Always 过程语句
always定义的过程块是一个电路,电路 从上电开始就会一直执行; (从代码一开始就执行,执行完了再回 到过程块的最初来执行,周而复始,不 会停止,直到代码执行完毕)
4.打开scan3的时候, 在abcdefg线上赋值 “7”
首先:设计SCAN信号
首先要降低扫描速度,生成一个大约为 0.01s-0.1s的时钟 利用这个时钟信号产生一个scan信号如 下: reg[1:0] state; reg[3:0] scan;//注意要用always就必 须是reg always@(posedge clk_div) state<=state+1‟b1;
output[7:0] data_out;
reg [7:0] data_out;
always@(data_in)
begin
case(data_in) 3„b000:data_out<=8‟b0000_0001; 3„b001:data_out<=8'b0000_0010; 3'b010:data_out<=8'b0000_0100; 3'b011:data_out<=8'b0000_1000; 3'b100:data_out<=8'b0001_0000;
双向信号 out_data x out_data
输出信号 in_data co_data out_data
三态门电路结构单元
如果使能端G为低电平,取值为0时,三态门电路与B点之间 连接的两个MOS管都关断,B在芯片内部的连接处于高阻态, 也就是为Z,此时外部信号可以通过B送到C,作为输入状态。 当G为低高平,取值为1时,三态门电路与B连接的两个MOS 管中可以有一个管子导通,B的取值和A一致,而此时外部对 B不能进行信号驱动,否则就会出现短路。
3'b101:data_out<=8'b0010_0000; 3'b110:data_out<=8'b0100_0000; 3'b111:data_out<=8'b1000_0000; endcase end endmodule
3.4 三态门电路
输入信号 rw 1 0 co_data co_data out_data
3.3 常用过程语句 if else
// “begin” 和 “end”就好比C语言中的“{”和“}”. if (enable = = 1'b1) begin data = 10; // 十进制赋值 address = 16'hDEAD; //十六进制 wr_enable = 1'b1; //二进制 end else begin data = 32'b0; wr_enable = 1'b0; address = address + 1; end