赞
踩
根据74HC194的功能表进行行为级建模,如下图:
//filename:74HC194.v module _74HC194( input CR,CP,DSR,DSL, input [1:0] S, input [3:0] D, output reg [3:0] Q); /*端口说明: 输入:CR为异步置零端,CP为时钟信号,DSR为右移串行数据输入端,DSL为左移串行数据输入端, S为控制信号:当S=00时,输出保持;S=01时,输出右移;S=10时,输出左移,S=11时,进行同步并行置数 输出: Q为输出端信号 */ //敏感信号:CP上升沿和CR的下降沿 always@(posedge CP or negedge CR) begin if(~CR) Q<=4'b0000; //CR异步置零的优先级最高 else case(S) //判断控制信号 2'b00:Q<=Q; 2'b01:Q<={Q[2:0],DSR}; //使用位拼接运算符实现数据的左右移动 2'b10:Q<={DSL,Q[3:1]}; 2'b11:Q<=D; endcase end endmodule
//tb_74HC194.v //filename:tb_74HC194.v `timescale 10ns/1ns module tb_74HC194; reg CR,CP,DSR,DSL; reg [1:0] S; reg [3:0] D; wire [3:0] Q; /*端口说明: 输入:CR为异步置零端,CP为时钟信号,DSR为右移串行数据输入端,DSL为左移串行数据输入端, S为控制信号:当S=00时,输出保持;S=01时,输出右移;S=10时,输出左移,S=11时,进行同步并行置数 输出: Q为输出端信号 */ _74HC194 U(CR,CP,DSR,DSL,S,D,Q); initial $monitor($time,"\tDSR=%b,DSL=%b,S=%b,D=%b,Q=%b",DSR,DSL,S,D,Q); //时钟脉冲 initial CP=0; always #1 CP=~CP; //测试 initial begin //预置为1111 CR=1;S=2'b11;DSR=0;DSL=0;D=4'b1111; #2 //清零 CR=0;S=2'b11;DSR=0;DSL=0;D=4'b1111; #2 //右移,DSR=1 CR=1;S=2'b01;DSR=1;DSL=0;D=4'b1111; #2 //右移,DSR=1 CR=1;S=2'b01;DSR=1;DSL=0;D=4'b1111; #2 //右移,DSR=0 CR=1;S=2'b01;DSR=0;DSL=0;D=4'b1111; #2 //右移,DSR=0 CR=1;S=2'b01;DSR=0;DSL=0;D=4'b1111; #2 //清零 CR=0;S=2'b11;DSR=0;DSL=0;D=4'b1111; #2 //左移,DSL=1 CR=1;S=2'b10;DSR=0;DSL=1;D=4'b1111; #2 //左移,DSL=1 CR=1;S=2'b10;DSR=0;DSL=1;D=4'b1111; #2 //左移,DSL=0 CR=1;S=2'b10;DSR=0;DSL=0;D=4'b1111; #2 //左移,DSL=0 CR=1;S=2'b10;DSR=0;DSL=0;D=4'b1111; #2 $stop; end endmodule
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。