Verilog——74HC194多功能双向移位寄存器

Verilog——74HC194多功能双向移位寄存器

  • 设计思路
  • 代码实现
    • 设计模块
    • 测试模块
  • 仿真结果

设计思路

根据74HC194的功能表进行行为级建模,如下图:

Verilog——74HC194多功能双向移位寄存器_第1张图片

代码实现

设计模块


//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

仿真结果

Verilog——74HC194多功能双向移位寄存器_第2张图片
Verilog——74HC194多功能双向移位寄存器_第3张图片

你可能感兴趣的:(Verilog)