《EDA 与数字系统设计 第2版 教学课件 ppt 作者 李国丽 等编著 CH3ch3-7》由会员分享,可在线阅读,更多相关《EDA 与数字系统设计 第2版 教学课件 ppt 作者 李国丽 等编著 CH3ch3-7(21页珍藏版)》请在金锄头文库上搜索。
1、第三章 Verilog HDL硬件描述语言,3.1 Verilog HDL概述 3.2 Verilog HDL语言要素 3.3 Verilog HDL基本语句 3.4 Verilog HDL门元件和结构描述 3.5 仿真验证 3.6 可综合性描述 3.7 设计实例,3.7 设计实例,3.7.1 译码电路 3.7.2 编码电路 3.7.3 数据分配器 3.7.4 同步计数器 3.7.5 移位寄存器 3.7.6 有限状态机的设计 3.7.7 复杂逻辑电路设计,3.7.1 译码电路,例3-7-1 3-8译码器 module decoder(a,b,c,cntl,y); input a,b,c; in
2、put 2:0 cntl; output 7:0 y; wire a,b,c; wire 2:0 cntl; reg 7:0 y; wire 2:0 data_in; assign data_in=c,b,a; always (data_in or cntl) endmodule,if ( cntl = 3b100 ) case (data_in) 3b000: y=8b1111_1110; 3b001: y=8b1111_1101; 3b010: y=8b1111_1011; 3b011: y=8b1111_0111; 3b100: y=8b1110_1111; 3b101: y=8b110
3、1_1111; 3b110: y=8b1011_1111; 3b111: y=8b0111_1111; endcase else y=8b1111_1111;,module coder(data_in, data_out, enable); input 7:0 data_in; input enable; output 2:0 data_out; wire 7:0 data_in; reg 2:0 data_out; always ( data_in or enable ) if ( enable ) data_out=3bz; else if ( data_in0 ) data_out=3b
4、000; else if ( data_in1 ) data_out=3b001; else if ( data_in2 ) data_out=3b010; else if ( data_in3 ) data_out=3b011; else if ( data_in4 ) data_out=3b100; else if ( data_in5 ) data_out=3b101; else if ( data_in6 ) data_out=3b110; else if ( data_in7 ) data_out=3b111; else data_out=3bz; endmodule,3.7.2 编
5、码电路,module demux (reset, cntl, d,dp1,dp2,dp3,dp4); input reset; /复位信号 input 1:0 cntl; /控制信号 input 3:0 d; /输入数据 output 3:0 dp1; /数据通道1 output 3:0 dp2; /数据通道2 output 3:0 dp3; /数据通道3 output 3:0 dp4; /数据通道4 wire reset; wire 1:0 cntl; wire 3:0 d; reg 3:0 dp1, dp2, dp3, dp4;,3.7.3 数据分配器,always (reset or c
6、ntl or d) if (reset) begin /复位 dp1=4b0; dp2=4b0; dp3=4b0; dp4=4b0; end else case (cntl) /通道选通 2b00: dp1 = d; 2b01: dp2 = d; 2b10: dp3 = d; 2b11: dp4 = d; default: begin dp1=4bzzzz; dp2=4bzzzz; dp3=4bzzzz; dp4=4bzzzz; end endcase endmodule,module counter(clk,en,clr,result); input clk, en , clr; outpu
7、t 7:0 result; reg 7:0 result; always ( posedge clk ) begin if ( en ) if (clr | result = = 8b1111_1111) result = 8b0000_0000; else result = result+1; end endmodule,3.7.4 同步计数器,module shift_left( clk, en, clr, data_in, data_out ); input clk,en,clr; input 7:0 data_in; output 7:0 data_out; wire 7:0 data
8、_in; reg 7:0 data_out; always ( posedge clk ) if ( en ) if ( clr ) data_out7:0 = 8b0; else data_out7:0 = data_in 1 ; endmodule,3.7.5 移位寄存器,例3-7-7 自动售饮料机要求每次投币一枚,分为五角和一元两种,根据两种币值的投币信号指示售货机是否发货,以及是否找零。这是一个可以用状态机描述的问题,共定义了7个状态,根据每次投入的币值决定下一个状态的变化。 7个状态的含义: STATUS0: 投币时,售货机内没有硬币; STATUS1: 投币时,售货机内已有5角;
9、STATUS2: 投币时,售货机内已有1元; STATUS3: 投币时,售货机内已有1元5角; STATUS4: 投币时,售货机内已有2元; STATUS5: 投币时,售货机内已有2元5角; STATUS6: 投币时,售货机内已有3元;,3.7.6 有限状态机的设计,假定投币信号five_jiao和one_yuan不会同时为1,饮料价格为2.5元。 当已投入2.5元时,仍继续投币,则售一瓶饮料后转至STATUS1或STATUS2状态; 若已投入3元,则将找零的五角作为基数,状态转移至STATUS2或STATUS3 ,开始新的转移。,例:自动售货机的verilog描述,module auto_s
10、ell ( five_jiao,one_yuan, clk, reset, sum, sell, five_jiao_out); input five_jiao,one_yuan; input clk, reset; output sell, five_jiao_out; output 7:0 sum; reg sell, five_jiao_out; reg 7:0 sum; reg 2:0 state; define STATUS0 3b000 define STATUS1 3b001 define STATUS2 3b011 define STATUS3 3b010 define STA
11、TUS4 3b110 define STATUS5 3b111 define STATUS6 3b101,always (posedge clk) current_state = next_state; /cs always (current_state or reset or five_jiao or one_yuan) begin if (!reset) begin next_state = STATUS0; five_jiao_out = 0; sell=0; sum=8h00; end else case (current_state) STATUS0: begin five_jiao
12、_out = 0; sell=0; sum=8h00; if (five_jiao) next_state = STATUS1; else if (one_yuan) next_state = STATUS2; else next_state = STATUS0; end,STATUS1: begin five_jiao_out = 0; sell=0; sum=8h05; if (five_jiao) next_state = STATUS2; else if (one_yuan) next_state = STATUS3; else next_state = STATUS1; end ST
13、ATUS2: begin five_jiao_out = 0; sell=0; sum=8h10; if (five_jiao) next_state = STATUS3; else if (one_yuan) next_state = STATUS4; else next_state = STATUS2; end,STATUS3: begin five_jiao_out = 0; sell=0; sum=8h15; if (five_jiao) next_state = STATUS4; else if (one_yuan) next_state = STATUS5; else next_s
14、tate = STATUS3; end STATUS4: begin five_jiao_out = 0; sell=0; sum=8h20; if (five_jiao) next_state = STATUS5; else if (one_yuan) next_state = STATUS6; else next_state = STATUS4; end,STATUS5: begin sell=1; five_jiao_out=0; sum=8h25; if (five_jiao) next_state=STATUS1; else if ( one_yuan ) next_state =
15、STATUS2; else next_state=STATUS0; end,STATUS6: begin sell=1; sum=8h30; if (five_jiao) begin next_state=STATUS2; five_jiao_out=0; end else if ( one_yuan ) begin next_state = STATUS3; five_jiao_out = 0; end else begin next_state=STATUS0; five_jiao_out=1; end end,default: begin next_state=STATUS0; sell=0; sum=8h00; five_jiao_out=0; end endcase end endmodule,为了更加接近实际