将一段C语言转化为Verilog

这篇具有很好参考价值的文章主要介绍了将一段C语言转化为Verilog。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有时需要先用C语言完成某些设计,通过成熟的仿真软件验证后再转化为Verilog代码

#include <stdio.h>
int main(void){
  int n,A,B,C;
  A = 0;
  C = 7;
  scanf("n=%d",&n);
  while(C>=0){
  	B = ((A << 1) + (1 << C)) << C;
  	if(B <= n){
  		A += (1 << C);
  		n -= B;
	  }
	  C--;
  }
  printf("A=%d",A);
return 0;
}

 上面是一个将平方数开方的算法,将其转化为verilog代码

module sqrt(clk,rst_n,indata,result);
input             clk;
input             rst_n;
input      [31:0] indata;     //输入用32bits
output reg [15:0] result;     //结果开方只需16bits

reg [31:0] indata_reg;        //算法中需要更改输入,因此需要设置一个寄存
reg [31:0] B;
reg [4:0]  C;                 //indata的最大值为2的30次方,因此根据算法C = 15即可
reg [4:0]  C_temp;            //在循环中,计算A的值需要上一周期C的值,这里需要注意
reg [15:0] result_reg;        //用于检测结果是否发生变化,发生变化
wire flag_f;                  //用于在循环的计算中使相邻两个循环“互通”
wire flag_r;                  //用于在循环的计算中使相邻两个循环“互通”

assign flag_f = (B <= indata_reg && C != C_temp)?1'd1:1'd0;
assign flag_r = (result != result_reg);

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)begin
	  result <= 16'd0;
	  indata_reg <= indata;
	end
	else if(B <= indata_reg && flag_r== 1'd0)begin
	   result <= result + (1 << C_temp);
	   indata_reg = indata_reg - B;
	end
	else begin
	  result <= result;
	  indata_reg <= indata_reg;
	end
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)begin
		C = 5'd15;
		B <= indata + 1'd1;       //刚刚复位后,为了防止误判,将B设置为大于indata,不影响后面
	end
	else if(C != 31 && flag_f == 0)begin
	B <= ((result << 1'd1) + (1'd1 << C)) << C;
	C <= C - 1'd1;
	end
	else begin
	  C <= C;
	  B <= B;
	end
end
//以下两个always块是重点,分别有不同的作用
always@(posedge clk or negedge rst_n)begin
   if(!rst_n)begin
	   C_temp <= 5'd0;
	end
	else begin
	   C_temp <= C;
	end
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)begin
	   result_reg <= 16'd0;
	end
	else begin
	   result_reg <= result;
	end
end

endmodule

c语言转verilog,verilog,c语言,开发语言,fpga开发

c语言转verilog,verilog,c语言,开发语言,fpga开发

       代码中重要的是,在C语言中,代码是顺序执行的,且可以把赋值语句加在循环的任何一个地方,因此本次循环可以使用本次循环或者相邻循环的值,而在Verilog中,不同值之间是并行改变的,相邻周期很容易会导致判断或者赋值语句不能够调用你所期待的,因此需要根据波形图去调整。波形图中的几个flag信号就是一些让循环正确运行的信号。文章来源地址https://www.toymoban.com/news/detail-532904.html

