Advertisement
Guest User

Untitled

a guest
May 5th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.11 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # coding=utf-8
  3.  
  4.  
  5. from myhdl import *
  6. from math import *
  7. from ram import *
  8. from myhdl.conversion import *
  9.  
  10. class buf_fifo_int_in(object):
  11.  
  12. def __init__(self,pixel_bits = 24):
  13.  
  14. self.pixel_bits=pixel_bits
  15.  
  16. """HOST PROG"""
  17. self.img_size_x=Signal(intbv(0)[16:])
  18. self.img_size_y=Signal(intbv(0)[16:])
  19. self.sof=Signal(bool(0))
  20.  
  21. """HOST DATA"""
  22. self.iram_wren=Signal(bool(0))
  23. self.iram_wdata=Signal(intbv(0)[pixel_bits:])
  24.  
  25. """FDCT"""
  26. self.fdct_fifo_rd=Signal(bool(0))
  27.  
  28.  
  29.  
  30. class buf_fifo_int_out(object):
  31.  
  32. def __init__(self,pixel_bits = 24):
  33.  
  34. self.pixel_bits=pixel_bits
  35.  
  36. """HOST DATA"""
  37. self.fifo_almost_full=Signal(bool(0))
  38.  
  39. """FDCT"""
  40. self.fdct_fifo_q=Signal(intbv(0)[pixel_bits:])
  41. self.fdct_fifo_hf_full=Signal(bool(0))
  42.  
  43.  
  44. def buf_fifo(in_sig,out_sig,clk,rst,extra_lines,pixel_bits,num_lines,max_line_width):
  45.  
  46.  
  47.  
  48. num_lines = 8 + extra_lines
  49.  
  50. pixel_cnt,line_cnt=[Signal(intbv(0)[16:]) for _ in range(2)]
  51.  
  52. ramq,ramd=[Signal(intbv(0)[pixel_bits:]) for _ in range(2)]
  53. ramenw=Signal(bool(0))
  54. ramwaddr,ramraddr,ramwaddr_d1=[Signal(intbv(0)[ceil(log(max_line_width*num_lines,2)):]) for _ in range(3)]
  55.  
  56. pix_inblk_cnt,pix_inblk_cnt_d1=[Signal(intbv(0)[4:]) for _ in range(2)]
  57. line_inblk_cnt=Signal(intbv(0)[3:])
  58.  
  59. read_block_count,read_block_count_d1,write_block_cnt=[Signal(intbv(0)[13:]) for _ in range(3)]
  60.  
  61. ramaddr_int,raddr_base_line=[Signal(intbv(0)[(16 + log(num_lines,2)):]) for _ in range(2)]
  62. raddr_tmp=Signal(intbv(0)[16:])
  63.  
  64. line_lock,memwr_line_cnt,memrd_line=[Signal(intbv(0)[log(num_lines,2):]) for _ in range(3)]
  65.  
  66. memrd_offs_cnt=Signal(intbv(0)[(log(num_lines,2)+1):])
  67.  
  68. wr_line_idx,rd_line_idx=[Signal(intbv(0)[16:]) for _ in range(2)]
  69.  
  70. image_write_end=Signal(bool(0))
  71.  
  72. sub_ram=RAM(ramq,ramd,ramraddr,ramwaddr_d1,ramenw,clk,log(max_line_width*num_lines,2),pixel_bits)
  73.  
  74.  
  75. """Register ram data input"""
  76. @always_seq(clk.posedge,rst)
  77. def data_reg():
  78. ramd.next=in_sig.iram_wdata
  79. ramenw.next=in_sig.iram_wren
  80.  
  81. """Resolve RAM write address"""
  82. @always_seq(clk.posedge,rst)
  83. def ram_addr_get():
  84. ramwaddr_d1.next=ramwaddr
  85. if in_sig.iram_wren == 1:
  86. if pixel_cnt == in_sig.img_size_x -1:
  87. pixel_cnt.next=0
  88. wr_line_idx.next=wr_line_idx+1
  89. if wr_line_idx == in_sig.img_size_y:
  90. image_write_end.next=1
  91. if memwr_line_cnt == num_lines -1:
  92. memwr_line_cnt.next=0
  93. ramwaddr.next=0
  94. else:
  95. memwr_line_cnt.next=memwr_line_cnt + 1
  96. ramwaddr.next=ramwaddr + 1
  97. else:
  98. pixel_cnt.next = pixel_cnt +1
  99. ramwaddr.next=ramwaddr + 1
  100. if in_sig.sof ==1:
  101.  
  102. pixel_cnt.next=0
  103. ramwaddr.next=0
  104. memwr_line_cnt.next=0
  105. wr_line_idx.next=0
  106. image_write_end.next=0
  107.  
  108. """FIFO half full/almost full flag generation"""
  109. @always_seq(clk.posedge,rst)
  110. def hf_af_flag():
  111.  
  112. if rd_line_idx + 8 <= wr_line_idx:
  113. out_sig.fdct_fifo_hf_full.next=1
  114. else:
  115. out_sig.fdct_fifo_hf_full.next=0
  116.  
  117. out_sig.fifo_almost_full.next=0
  118.  
  119. if wr_line_idx == rd_line_idx + num_lines - 1:
  120. if pixel_cnt >= in_sig.img_size_x -1:
  121. out_sig.fifo_almost_full.next=1
  122. elif wr_line_idx > rd_line_idx + num_lines -1:
  123. out_sig.fifo_almost_full.next=1
  124.  
  125.  
  126. """ memrd_offs_cnt is used for the extra 8 lines to ensure that the block which is read will be in correct position in memory"""
  127.  
  128. """Read side"""
  129. @always_seq(clk.posedge,rst)
  130. def read_side():
  131.  
  132. pix_inblk_cnt_d1.next = pix_inblk_cnt
  133. read_block_count_d1.next = read_block_count
  134.  
  135. if in_sig.fdct_fifo_rd == 1:
  136. if pix_inblk_cnt == 7:
  137. pix_inblk_cnt.next = 0
  138.  
  139. if line_inblk_cnt == 7 :
  140. line_inblk_cnt.next=0
  141.  
  142. if read_block_count == in_sig.img_size_x//num_lines -1:
  143. read_block_count.next=0
  144. rd_line_idx.next = 0
  145. if memrd_offs_cnt + 8 >= num_lines - 1:
  146. memrd_offs_cnt.next = memrd_offs_cnt + 8 - num_lines
  147. else:
  148. memrd_offs_cnt.next = memrd_offs_cnt + 8
  149. else:
  150. read_block_count.next=read_block_count + 1
  151. else:
  152. line_inblk_cnt.next=line_inblk_cnt + 1
  153. else:
  154. pix_inblk_cnt.next = pix_inblk_cnt + 1
  155.  
  156.  
  157. if memrd_offs_cnt + line_inblk_cnt > num_lines -1:
  158.  
  159. memrd_line.next=memrd_offs_cnt + line_inblk_cnt - num_lines
  160. else:
  161. memrd_line.next=memrd_offs_cnt + line_inblk_cnt
  162.  
  163. if in_sig.sof==1:
  164.  
  165. memrd_line.next=0
  166. memrd_offs_cnt.next=0
  167. read_block_count.next=0
  168. pix_inblk_cnt.next=0
  169. pix_inblk_cnt.next=0
  170. line_inblk_cnt.next=0
  171. rd_line_idx.next=0
  172.  
  173. """Generate RAM data output"""
  174. @always_comb
  175. def ram_out():
  176.  
  177. out_sig.fdct_fifo_q.next = ramq
  178. ramraddr.next = ramaddr_int
  179.  
  180. """Resolve RAM read address"""
  181. @always_seq(clk.posedge,rst)
  182. def ram_read_addr():
  183.  
  184.  
  185. raddr_base_line.next = memrd_line *in_sig. img_size_x
  186. raddr_tmp.next =concat(read_block_count_d1,"000") + pix_inblk_cnt_d1
  187.  
  188. ramaddr_int.next = raddr_tmp + raddr_base_line
  189.  
  190. return instances()
  191.  
  192.  
  193. def convert():
  194.  
  195. clk=Signal(bool(0))
  196. rst=ResetSignal(val=1,active=True,async=False)
  197.  
  198. inputs=buf_fifo_int_in()
  199. outputs=buf_fifo_int_out()
  200.  
  201. """
  202. inst=buf_fifo(inputs,outputs,clk,rst,0,24,8,640)
  203. inst.convert(hdl='Verilog')
  204. analyze.simulator='iverilog'
  205. complcache_start_auto_complete)[<64;150;24M
  206. assert inst.analyze_convert() == 0
  207. """
  208.  
  209. toVHDL(buf_fifo,inputs,outputs,clk,rst,0,24,8,640)
  210. analyze.simulator='ghdl'
  211. analyze(buf_fifo,inputs,outputs,clk,rst,0,24,8,640)
  212.  
  213.  
  214. #convert()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement