精华内容
下载资源
问答
  • 并行转串行verilog
    2021-12-03 15:56:57

    基础知识:

    1.波特率:模拟线路信号的速率,也叫调制速率,未压缩的话就是每秒钟传输的数据位数。如果压缩了每秒钟传输的数据位数大于调制速率。如果彼此之间通信,就要求波特率一致,高波特率器件会向低波特率器件向下兼容。

    2.比特率:是数字信号的速率,每秒传输多少二进制代码的有效位,b/s,kb/s,mb/s。这里的换算倍数是1000,区别于计算器存储单元的1024倍。

    比特率=波特率*单个调制状态对应的二进制位数。两相调制(单个调制状态对应1个二进制位)的比特率等于波特率;四相调制(单个调制状态对应2个二进制位)的比特率为波特率的两倍;八相调制(单个调制状态对应3个二进制位)的比特率为波特率的三倍;依次类推。

    3偶校验:当发送的数据段中1的个数为偶数的时候,校验位为0,否则为1

     奇校验:当发送的数据段中1的个数为奇数的时候,校验位为0,否则为1

    举个简单的例子,A发送数据0x35到B,后面紧跟一个奇校验位J, 0x35的二进制=  0011 0101,可以看出8个数据位中一共有4个‘1’,那此时硬件会根据“1”的个数来设置J,这里会将奇校验位J调整为“1”,为什么呢? 因为数据位的“1”的个数是偶数,而我们用的是奇校验,所以为了达到有奇数个“1”的目的,调整奇偶校验位J为“1”,那么这9个位发出去就有奇数个“1”啦,当B接收的时候,B的硬件同样会对接收到“数据+J”中“1”的个数进行计数判断,如果是奇数个“1”,则认为数据接收正确,否则认为数据错误。而当A发送数据0x25( 0010 0101)到B的时候,则J应该就是“0”了,因为要保证发送出去的数据位+J位一共有奇数个“1”。

    反正一句话,对于发送方就是这个位就是来调整的,对于接收方局势数据加上这位来算是否是奇数或者偶数来判断是否传输错误。

     wire类型相当于物理连线,默认值为z,高阻态       reg类型相当于触发器,默认值为x,不定态

    wire只能被assign连续赋值,reg只能在initial和always中赋值。

    4.校验码和校验位的区别

      校验码就是数据帧中的第n位,是一个位的概念

      假如是偶校验,数据段中含有偶数个1,这个时候就要通过^data操作来算出校验位上的数字等于多少,这个数用来修正整体数据帧的奇偶,此时应该为0;如果数据段传了奇数个1,则为了保证整体数据帧1的个数为偶数,校验码为1。

    5。assign even_bit = ^data; assign odd_bit = ~even_bit

      论述:Verilog中的奇偶校验_永恒的止水的博客-CSDN博客

    6.阻塞赋值和非阻塞赋值

    (1)当用always块来描述组合逻辑(combinational logic)时,应当使用阻塞赋值。

    (2)对于时序逻辑(sequential logic)的描述和建模,应当使用非阻塞赋值。

    (3)在同一个always模块中,最好不要混合使用阻塞赋值和非阻塞赋值,对同一变量

    既进行阻塞赋值,又进行非阻塞赋值,在综合时会出错。所以always中要么全部使用非

    阻塞赋值,要么把阻塞赋值和非阻塞赋

    值分在不同的always中书写。

    (4)尽量不要再在多个不同的always块中对同一变量赋值。

    (5)使用$strobe显示使用非阻塞赋值的变量。

    Verilog HDL 中阻塞与非阻塞赋值理解_StephenZhou-CSDN博客

    更多相关内容
  • 一.设计软件使用quartus15.0,自带Modesim-Altera,设计源代码如下 module rs2321(clk,rdy,data,bps,parity,d_out); input clk;...//最终串行输出口 reg [15:0] count; reg [15:0] count_tota..

    一.设计软件使用quartus15.0,自带Modesim-Altera,设计源代码如下

    module rs2321(clk,rdy,data,bps,parity,d_out);
       input clk;
    	input rdy;
    	input [7:0]	data;
    	input [1:0]	bps;
    	input parity;//0为偶校验,1为奇校验,外部输入
    	output d_out;//最终串行输出口
    	reg [15:0]	count;
    	reg [15:0]	count_total;
    	reg bps_clk;//作为波特率的输出时钟信号,0,1交替变换
    	
    	always@(posedge clk or posedge rdy)//波特率产生
    	if(rdy)
    		begin bps_clk<=0;count_total<=0;end
    	else 
    		if(count_total==count)
    			begin count_total<=0;bps_clk<=~bps_clk;end
    		else
    			begin count_total<=count_total+1;end
    	
    	
    	
    	always@(posedge bps or posedge rdy)//波特率选择
    		case(bps)
    		   2'b00:count=1666;//9600波特率需要的计数值
    		   2'b01:count=833;//19200波特率需要的计数值
    	       2'b10:count=417;//38400波特率需要的计数值
    	       2'b11:count=208;//76800波特率需要的计数值
    		endcase
    		 
    		 
    		 
    	reg parity_mode;//校验模块
    	reg p_bit;
    	
    	always@(data)
    	parity_mode<=parity;
    	
    	wire event_bit;//发送方调整计算校验位的算法最后把event_bit位或者odd_bit位加到后面发送出去
    	wire odd_bit;
    	assign event_bit=^data;
    	assign odd_bit=~event_bit;
    	
    	always@(parity_mode)
    		if(!parity_mode)
    			begin p_bit=event_bit;end//parity_mode为0设置p_bit为偶校验位,注意:但并没有说p_bit是几
    		else
    			begin p_bit=odd_bit;end
    		  
    		  
    	 reg [3:0]	cnt;//cnt计数送入移位寄存器的数据位数
    	 reg [10:0]	data_sent;//起始位加数据加校验位加停止位一共11位
    	 reg data_out;//串行输出口,中间变量
    	 reg data_out_en;
    	 reg data_begin;//起始位初始值为0
    	 reg data_end;//停止位初始值是1
    	 initial data_begin=0;
    	 initial data_end=1;
    	 
    	 
    	always@(posedge rdy or posedge bps_clk)
    		if(rdy==1)
    			begin cnt<=0;data_sent<={data_end,p_bit,data[7:0],data_begin};end//数据是左移的
    		else 
    			if(cnt==11)//cnt是四位二进制数,11是十进制数
    				begin data_out_en<=0;end
    			else
    				begin data_out_en<=1;data_out<=data_sent[cnt];cnt<=cnt+1;end//发送移位寄存器对应的位送出到串行口
    	
    	
    	assign d_out=data_out_en?data_out:1'bz;//data_out_en作用就是移入一位送出一位one by one防止后面的来了前面的还没走
    endmodule

    二.测试激励文件代码如下:

    `timescale 1 ns/ 1 ns
    module rs2321_tb;
    // constants                                           
    // general purpose registers
    //reg eachvec;
    // test vector input registers
    reg [1:0] bps;
    reg clk;
    reg [7:0] data;
    reg parity;
    reg rdy;
    // wires                                               
    wire d_out;
    
    // assign statements (if any)                          
    rs2321 i1 (
    // port map - connection between master ports and signals/registers   
    	.bps(bps),
    	.clk(clk),
    	.d_out(d_out),
    	.data(data),
    	.parity(parity),
    	.rdy(rdy)
    );
    
    initial 
     clk = 1;
     always #31.25 clk=~clk;//隔 31.25ns,时钟反转一次,周期为 62.5ns 
     
    initial 
    begin     
      parity = 1;   
      bps[1:0]=2'b00;   
      data[7:0]=8'b1001_1001;       
      rdy =0 ;                                     
      #100000                                       
      rdy =1;                                      
      #100                                       
      rdy = 0;  
      #3000000  
      bps[1:0]=2'b01;  
      data[7:0]=8'b1001_0011; 
      #100000 
      rdy =1;   
      #100 
      rdy = 0;  
      #5000000  
      bps[1:0]=2'b10; 
      data[7:0]=8'b1001_1101;  
      #100000  
      rdy =1;  
      #100  
      rdy = 0;  
      #5000000 
      bps[1:0]=2'b11; 
      data[7:0]=8'b1001_0001;  
      #100000  
      rdy =1;  
      #100  
      rdy = 0;  
      #5000000
      $stop; 
    end
    endmodule
    
    
    

    三.注意点总结:

       1.实体名,module的名字和.v文件名要一致

       2.实体创建工程的过程中要选择联合仿真工具modelsim-altera时,要设置为Verilog HDL语言,默 认为VHDL,否则后面仿真会出现no design loaded错误

       3 .测试激励文件编写的时候注意rdy的停顿时间,否则仿真波形无可读性

    展开全文
  • Verilog 并行输入 串行输出+数据更新

    千次阅读 2020-10-31 09:30:25
    Verilog串输出+数据更新 和别的并串不同的是这次是并串plus 笔者看网上大多数有关Verilog串程序实践性较差,要么输出延时较大,要么不支持输入数据更新输出,还有的就是从低位到高位输出(个人觉得...

    Verilog 并行输入 串行输出+数据更新

    和别的并转串不同的是这次是并转串plus

    ** 笔者看网上大多数有关Verilog并转串程序实践性较差,要么输出延时较大,要么不支持输入数据更新输出,还有的就是从低位到高位输出(个人觉得不大方便)。
    那么废话少说,直接看代码,注释个人认为比较详细了,就不赘述了。

    //         并转串          //
    
    //   顺序:从高位到低位     //
    
    module pts (clk,datain,dataout); //rst,
                                          
    // input rst;
     input clk;                     //设置输入输出
     input[31:0] datain;
     output dataout;
     
     reg dataout;
     wire[31:0] datain;
     reg [5:0] counter;
     reg [31:0] jud;           //为判断输入数据是否更新设置此寄存器
    
     
    
     always@(posedge clk)  //or negedge rst
    
    begin 
     
        counter<=6'b100000;    //给计数值赋值;计数即输出位数
    //    jud<=datain;
               
    
    //  if(!rst)               //引脚复位不用,通过其他方式复位
    //	  begin
    //	   counter<=6'b100000;
    //	   dataout<=0;
    //	  end
    //	 else 
    
    
     if(counter==0)             //计数值为0时,进行复位判断(两个“大”循环之一),这个循环主要分析当计数值或者说输出位数到最后一位的情况
      begin
       if(jud==datain)          //输出位到最低位时,若被转换数据还未更新将不再输出(在if(counter==0)的循环中)
       begin
        dataout<=0;
    	 counter<=0;
       end
       else
    
       if(jud!==datain)         //输出位到最低位时,若被转换数据更新则计数复位(还在if(counter==0)的循环中)
        begin
         dataout<=0;
    	  counter<=6'b100000;
        end
      end
     else
    
    
     if(jud!==datain)           //当输入数据更新时(两个“大”循环之二),这个循环主要分析当输入更新时输出位数的更新情况
      begin
    	if(counter==6'b000000)   
        begin
    	  dataout<=0;
    	  counter<=0;
    	 end
    	else
    
    	begin                    //当位数不为0时,复位
    	  jud<=datain;
    	  dataout<=0;
    	  counter<=6'b100000;
    	 end
    	end
     else
    
    
     begin                       //并转串
    
    
      dataout=datain[counter-1];
      counter<=counter-1;
    
     end
     
    end
    endmodule
    

    实际工程上笔者用到的并不是这样的,不过主要部分就是这些了。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 1 Verilog描述 module shift_p2s( input clk, input [7:0] din, input load, output reg q ); reg [7:0] tmp; always@(posedge clk)begin if(load == 1...

    1 Verilog描述

    module shift_p2s(
        input         clk,
        input [7:0]    din,
        input         load,
        output reg     q
    );
        reg [7:0] tmp;
        
        always@(posedge clk)begin
            if(load == 1'b1)
                tmp <= din;
            else begin
                q <= tmp[7];
                tmp <= {tmp[6:0],1'b0};
            end
        end

    endmodule

    2 RTL视图

    3 功能仿真

    展开全文
  • 1、8位并行数据输入转串行数据输出,采用移位方式,代码如下: module shift ( clk,rst_n, din,dout ); parameter Num=8; output dout; //串行数据输出 input clk; //控制时钟 input rst_n; //复位信号,...
  • 并行转串行 串行转并行输出模块

    千次阅读 2018-12-28 17:50:02
    并行转串行 串行转并行输出模块 夏宇闻Verilog 第15章学习笔记 通信协议:scl为高,sda由高跳变低,start;scl为高,sda由低跳变为高,stop;scl为低,sda数据位才能变化 两个模块ptosda和out16hi,将ptosda并串...
  • Verilog实现串并转换

    千次阅读 2021-06-08 16:23:03
    串行转并行数据输出:采用位拼接技术(移位寄存器),将串行的数据总数先表示出来,然后发送一位数据加一,后面的接收的这样标志: data_o <= {data_o[6:0],data_i }; 1输入8输出 的 串转并模块的Verilog代码 ...
  • 模块功能:接收串行数据,转为并行数据。 应用场景:在SPI,Uart等串行协议接收侧均有应用。 二. 模块框图与使用说明 有两种模式(通过参数SDATA_IS_CONTINUOUS进行选择): 1.数据连续模式,此时sdata_valid指示...
  • verilog实现串并转换

    千次阅读 2021-12-16 16:55:45
    串转并:我这个实现为每输入四位串行数据,输出一个并行数据 module c2b(input clk, input rst_n, input data_i, output reg[3:0] data_o); reg [2:0] cnt; always@(posedge clk or negedge rst_n)begin if...
  • 本文节选自《FPGA之道》,来一起学习下作者对于并行串行的讲解。
  • 串行输出数据从触发器FD的QD端输出,并行数据从个触发器的QA~QD端输出,两种输出方式都属于同向输出。各触发器都采用同一时钟信号,所以它们工作在同步状态。如果将FD的输出端QD接到FA的输入端DI,则可以构成循环...
  • verilog实例—并行数据流转化为一种特殊串行数据流模块的设计
  • Verilog实现8位串行数据转并行数据

    千次阅读 2021-08-18 19:26:11
    解串器(deserialize):串行信号转并行信号 输入信号有: 时钟信号clk, 复位信号rst 串行数据输入信号din。 输出信号为8bit并行信号dout。 每经过8个时钟周期,便把收到的8个串行信号合成并行信号并输出,等下8个...
  • 假如reg是一个串行不断输入的1bit数据,当其传输8位后停止传输,假设其8次输入的数据为 1111 1111,而rx_data本来的数据为8位的0000 0000 always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n == 1'b0) ...
  • verilog并行

    2021-10-31 22:03:05
    verilog并行verilog语言所实现的电路是并行执行的,对应于所写的模块所反映的便是: 不同的always语句都是可以相互独立并且并行工作的。 同一个always语句内不同的逻辑处理都是并行的。 always @(posedge clk...
  • 并行flash FPGA读写测试,Verilog语言,可以实现并行flash读写单独测试。
  • 这是一个将并行数据转换为串行输出的变换器,利用双向总线输出。这是由EEPROM读写器的缩减得到的,首先对I2C总线特征介绍: I2C总线(inter integrated circuit)双向二线制串行总线协议为:只有总线处于“非忙”...
  • 串口通信分为串行通信和并行通信,这里主要将串行通信,因为要用到。 串行通信主要分为同步通信和异步通信。 串行通信 同步通信 带时钟同步信号的数据传输 如 I2C、SPI 异步通信 不带时钟同步...
  • 基于第二类LFSR串行CRC生成器的32位并行实现结构。用于SATA 3。 verilog语言。
  • 上节我们使用编码模块可解决图像数据的编码问题,而这次使用的并行串行模块的主要功能就是实现并行串行转换、单端信号差分信号、单沿采样双沿采样。 并行串行模块框图如下: 图1 串行并行结构框图...
  • Verilog并行语句

    千次阅读 2021-08-07 10:58:22
    文章目录并行语句verilog生成语句 并行语句 1. 连续赋值语句---assign语句 2. Verilog程序块语句---initial与always块 3. Verilog实例化语句----单独实例化与数组实例化 4. verilog生成语句 verilog生成语句 生成...
  • verilog实现串行信号8bit并行信号

    千次阅读 2020-06-18 19:02:35
    串行信号转并行信号即为解串器(deserialize)。 输入信号有时钟信号clk,复位信号rst和串行数据输入信号din。 输出信号为8bit并行信号dout。 每经过8个时钟周期,便把收到的8个串行信号合成并行信号并输出,等下...
  • Verilog并行,串行,数据类型,操作符号等相关基础归纳
  • 并行数据转换为串行数据的转换器

    万次阅读 2017-07-24 12:04:16
    这篇文章写一下今天早上设计的并行数据到串行数据的转换器,也算是对并行总线和串行总线一个小小的应用,编码过程中也用到了task。 该转换器主要实现的功能是: 1、把并行地址存入寄存器 2、把并行数据存入寄存器 3...
  • fpga设计 使用MATLAB设计一个2kHz采样,500Hz截止的15阶低通滤波器(h(n)长度为16),量化位数为12bit,输入信号位宽也为12bit。 根据FIR直接型结构可知,...全串行结构:对称系数的加法运算也由一个加法器串行实现
  • unsigned char cal_table_high_first(unsigned char value) { unsigned char i ; unsigned char checksum = value ; for (i=8;i>0;--i) { if (check_sum & 0x80) { check_sum = (check_sum<... }
  •  //link_sda控制sdabuf输出到串行总线上 parameter ready = 8'b0000_0000, start = 8'b0000_0001, bit3 = 8'b0000_0010, bit2 = 8'b0000_0100, bit1 = 8'b0000_1000, bit0 = 8'b0001_0000, prestop = 8'b...
  • 简单的串并转换verilog

    千次阅读 2021-03-30 09:26:01
    数据从串行并行,数据排列顺序是高位在前,可以用以下的编码方式实现: prl_temp <= {prl_temp , srl_in}; 其中,prl_temp是并行输出缓存寄存器,srl_in是串行输入数据。 对一些有规定的串并转换,可以使用case...
  • 第二篇 FPGA数字信号处理_并行FIR滤波器Verilog设计
  • 串行接收并行发送FIFO

    2012-01-05 00:17:55
    一个串行接收,并行发送的缓存器,其数据存储使用双端口SRAM(一读一写)实现,SRAM大小为深64、宽32位(64字×32位,使用提供的双端口SRAM见目录rf2shd4)。缓存器按一位串行输入接收数据,缓存器位置全满后不再...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,096
精华内容 838
关键字:

并行转串行verilog