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

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

设计思路

根据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

仿真结果

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值