第一次用verilog调试串口(发送、接收)

1、首先是发送,程序如下

`timescale 1ns / 1ps

module send(in_data,out_data,en,clk); 
			
input clk;
input[7:0] in_data;
input en;
output reg out_data;

reg [12:0] timer;
reg[7:0]  in_buffer;
//reg tx_flag;



always @(posedge clk) 
begin 
	if(en==1) 
	  begin
		if(timer==20)
		in_buffer<=in_data; 
		//in_buffer<=8'b00000010;
		if(timer<4774)    
				timer<=timer+1'b1;
				else
				begin
					timer<=0;
					in_buffer<=0;
				end
	  end		
end
 
always @(posedge clk)
   begin
	if(en==1)
	begin
	
       case(timer)
           
           13'd0:
				begin
                 out_data<=0;
				 end
           13'd434: 
                 out_data<=in_buffer[0];//?????????
           13'd868:
                 out_data<=in_buffer[1];
           13'd1302:
                 out_data<=in_buffer[2];
           13'd1736:
                 out_data<=in_buffer[3];
           13'd2170:
                 out_data<=in_buffer[4];
           13'd2604:
                 out_data<=in_buffer[5];           
           13'd3038:
                 out_data<=in_buffer[6];
           13'd3472:
                 out_data<=in_buffer[7];
           13'd3906:
                 out_data<=0;
           13'd4340: 
				        begin		   
                 out_data<=1'b1;
				       end
       endcase    
    end
else
out_data<=1'bz;	 
   end  
   
endmodule

2、然后是接收

`timescale 1ns / 1ps


module rx(data_in,
          en,
          rx_finish,
          clk,
          data_out,
          rst
);
input data_in;
input clk,en,rst;//
output  rx_finish;
reg rx_finish;
output reg[7:0]  data_out;
reg[7:0] data_buffer;
reg[13:0] timer=0;
reg[7:0] time1=0;
reg[8:0] time2;
reg[3:0] i;  
(* KEEP =  "TRUE" *) reg  T=0;//前面括号是为了在chipscope中能找到改信号,以免被优化掉


always @(posedge clk)//use for chipscope,chipscope的触发信号产生
begin
time1<=time1+1'd1;
i

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要设计一个VerilogHDL频率计,首先需要明确需求和设计规范。一般来说,频率计需要接收一个时钟信号,并且能够计算出该时钟信号的频率。下面是一个简单的VerilogHDL频率计的示例代码: ```verilog module freq_counter( input clk, // 时钟信号 output reg [31:0] freq // 频率计数器 ); reg [31:0] count = 0; // 计数器 always @(posedge clk) begin count <= count + 1; // 每个时钟周期计数器加1 end always @(posedge clk) begin if (count == 0) begin freq <= $time; // 如果计数器清零,将当前时间赋值给频率计数器 end end endmodule ``` 在这个VerilogHDL模块中,我们使用了两个always块。第一个always块根据时钟信号clk每个时钟周期将计数器count加1。第二个always块在每个时钟上升沿时,如果计数器count清零,就将当前时间赋值给频率计数器freq。 接下来,我们可以使用Quartus软件对这个VerilogHDL模块进行仿真。在Quartus中,我们可以使用ModelSim仿真器进行仿真。以下是一个简单的仿真脚本: ```tcl vlib work vlog freq_counter.v vsim work.freq_counter add wave * run 100 ns ``` 在这个仿真脚本中,我们首先创建了一个工作库work,然后编译了freq_counter.v文件并创建了一个仿真实例work.freq_counter。然后,我们将所有信号添加到波形窗口中,并且运行仿真100ns。 当我们运行这个仿真脚本时,我们可以看到freq_counter模块的波形图,并且可以观察到频率计数器的计数值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值