当前位置:
文档之家› EDA技术_组合逻辑电路设计_Verilog
EDA技术_组合逻辑电路设计_Verilog
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
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;
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
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
分不同的时间把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
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
第 3章
组合逻辑电路设计
数字电路
组合电路
电路输出完全依赖电路输入
与非门等
运算
电路输出在一定程度不依赖电路输入
时序电路
D触发器
记忆
1
组合电路
实现功能
时序电路
使功能有序
2
3.3 Verilog 过程及译码电路
Always 过程语句
always定义的过程块是一个电路,电路 从上电开始就会一直执行; (从代码一开始就执行,执行完了再回 到过程块的最初来执行,周而复始,不 会停止,直到代码执行完毕)
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
再对9527从二进制到 abdcdefg译码
reg[6:0] abcdefg; always@(bin) begin case(bin) 4„b0000: abcdefg<= 7'b0111111; …. …. default: abcdefg<= 7'b0000000; endcase
3.5 实例3:计数牌子
3.3 过程语句caቤተ መጻሕፍቲ ባይዱe
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");
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
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
任务分析: 设计一个计数牌子,能从0000计数 到9999,每隔1秒钟跳动一下。通过复 位可以把系统清零为0000
【涉及】 动态数码管显示,复位,分频电路等
设计思路:
1.内部所有数据都是2进制的,所以需要设
计4个4位2进制的reg,分别对应显示的
4个数字,再通过动态扫描电路送到LED
上面去显示。
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;
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
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 过程中的阻塞赋值与 非阻塞赋值
阻塞式 (blocking) 的操作符为 “=” 非阻塞式 (non-blocking)的操作符 为 “ <= ” 阻塞赋值和非阻塞赋值的基本区别是: 阻塞赋值是顺序执行语句,而非阻塞赋 值是并行执行语句。两种语句的含义不 同,建模的应用也就不同。