verilog 相邻16点相加输出

在这里插入图片描述

在这里插入图片描述


sigma_16p.v:


//2022-1-22 Verilog学习
// 相邻16点相加

`timescale 1ns/10ps

// 定义端口 时序逻辑:时钟,复位
module sigma_16p(
								clk, 
								res,  
								data_in,
								syn_in,  // 采样时钟
								data_out,
								syn_out
								);

// 定义端口属性
input							clk;
input							res; 
input[7:0]						data_in;  // 采样信号
input							syn_in;   // 采样时钟
output[11:0]					data_out; // 累加结果输出
output							syn_out;  // 累加结果同步脉冲

reg								syn_in_n1; // syn_in的反向延时  寄存器
wire							syn_pulse; // 采样时钟上升沿识别脉冲
assign							syn_pulse = syn_in & syn_in_n1;
reg[3:0]						con_syn;   // 采样时钟循环计数器

wire[7:0]						comp_8; // 补码
wire[11:0]						d_12;   // 升位结果
assign							comp_8 = data_in[7]?{data_in[7],~data_in[6:0]+1}:data_in;  // 补码运算
// 升位运算:正数,前面扩展4个0 负数,前面扩展4个1,即符号位的复制
assign							d_12 = {comp_8[7],comp_8[7],comp_8[7],comp_8[7], comp_8};  // 升位
reg[11:0]						sigma;  // 累加计算
reg[11:0]						data_out; 
reg								syn_out;

always@(posedge clk or negedge res) 
if(~res)begin      // 复位信号下降沿 reg型变量清零
	syn_in_n1 <= 0;  // 清零 采样时钟的反向延时
	con_syn <= 0;    // 清零 采样时钟循环计数器
	sigma <= 0;
	data_out <= 0;
	syn_out <= 0;
end
else begin
	syn_in_n1 <= ~syn_in_n1;  // 采样时钟的反向延时
	if(syn_pulse)begin
		con_syn = con_syn+1;
	end
	
	if(syn_pulse)begin
		if(con_syn==15)begin  // 采样时钟循环计数器=15
			sigma <= d_12;      // 保留当前时刻输入信号
			data_out <= sigma;  // 输出之前时钟计数15内输入信号累加结果
			syn_out<=1;			
		end
		else begin
			sigma <= sigma + d_12;  // 累和输入信号
		end
	end
	else begin
		syn_out <= 0; 
	end
end

endmodule

//   testbench 测试台
module sigma_16p_tb;

// 输入
reg									clk,res;
reg[7:0]							data_in;
reg									syn_in;
// 输出
wire[11:0]							data_out;
wire								syn_out;

sigma_16p sigma_16p(
									.clk(clk),
									.res(res),
									.data_in(data_in),
									.syn_in(syn_in),
									.data_out(data_out),
									.syn_out(syn_out)
									);

initial begin
						clk<=0; res<=0; data_in=1;syn_in<=0;  // 8'b1000_0001:-1
				#17		res<=1;
				#25000  $stop;  // 16点一个周期,10ns一个点,160ns一个周期,500ns够
end

always 		#5 		clk = ~clk;   // 系统时钟
always		#100	syn_in <= ~syn_in;  // 采样时钟

endmodule


modelsim:

为什么有14???


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值