到了这里,关于将一段C语言转化为Verilog的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于vivado(语言Verilog)的FPGA学习(5)——跨时钟处理

    慢时钟到快时钟一般都不需要处理,关键需要解决从快时钟到慢时钟的问题,因为可能会漏信号或者失真,比如: 第一种办法是开环解决方案,也就是人为设置目标信号脉宽大于1.5倍的周期。但是容易和设计要求冲突 所以第二个大方法是闭环解决方案,也就是从改善同步方

    2024年02月03日
    浏览(50)
  • 基于FPGA的QPSK调制系统verilog开发

    目录 一、理论基础 二、核心程序 三、测试结果         正交相移键控(Quadrature Phase Shift Keying,QPSK)是一种数字调制方式。它分为绝对相移和相对相移两种。由于绝对相移方式存在相位模糊问题,所以在实际中主要采用相对移相方式DQPSK。QPSK是一种四进制相位调制,具有良

    2024年02月01日
    浏览(47)
  • Verilog语言fpga小脚丫数字时钟(整点报时,调时,显示秒钟等功能)

    学弟加油!                                                                       ———来自科大焯人 最近刚好学习了数电有关知识,就做了这个项目(闹钟过于繁琐就没有做了) 希望给还在学习的大伙一点参考,完整代码在最后 在这里先附上两串代码分别是d

    2024年02月07日
    浏览(49)
  • 基于FPGA的FSK调制解调系统verilog开发

    目录 1.算法仿真效果 2.verilog核心程序 3.算法涉及理论知识概要 4.完整verilog VIVADO2019.2仿真结果如下:       频移键控是利用载波的频率变化来传递数字信息。数字频率调制是数据通信中使用较 早的一种通信方式,由于这种调制解调方式容易实现,抗噪声和抗衰减性能较强,

    2024年02月05日
    浏览(77)
  • FPGA开发] 使用Verilog实现一个简单的计数器

    计数器是数字电路中常见的元件之一,它能够按照一定的规律进行计数。在FPGA开发中,我们可以使用硬件描述语言Verilog来实现一个简单的计数器。本文将为您详细介绍如何使用Verilog编写一个基于FPGA的计数器,并提供相应的源代码。 首先,我们需要定义计数器的功能和规格

    2024年02月03日
    浏览(61)
  • 基于vivado+Verilog FPGA开发 — GT收发器

    代码规范:Verilog 代码规范_verilog代码编写规范-CSDN博客 开发流程:FPGA基础知识----第二章 FPGA 开发流程_fpga 一个项目的整个流程-CSDN博客   源码下载:GitHub - Redamancy785/FPGA-Learning-Record: 项目博客:https://blog.csdn.net/weixin_51460407 零、低速通信接口的缺陷 1、同步通信要求传输数据

    2024年04月17日
    浏览(64)
  • fpga开发基于verilog HDL的四人抢答器

    鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 智能电子抢答器可容纳4组参赛者抢答,每组设一个抢答钮。 ③ 电路具有第一抢答信号的鉴别和锁存功能。

    2024年02月04日
    浏览(49)
  • 密码锁设计Verilog代码Quartus 睿智FPGA开发板

    名称:密码锁设计Verilog代码Quartus  睿智FPGA开发板(文末获取) 软件:Quartus 语言:Verilog 代码功能: 1、设计一个密码锁的控制电路,当输入正确代码时,输岀开锁信号用红灯亮、绿灯 熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁 2、在锁的控制电路中储存一个可以修改的4位代

    2024年01月18日
    浏览(51)
  • 基于FPGA的7x7矩阵求逆verilog开发

    up目录 一、理论基础 二、核心程序 三、测试结果       要通过Verilog实现矩阵求逆,需要进行复杂的硬件设计,这是一个相当复杂的任务,特别是对于大型矩阵。矩阵求逆涉及到大量的浮点运算和存储操作,因此需要高度的硬件设计和优化。以下是一般步骤,可以帮助您开始

    2024年02月15日
    浏览(62)
  • 基于vivado(语言Verilog)的FPGA学习(2)——zedboard开机测试和程序烧写

    终于找到之前写的部分了,在OneNote上,以后还是专注写在一个地方 ZedBoard 可以通过四个不同的方法烧写,这些方法是: USB-JTAG 这是默认的并且是最直接的烧写 ZedBoard 的方法 , 这只要通过 ZedBoard 工具包的 USB 到 micro-USB 连接线就可以直接完成。 传统 JTAG 板卡上有一个可用的

    2024年02月16日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包